栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 前沿技术 > 云计算

云原生CI/CD框架Tekton国内部署方式

云计算 更新时间:发布时间: 百科书网 趣学号



Tekton 是一款功能非常强大而灵活的 CI/CD 开源的云原生框架。致力于提供全功能、标准化的云原生 CI/CD 解决方案。【本文主要是通过流水线自动化的将tekton镜像同步到腾讯云仓库,并部署tekton】

应用镜像

阿里云镜像仓库居然有限制...这次转到腾讯云镜像仓库了;ccr.ccs.tencentyun.com/tektons/dashboard



Pipeline

借助GitHub Actions:

    同步镜像并生成镜像映射文件(json): 收集镜像映射文件为制品;
  1.  This is a basic workflow to help you get started with Actions  
  2. name: Get Tekton Images env: 
  3.   VERSION: v0.29.0  
  4. on:   push: 
  5.     paths:       - '.github/workflows/tekton.yaml' 
  6.       - 'tekton/**'  
  7. jobs:   build: 
  8.     runs-on: ubuntu-18.04     steps: 
  9.     - uses: actions/checkout@v2     - name: build 
  10.       run: |        
  11.         curl https://storage.googleapis.com/tekton-releases/pipeline/previous/${{ env.VERSION }}/release.yaml -o release.yaml         grep  -v "#" release.yaml | grep -v "^$"  > release1.yaml  ; sed -i 's/---/###/g' release1.yaml 
  12.         python3  tekton/get_tekton_images.py ${{ secrets.DOCKER_USER}} ${{ secrets.DOCKER_PASSWD}}     - uses: actions/upload-artifact@v2 
  13.       with:          name: ${{ env.VERSION }}-tekton-images 
  14.         path: tekton_images.json 



 

部署文件解析

1.下载release部署yaml;

2.解析Deployments对象中的images;

a.tekton-pipelines-controller

b.tekton-pipelines-webhook

c.tekton-dashboard(最新tag)

  1. gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/controller:v0.29.0@sha256:72f79471f06d096cc53e51385017c9f0f7edbc87379bf415f99d4bd11cf7bc2b gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/kubeconfigwriter:v0.29.0@sha256:6d058f2203b9ab66f538cb586c7dc3b7cc31ae958a4135dd99e51799f24b06c9 
  2. gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.29.0@sha256:c0b0ed1cd81090ce8eecf60b936e9345089d9dfdb6ebdd2fd7b4a0341ef4f2b9 gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/entrypoint:v0.29.0@sha256:66958b78766741c25e31954f47bc9fd53eaa28263506b262bf2cc6df04f18561 
  3. gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/nop:v0.29.0@sha256:6a037d5ba27d9c6be32a9038bfe676fb67d2e4145b4f53e9c61fb3e69f06e816 gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/imagedigestexporter:v0.29.0@sha256:e38dd0d32253fce5aaf1e501c0bc71facc3720564b7e97055921cc5390d612e0 
  4. gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/pullrequest-init:v0.29.0@sha256:d28202fb8b33a1d4c05f261ef8dcbcdcf3b469887d4dad256ce91f73c917420e gcr.io/google.com/cloudsdktool/cloud-sdk@sha256:27b2c22bf259d9bc1a291e99c63791ba0c27a04d2db0a43241ba0f1f20f4067f 
  5. gcr.io/distroless/base@sha256:aa4fd987555ea10e1a4ec8765da8158b5ffdfef1e72da512c7ede509bc9966c4 mcr.microsoft.com/powershell:nanoserver@sha256:b6d5ff841b78bdf2dfed7550000fd4f3437385b8fa686ec0f010be24777654d6 
  6. gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/webhook:v0.29.0@sha256:46d5b90a7f4e9996351ad893a26bcbd27216676ad4d5316088ce351fb2c2c3dd 

