本文和所有涉及到的图片、yaml都已经上传到我的github上了:https://github.com/goofy-z/k8s-learning/tree/master/Tekton-Argocd

什么是tekton

Tekton 是一个功能强大且灵活的Kubernetes 原生开源框架,用于云上持续集成和交付(CI/CD)系统,通过Operator的方式集成到k8集群中,并以容器作为驱动,完成流水线模版定义的任务,社区也提供了很多任务模版来方便使用。

安装tekton

kubectl apply -f https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.26.0/release.yaml

总共部署了两个deployment,默认是在namespacetekton-pipelines

kubectl get deploy -n tekton-pipelines
NAME READY UP-TO-DATE AVAILABLE AGE
tekton-dashboard 1/1 1 1 88d // 这个是dashboard
tekton-pipelines-controller 1/1 1 1 69d
tekton-pipelines-webhook 1/1 1 1 88d

安装Dashboard

kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/tekton-dashboard-release.yaml

默认dashboard服务是只能通过ClusterIP访问,我们可以通过修改它的svc的类型为NodePort或者直接在当前节点使用代理访问kubectl port-forward svc/tekton-dashboard -n tekton-pipelines 37033:9097

Tekton提供的CRD

  • Task: 任务模版,你可以在里面定义相应的steps来表示需要执行的步骤,每个step代表一个pod。
  • TaskRun:任务模版的执行实例,通过传入任务模版定义的参数来创建。
  • Pipeline:流水线模版,包含一系列任务并且定义各个任务之间的先后顺序。
  • PipelineRun:流水线模版实例,关联到流水线并传入所有的任务参数来执行

安装argocd

创建argocd

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

执行完之后我们能看到在argocd Namespace下创建了4个deployment

kubectl get deployment -n argocd
NAME READY UP-TO-DATE AVAILABLE AGE
argocd-dex-server 1/1 1 1 14m
argocd-redis 1/1 1 1 14m
argocd-repo-server 1/1 1 1 14m
argocd-server 1/1 1 1 14m
  • argocd-dex-server: 与SSO有关

  • argocd-redis:这就是redis服务

  • argocd-repo-server:维护保存应用程序清单的Git存储库的本地缓存,并负责生成和返回Kubernetes清单

  • argocd-server: API服务器是gRPC/REST服务器,它公开Web UI、CLI和CI/CD系统所使用的API。

此外还有一个sts资源

kubectl get sts -n argocd
NAME READY AGE
argocd-application-controller 1/1 14m
  • argocd-application-controller: 一个k8s控制器,监控运行的应用,并将当前的活动状态与所需的目标状态(在repo中指定)进行比较。

然后是创建5个svc

kubectl get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP
argocd-dex-server ClusterIP 172.31.104.178 <none>
argocd-metrics ClusterIP 172.31.130.239 <none>
argocd-redis ClusterIP 172.31.81.161 <none>
argocd-repo-server ClusterIP 172.31.61.26 <none>
argocd-server NodePort 172.31.93.217 <none>
argocd-server-metrics ClusterIP 172.31.154.210 <none>

注意:argocd-server被我修改成了NodePort的形式便于我通过UI界面访问,暴露了http和https的端口

安装客户端

curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
chmod +x /usr/local/bin/argocd

连接argocd server

访问argocd-server有两种方式,一个是通过UI来登录,一种通过客户端,但首先还是得获取登录的密码,账号是admin.

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
VntlGg8mCy1chAzE // 这就是密码

使用客户端登录:

argocd login 172.31.93.217 // 在集群内部可以用ClusterIP
WARNING: server certificate had error: x509: cannot validate certificate for 172.31.93.217 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password:

创建App

  1. 配置仓库(repo)

    argocd作为GitOps解决方案,本身依赖一个存储应用程序声明文件的Git仓库,同步集群中相关资源状态为Git仓库中声明文件的期望状态。

    创建一个repo对象需要能够真正能访问该repo,并且具有权限,因为argocd会主动去访问该git的API从而获取对应的目录结构、分支等信息,我们通过创建带ssh私钥的Secret的来或得访问权限。

    argocd repo add git@github.com:DaoCloud/Atr-api.git --ssh-private-key-path /root/.ssh/id_rsa

    查看repo是否创建成功

    argocd repo list
    TYPE NAME REPO INSECURE OCI LFS CREDS STATUS MESSAGE
    git git@github.com:DaoCloud/Atr-api.git false false false false Successful
  2. 创建APP

    还是通过客户端的方式来创建

    argocd app create guestbook --repo git_url --path deploy --dest-server https://kubernetes.default.svc --dest-namespace default --revision branch

    参数解释:

    • create后的第一个位置参数代表app的名称
    • repo:该应用绑定的配置仓库
    • path:监听的声明文件在配置仓库的路径
    • dest-server:部署的目标集群,https://kubernetes.default.svc
    • dest-namespace:部署的目标集群NameSpace
  3. 同步app到集群

    argocd app sync guestbook
    TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
    2021-10-22T18:20:35+08:00 apps Deployment default kaifang-ui Synced Healthy
    2021-10-22T18:20:35+08:00 apps Deployment default kaifang-ui Synced Healthy deployment.apps/kaifang-ui unchanged Name: guestbook
    Project: default
    Server: https://kubernetes.default.svc
    Namespace: xxxxx
    URL: https://172.31.93.217/applications/guestbook
    Repo: xxxx.git
    Target: develop-goofy5
    Path: deploy
    SyncWindow: Sync Allowed
    Sync Policy: <none>
    Sync Status: Synced to develop-goofy5 (c8e8289)
    Health Status: Healthy Operation: Sync
    Sync Revision: c8e828979745b3589515196ec469bdbca271da29
    Phase: Succeeded
    Start: 2021-10-22 18:20:34 +0800 CST
    Finished: 2021-10-22 18:20:35 +0800 CST
    Duration: 1s
    Message: successfully synced (all tasks run) GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
    apps Deployment kongtianbei kaifang-ui Synced Healthy deployment.apps/kaifang-ui unchanged

集群中查看效果

添加集群

argocd添加集群需要在部署了argocd的集群能够访问到待添加集群,可以在kubeconfig文件中添加目标集群的集群证书和用户证书等信息,下面命令实际就是去创建一套该sa并绑定到admin的ClusterRole角色

argocd cluster add zone_41 // zone_41 位目标集群的context

开始构建CI/CD流水线

由于一些任务依赖与Argocd创建的应用的配置,需要提前建立好Argocd的应用,具体方式参考上面。

流水线共有以下几个任务:

  • Git Clone:clone仓库,提供工作区用于镜像构建。
  • Build Image:借助容器中构建镜像技术,如kaniko来构建镜像,并push到指定仓库。
  • Change Config:修改应用的部署声明文件,这里替换deployment声明文件的Image为新的Image。
  • Git Push Config:提交应用的声明文件到argocd监听的git仓库。
  • Deploy:主动触发Argocd的同步,从而实现镜像替换的部署。

创建Task

接下来会介绍对每一个任务的功能实现细节,在此之前还需要介绍一个tekton的资源对象workspaces,在CI过程中多个任务share同一个工作区,所以依赖一个能够在多个任务(也就是pod)间共享的存储,而workspaces资源对象正是为每一个Task抽象出一个文件系统,但需要在TaskRun中指定其实现方式:包括ConfigmapSecretPVC;如果不需要在多个任务间共享则可以使用pvemptyDir的形式。

Git Clone

这一步是将目标代码仓库代码拉取到工作区,共包含下述几个任务参数:

  • CLONE_URL: git仓库地址
  • SUBDIR:git clone之后的项目名
  • BRANCH:git clone的分支

下面是从tekton hub上找到的git-cli模版,做了一些修改:git-cli.yaml