用Python编写一个数据解析脚本:

  1. import yaml import json 
  2. import sys import os 
  3.  class Tekton : 
  4.     def __init__(self, file_name, registry_user, registry_passwd):         self.yaml_file = file_name 
  5.         self.arg_imgs = ["gcr.io/tekton-releases/github.com/tektoncd/dashboard/cmd/dashboard@sha256:95f71a2568ced67ec370b5360f88bec3280601908cac9e62dfbb801114480437"]         self.split_str = "###" 
  6.         self.deployments = ["tekton-pipelines-controller", "tekton-pipelines-webhook"]         self.kind_type = "Deployment" 
  7.         self.target_registry = "ccr.ccs.tencentyun.com/tektons/"         self.repos = [  "controller", "kubeconfigwriter", "git-init", 
  8.                         "entrypoint","nop","imagedigestexporter",                          "pullrequest-init", "cloud-sdk", "base", "powershell", "webhook"] 
  9.         self.result = []         self.registry_user = registry_user 
  10.         self.registry_passwd = registry_passwd  
  11.     def load_yaml(self, data):         content = yaml.load(data) 
  12.         return content  
  13.     def load_json(self, data):         content = json.loads(data) 
  14.         return content  
  15.     def get_images(self):         f = open(self.yaml_file, 'r').read() 
  16.         for i in f.split("###")[:-1]:             try: 
  17.                 content = self.load_yaml(i.replace("###", ""))                 if content["kind"] == self.kind_type: 
  18.                     deploy_name = content["metadata"]["name"]                     # 获取image 
  19.                     if deploy_name in self.deployments:                         img = content["spec"]["template"]["spec"]["containers"][0]["image"] 
  20.                         self.arg_imgs.append(img)                     # 获取参数中的images 
  21.                     if deploy_name == "tekton-pipelines-controller":                         arg_img =  content["spec"]["template"]["spec"]["containers"][0]["args"] 
  22.                         for a in arg_img:                             if not a.startswith("-"): 
  23.                                 self.arg_imgs.append(a)             except Exception as e: 
  24.                 print(e)         return self.arg_imgs 
  25.      def save_json_file(self, data, file_name): 
  26.         for i in self.arg_imgs:             self.result.append({ 
  27.                 "s_image": i,                 "t_image": self.target_registry + i.split("/")[-1].split("@")[0] 
  28.                 })         newdata = json.dumps(self.result, indent=4) 
  29.         a=open(file_name, 'w')         a.write(newdata) 
  30.         a.close()  
  31.     def sync_images(self):         f = open("tekton_images.json", 'r').read() 
  32.         content = self.load_json(f)         docker_login_cmd = "docker login -u {0} -p {1} {2}".format( 
  33.             self.registry_user,             self.registry_passwd, 
  34.             self.target_registry.split("/")[0])         os.system(docker_login_cmd) 
  35.         for item in content:             print("[GetImages] {}".format(item)) 
  36.             docker_pull_cmd = "docker pull {0}".format(item["s_image"])             docker_tag_cmd = "docker tag {0} {1}".format(item["s_image"], item["t_image"]) 
  37.             docker_push_cmd = "docker push {0}".format(item["t_image"])             os.system(docker_pull_cmd + "&&" + docker_tag_cmd + "&&" + docker_push_cmd ) 
  38.             print("[GetImagesDone] {}".format(item))          
  39. if __name__ == '__main__':     tekton = Tekton("release1.yaml", sys.argv[1], sys.argv[2]) 
  40.     images = tekton.get_images()     tekton.save_json_file(images, "tekton_images.json") 
  41.     tekton.sync_images() 

镜像映射文件