同时依赖至少两个workspaces

  • source:用于存放代码的工作区,使用pvc实现存储。
  • ssh-directory:一个保存了ssh私钥known_hostsSecret,使其能够有目标git仓库的权限。

Build Image

任务的主要功能是构建镜像并push到指定的镜像仓库,任务参数如下:

  • IMAGE:构建之后的目标镜像
  • CONTEXT:工作区的目录,这里对应上一步的SUBDIR
  • DOCKERFILE: Dockerfile文件路径

下面同样是从tekton hub上找到的git-cli模版,做了一些修改:kaniko.yaml

同时依赖至少两个workspaces

  • source:用于存放代码的工作区,使用pvc实现存储。
  • dockerconfig:一个保存了docker的auth配置信息的configmap,使其能够有push镜像仓库的权限。

Change Config

在镜像build完成且推送镜像仓库成功后,需要取更新应用声明文件里的镜像地址,目前是借助yq工具修改指定名称文件的deployment资源定义文件里镜像,需要自己写yq的表达式。

  • CONTEXT:工作区需要更改的git项目目录,这个git必须是argocd监听的项目
  • CONFIG_FILE:deployment资源定义文件名,必须是位于argocd设置的path
  • EXPRESSION:yq表达式,例如在pipelineRun传入(.spec.template.spec.containers.[]|select(.name == \"api\").image)|=,这个表达式的意思就是找到名称为api容器并将image字段替换为=后的新镜像,在后面定义pipeline时,我们时直接将pipelineRun传入的IMAGEEXPRESSION参数组合成:$(params.EXPRESSION)\"$(params.IMAGE)\"传入到该任务,这样完整的yq表达式为(.spec.template.spec.containers.[]|select(.name == \"api\").image)|="新构建的镜像"

只依赖source这一个workspace。

Git Push Config

这一步就是提交应用声明文件的更改。

  • SUBDIR:argocd监听git项目目录名
  • BRANCH:argocd监听git项目的分支

同样是从tekton hub上找到的argocd部署任务模版:git-push-config.yaml

Git Clone一样依赖两个workspacessroucessh-directory

Deploy

借助argocd的客户端来执行同步过程,

  • APP_NAME:Argocd的APP名称
  • BRANCH:Argocd监听项目的分支

同样是从tekton hub上找到的argocd部署任务模版:deploy-argocd.yaml

在这个任务中需要制定argocd-server的服务地址,还需要能够操作argocd的用户名和密码,这些可以不作为变量,直接hardcode在模版中

创建Pipeline

ci-cd-pipeline.yaml

创建TaskRun(示例)

run.yaml

Tekton+Argocd实现自动化流水线的更多相关文章

  1. 使用GitHub+Travis-CI+Docker打造自动化流水线

    全文采用的是阿里云的ESC服务器,系统是CentOS 7 示例项目是NodeJS编写,本文主要是Docker的使用,在文章前2/3都是Docker命令介绍,最后我们会完成一个自动化的示例. 准备 注册 ...

  2. 「持续集成实践系列 」Jenkins 2.x 构建CI自动化流水线常见技巧

    在上一篇文章中,我们介绍了Jenkins 2.x实现流水线的两种语法,以及在实际工作中该如何选择脚本式语法或声明式语法.原文可查阅:「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要 ...

  3. [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用

    ​使用Docker容器方案可以快速安全地将项目部署到客户的服务器上,作为公司项目,需要解决两个问题: 1. 需要搭建一个私有的Docker仓库,以便安全的存储镜像 2. 需要一套自动化发布方案,实现代 ...

  4. 蓝鲸DevOps深度解析系列(2):蓝盾流水线初体验

    关注嘉为科技,获取运维新知 前面一篇文章<蓝鲸DevOps深度解析系列(1):蓝盾平台总览>,我们总览了蓝鲸DevOps平台的背景.应用场景.特点和能力: ​ 接下来我们继续解析蓝盾平台的 ...

  5. 【nodejs原理&源码赏析(9)】用node-ssh实现轻量级自动化部署

    目录 一. 需求描述 二. 预备知识 IP+端口访问 域名访问 三. Nodejs应用的手动部署 四. 基于nodejs的自动部署 4.1 package.json中的scripts 4.2 自动化发 ...

  6. 【nodejs原理&源码赏析(9)】用node-ssh实现轻量级自动化部署

    [摘要] node脚本实现轻量级自动化部署 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 需求描述 前端工程出包后实现简易的自动化部署. 二. ...

  7. Jenkins 流水线远程部署 .NET Core/Framework 到 IIS

    目录 Windows 安装 Git WebDeploy Windows 从节点 .NET Core 处理 IIS 处理项目 Jenkinsfile .NET Framework 安装环境 .NET F ...

  8. Kubernetes DevOps: Tekton

    Tekton 是一款功能非常强大而灵活的 CI/CD 开源的云原生框架.Tekton 的前身是 Knative 项目的 build-pipeline 项目,这个项目是为了给 build 模块增加 pi ...

  9. Pipeline流水线设计的最佳实践

    谈到到DevOps,持续交付流水线是绕不开的一个话题,相对于其他实践,通过流水线来实现快速高质量的交付价值是相对能快速见效的,特别对于开发测试人员,能够获得实实在在的收益.很多文章介绍流水线,不管是j ...

随机推荐

  1. 手把手教你 Docker Compose的安装和使用

    一.Docker Compose是什么? Docker Compose是一个工具,用于定义和运行多容器应用程序的工具: Docker Compose通过yml文件定义多容器的docker应用: Doc ...

  2. Spring系列之集成MongoDB的2种方法

    MongoDB是最流行的NoSQL数据库,SpringBoot是使用Spring的最佳实践.今天带大家讲一讲SpringBoot集成MongoDB的两种方式,MongoDB的安装自行去官网查询,本地开 ...

  3. wrap()包裹被选元素的内容

    <!doctype html><html><head><meta charset="utf-8"><title>修改代码 ...

  4. 【第十一篇】- Git Gitee之Spring Cloud直播商城 b2b2c电子商务技术总结

    Git Gitee 大家都知道国内访问 Github 速度比较慢,很影响我们的使用. 如果你希望体验到 Git 飞一般的速度,可以使用国内的 Git 托管服务--Gitee(gitee.com). G ...

  5. 逐条更新数据 sql

    declare @tid int        declare @fid int declare @i int declare @j int set @j=(select count(*) from ...

  6. springboot整合jsp报错

    今天在学springboot整合jsp时遇到了一个问题,虽然jsp不被spring官方推荐使用,但抱着学习的心态还是想解决一下这个问题.在写好了需要pom文件之后,访问网站得到了500的错误提示,后台 ...

  7. django错误处理

    1.django.db.utils.OperationalError: no such table 意思:没有这个app应用对应的数据表的,可以用 python manage.py makemigra ...

  8. P3273-[SCOI2011]棘手的操作【线段树,并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/P3273 题目大意 \(n\)个点有权值,要求支持操作 连接两个点 单点加权 联通块加权 全图加权 单点询问 联通块 ...

  9. ❤️Python接口自动化,一文告诉你连接各大【数据库】建议收藏❤️

    @ 目录 前言 常见数据库 Mysql Oracle sql-server PostgreSQL MongoDB Redis 前言 相信很多小伙伴在使用python进行自动化测试的时候,都会涉及到数据 ...

  10. Selenium自动化结合Mysql数据项目实战操作

    前言 web自动化结合Mysql做一些实战操作,今天实战的场景是通过读取web页面字段名与数据库相应的表中的字段名进行对比 - 注:商城是自己搭建在本地,小伙伴需要源码请私聊 解决思路 第一步:获取w ...