s_image 原始镜像名称, t_image 目标镜像名称; 这里使用腾讯云的镜像仓库;

  1. [     { 
  2.         "s_image": "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/controller:v0.29.0@sha256:72f79471f06d096cc53e51385017c9f0f7edbc87379bf415f99d4bd11cf7bc2b",         "t_image": "ccr.ccs.tencentyun.com/tektons/controller:v0.29.0" 
  3.     },     { 
  4.         "s_image": "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/kubeconfigwriter:v0.29.0@sha256:6d058f2203b9ab66f538cb586c7dc3b7cc31ae958a4135dd99e51799f24b06c9",         "t_image": "ccr.ccs.tencentyun.com/tektons/kubeconfigwriter:v0.29.0" 
  5.     },     { 
  6.         "s_image": "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.29.0@sha256:c0b0ed1cd81090ce8eecf60b936e9345089d9dfdb6ebdd2fd7b4a0341ef4f2b9",         "t_image": "ccr.ccs.tencentyun.com/tektons/git-init:v0.29.0" 
  7.     },     { 
  8.         "s_image": "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/entrypoint:v0.29.0@sha256:66958b78766741c25e31954f47bc9fd53eaa28263506b262bf2cc6df04f18561",         "t_image": "ccr.ccs.tencentyun.com/tektons/entrypoint:v0.29.0" 
  9.     },     { 
  10.         "s_image": "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/nop:v0.29.0@sha256:6a037d5ba27d9c6be32a9038bfe676fb67d2e4145b4f53e9c61fb3e69f06e816",         "t_image": "ccr.ccs.tencentyun.com/tektons/nop:v0.29.0" 
  11.     },     { 
  12.         "s_image": "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/imagedigestexporter:v0.29.0@sha256:e38dd0d32253fce5aaf1e501c0bc71facc3720564b7e97055921cc5390d612e0",         "t_image": "ccr.ccs.tencentyun.com/tektons/imagedigestexporter:v0.29.0" 
  13.     },     { 
  14.         "s_image": "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/pullrequest-init:v0.29.0@sha256:d28202fb8b33a1d4c05f261ef8dcbcdcf3b469887d4dad256ce91f73c917420e",         "t_image": "ccr.ccs.tencentyun.com/tektons/pullrequest-init:v0.29.0" 
  15.     },     { 
  16.         "s_image": "gcr.io/google.com/cloudsdktool/cloud-sdk@sha256:27b2c22bf259d9bc1a291e99c63791ba0c27a04d2db0a43241ba0f1f20f4067f",         "t_image": "ccr.ccs.tencentyun.com/tektons/cloud-sdk" 
  17.     },     { 
  18.         "s_image": "gcr.io/distroless/base@sha256:aa4fd987555ea10e1a4ec8765da8158b5ffdfef1e72da512c7ede509bc9966c4",         "t_image": "ccr.ccs.tencentyun.com/tektons/base" 
  19.     },     { 
  20.         "s_image": "mcr.microsoft.com/powershell:nanoserver@sha256:b6d5ff841b78bdf2dfed7550000fd4f3437385b8fa686ec0f010be24777654d6",         "t_image": "ccr.ccs.tencentyun.com/tektons/powershell:nanoserver" 
  21.     },     { 
  22.         "s_image": "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/webhook:v0.29.0@sha256:46d5b90a7f4e9996351ad893a26bcbd27216676ad4d5316088ce351fb2c2c3dd",         "t_image": "ccr.ccs.tencentyun.com/tektons/webhook:v0.29.0" 
  23.     },     { 
  24.     "s_image": "gcr.io/tekton-releases/github.com/tektoncd/dashboard/cmd/dashboard@sha256:95f71a2568ced67ec370b5360f88bec3280601908cac9e62dfbb801114480437",     "t_image": "ccr.ccs.tencentyun.com/tektons/dashboard" 
  25.          } 

镜像映射文件可以在GitHubActions页面下载:



下载镜像脚本

解析上面生成的镜像文件,docker pull下载对应的镜像到本地;

  1. import json  import os 
  2.  class Tekton: 
  3.     def __init__(self):         self.json_file = "tekton_images.json" 
  4.         self.target_registry = "ccr.ccs.tencentyun.com/tektons/"         # self.registry_user = registry_user 
  5.         # self.registry_passwd = registry_passwd  
  6.     def load_json(self, data):         content = json.loads(data) 
  7.         return content  
  8.     def down_images(self):         f = open(self.json_file, 'r').read() 
  9.         content = self.load_json(f)  
  10.         # docker_login_cmd = "docker login -u {0} -p {1} {2}".format(         #             self.registry_user, 
  11.         #             self.registry_passwd,         #             self.target_registry.split("/")[0]) 
  12.         for item in content:             print("[GetImages] {}".format(item["t_image"])) 
  13.             docker_pull_cmd = "docker pull {0}".format(item["t_image"])             # docker_tag_cmd = "docker tag {0} {1}".format(item["t_image"], item["s_image"].split("@")[0]) 
  14.             os.system(docker_pull_cmd + "&&" + docker_tag_cmd )             print("[GetImagesDone] {}".format(item)) 
  15.  if __name__ == '__main__': 
  16.     t = Tekton().down_images() 
部署Tekton

替换部署文件中的镜像:

    手动更新release.yaml中的镜像;然后kubectl apply release.yaml 部署(后续有时间再优化脚本,实现自动更新release.yaml) 手动更新tekton-dashboard-release.yaml中的镜像;然后部署;
  1. [root@master ~]# kubectl -n tekton-pipelines get pod NAME                                          READY   STATUS    RESTARTS   AGE 
  2. tekton-dashboard-5c4b89d9-2z8g7               1/1     Running   0          21m tekton-pipelines-controller-b96f647bb-gff69   1/1     Running   0          13h 
  3. tekton-pipelines-webhook-76bc9c97b9-cd2m4     1/1     Running   0          13h 

编写一个Ingress来暴露tekton dashboard:

  1. apiVersion: extensions/v1beta1 kind: Ingress 
  2. metadata:   name: tekton-service 
  3.   namespace: tekton-pipelines   annotations: 
  4.     kubernetes.io/ingress.class: nginx     nginx.ingress.kubernetes.io/proxy-body-size: 256m 
  5. spec:   rules: 
  6.   - host: tekton.idevops.site     http: 
  7.      paths:      - path: / 
  8.        backend:           serviceName: tekton-dashboard 
  9.           servicePort: 9097 

访问UI页面:



编写Pipeline
  1. apiVersion: tekton.dev/v1beta1 kind: Task 
  2. metadata:   name: tektoncd-task 
  3. spec:   resources: 
  4.     inputs:     - name: repo 
  5.       type: git   steps: 
  6.   - name: run-test     image: maven:3-jdk-8 
  7.     workingDir: /workspace/repo     command: ["mvn"] 
  8.     args: ["clean", "package"] --- 
  9. apiVersion: tekton.dev/v1alpha1 kind: PipelineResource 
  10. metadata:   name: tektoncd-resource 
  11. spec:   type: git 
  12.   params:     - name: url 
  13.       value: http://192.168.1.200/devops/devops-maven-service.git     - name: revision 
  14.       value: master --- 
  15. apiVersion: tekton.dev/v1beta1 kind: TaskRun 
  16. metadata:   name: cdpipeline 
  17. spec:   taskRef: 
  18.     name: tektoncd-task   resources: 
  19.     inputs:     - name: repo 
  20.       resourceRef:         name: tektoncd-resource 

 

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/797151.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号