GitOps实践举例
假设开发人员已经使用Git来管理应用程序的源代码。所有更改(包括应用程序和基础架构层面的更改)都通过Git进行自动化处理,且将Git仓库作为系统状态检测的唯一信源。GitOps控制器将会双向地对比Git中声明的期望状态和实际系统状态,同时也会检测集群中不属于由Git提交引起的更改。
下面让我们来看一下在基于Kubernetes的系统中, GitOps的基本工作流程:
应用代码提交触发CI
每个业务代码仓库中存储的都是开发团队编写的应用源代码用于构建应用程序。对于应用开发而言,开发团队仍然可以像以前一样工作。每当有新的代码提交都会触发一个CI流水线,得到一个构建产物,在容器化部署的场景下,这个产物通常就是一个容器镜像,然后,这个镜像会被推送到容器仓库中去。
向独立的应用配置仓库提交PR
在 Kubernetes 中,所谓的配置,包括描述deployment及其相关变更的manifests(yaml文件),其中包括如何映射外部端口、目录、服务、环境变量和镜像配置选项的定义。总而言之,通过这些配置,它完整描述了应用程序的期望状态。这些所有的配置文件,都将独立于源代码,存放在一个单独的Git仓库中。
GitOps监测配置仓库变更
GitOps agent会实时的监测配置仓库的一切变更,只要监测到有变更发生,便会触发一次部署。配置的变更意味着期望状态的变更,GitOps agent(如ArgoCD或其他类似工具)会对比Git仓库中配置的期望状态与系统的实际状态,这种对比是双向的,如果发现系统中发生了一些Git仓库中没有声明的变更,那么在本次部署中,会丢弃这些变更,回滚到Git仓库中声明的状态。
部署到预发布或生产环境
GitOps 可以处理多个环境或集群。一个常见的模式是首先部署到预发布环境,进行负载测试或集成测试。这是一个额外的可靠性层,确保在生产之前没有部署问题。
测试功能并确认系统状态符合期望
当部署完成后,测试团队可以测试应用程序功能以确保部署成功,并查看集群状态是否与 Git 声明的期望状态相同。上面描述的工作流程是 GitOps 工作的一个范例,可应用于任何云原生环境,以管理基础架构的配置以及软件的部署。
GitOps的落地
支持GitOps范式的CI/CD工具有很多,在此次实践方案中,我们选择了Tekton作为CI工具,完成应用程序的持续集成和持续交付,选择ArgoCD作为GitOps方式的持续部署工具。
架构图如上,在本次实践中,将期望编写一条更为通用的CI Pipeline来适配不同开发语言,不同源码仓库,不同运行环境的应用程序。
在这个CI Pipeline中,我们应该设计完成以下功能:
源代码拉取
配置仓库的创建和初始化
根据开发语言,执行不同的构建流程
将构建结果推送至成品仓库
更新配置仓库
发送结果通知
具体流水线的编写实现各个组织可能有所不同,具体语法规范请参考官方文档:https://tekton.dev/docs/pipelines/
Tekton CI部署
要完成GitOps的落地,我们需要部署Tekton的以下几个组件:
Tekton Pipelines
Tekton Triggers
Tekton Dashboard
所需的 Kubernetes 版本
从 Tekton v0.24.x 版本开始:Kubernetes 版本 1.18 或更高版本
从 Tekton v0.27.x 版本开始:Kubernetes 版本 1.19 或更高版本
从 Tekton v0.30.x 版本开始:Kubernetes 版本 1.20 或更高版本
从 Tekton v0.33.x 版本开始:Kubernetes 版本 1.21 或更高版本
从 Tekton v0.39.x 版本开始:Kubernetes 版本 1.22 或更高版本
从 Tekton v0.41.x 版本开始:Kubernetes 版本 1.23 或更高版本
从 Tekton v0.45.x 版本开始:Kubernetes 版本 1.24 或更高版本
从 Tekton v0.51.x 版本开始:Kubernetes 版本 1.25 或更高版本
部署Tekton Pipelines v0.28.0
先决条件
运行 1.19 或更高版本的Kubernetes 集群。
kubectl。
授予当前用户cluster-admin权限。有关更多信息,请参阅Kubernetes 基于角色的访问控制 (RBAC) 文档。
(可选)如果您需要高可用性用例的支持,请安装Metrics Server 。
安装指定版本的Tekton Pipelines
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/previous/<version_number>/release.yaml
替换<version_number>
为您要安装的编号版本。例如,v0.28.0
由于tekton是基于容器化安装,其镜像位于google镜像仓库,在国内安装时可能拉取镜像超时导致安装失败,可能需要一些特殊方法解决网络问题
监控安装结果
kubectl get pods --namespace tekton-pipelines --watch
当所有组件在READY
列下都显示1/1
时,安装完成。按Ctrl + C停止监控。
此时已经完成了Tekton Pipelines组件的安装。
您可以启用其他 alpha 和 beta 功能、自定义执行参数、配置可用性以及更多选项。有关更多信息,请参阅 附加配置选项。
部署Tekton Triggers v0.18.0
先决条件
运行 1.19 或更高版本的Kubernetes 集群。
拥有kubectl。
已部署Tekton Pipelines
授予当前用户cluster-admin权限。有关更多信息,请参阅Kubernetes 基于角色的访问控制 (RBAC) 文档。
(可选)如果您需要高可用性用例的支持,请安装Metrics Server 。
安装指定版本的Tekton Triggers
使用安装 Tekton Pipelines 的相同用户帐户登录到 Kubernetes 集群,运行以下命令:
kubectl apply --filename \
https://storage.googleapis.com/tekton-releases/triggers/previous/VERSION_NUMBER/release.yaml
kubectl apply --filename \
https://storage.googleapis.com/tekton-releases/triggers/previous/VERSION_NUMBER/interceptors.yaml
替换VERSION_NUMBER
为您要安装的编号版本。例如,v0.18.0.
由于tekton是基于容器化安装,其镜像位于google镜像仓库,在国内安装时可能拉取镜像超时导致安装失败,可能需要一些特殊方法解决网络问题
监控安装结果
kubectl get pods --namespace tekton-pipelines --watch
当所有组件在READY
列下都显示1/1
时,安装完成。按Ctrl + C停止监控。
此时已经完成了Tekton Triggers组件的安装。
定制选项
您可以通过更改安装文件config/feature-flags-triggers.yaml
中的某些值来自定义触发器控制器的行为。
启用阿尔法功能。
enable-api-fields:
设置的值为"alpha"
,默认值为"stable"
。该标志仅适用于 v1beta1 API 版本。排除标签。将
labels-exclusion-pattern:
字段设置为正则表达式模式。与此模式匹配的标签将被排除在添加到 EventListener 创建的资源之外。默认情况下,此字段为空,因此添加到 EventListener 的所有标签都会向下传播。
部署Tekton Dashboard v0.27.0
先决条件
运行 1.19 或更高版本的Kubernetes 集群。
拥有kubectl。
已部署Tekton Pipelines(必须)和Tekton Triggers(可选)
授予当前用户cluster-admin权限。有关更多信息,请参阅Kubernetes 基于角色的访问控制 (RBAC) 文档。
有关Tekton Dashboard适配的triggers和pipelines版本,请参阅发行说明:https://github.com/tektoncd/dashboard/blob/main/releases.md
安装指定版本的Tekton Dashboard
运行以下命令安装 Tekton Dashboard:
https://storage.googleapis.com/tekton-releases/dashboard/previous/VERSION_NUMBER/release.yaml
替换VERSION_NUMBER
为您要安装的编号版本。例如,v0.27.0.
由于tekton是基于容器化安装,其镜像位于google镜像仓库,在国内安装时可能拉取镜像超时导致安装失败,可能需要一些特殊方法解决网络问题
监控安装结果
kubectl get pods --namespace tekton-pipelines --watch
当所有组件在READY
列下都显示1/1
时,安装完成。按Ctrl + C停止监控。
此时已在 Kubernetes 集群上成功安装 Tekton Dashboard。
通过SolopaceGem组网访问仪表板
默认情况下,Dashboard 不会暴露在集群外部,可以通过任何一种Kubernetes的服务暴露方式,将Dashboard的服务端口对外暴露提供访问。
下面重点描述了一种用于在任意网络访问内网仪表板 UI 的解决方案
如果您的Kubernetes集群不提供load blancer类型的Service公网访问能力
如果您的Kubernetes集群不能通过Ingress将服务对公网提供访问入口
您需要在任何可以访问互联网的地方访问到您的Tekton Dashboard
通过SolopaceGem完成Kubernetes Work节点与用户端的组网
任选一台Kubernetes Work节点安装SolopaceGem
Kubernetes本身具有容器运行环境,因此我们选择最简单方便的Docker来安装SolopaceGem
执行以下命令启动SolopaceGem Docker客户端
sudo docker run -d --name=SolopaceGem -v /var/lib:/var/lib -v /dev/net/tun:/dev/net/tun --network=host --restart=always --cap-add=NET_ADMIN --cap-add=NET_RAW doaction/solopacegem:latest
获取SolopaceGem组网链接
sudo docker exec SolopaceGem solopacegem status
复制组网链接地址至浏览器打开
创建组网并加入
成功加入组网
在客户端上安装SolopaceGem
下载SolopaceGem客户端
在官网下载适用于您设备系统的客户端。
官网:https://solopace.doaction.pro/
下载完成后,按照提示进行安装即可。
安装后登录/注册(未注册用户将会自动注册)
此处使用之前安装Docker客户端是注册的账号登录
客户端加入组网
登录后选择已有网络ID,将会自动列出之前创建的网络
选择网络ID并加入即可
连接网络
当在在线设备列表中看到当前客户端与Kubernetes Docker客户端都处于在线状态时,说明组网成功
通过NodePort类型的Service暴露Dashboard
通过SolopaceGem组网IP访问Tekton Dashboard仪表盘
此时在任意一个加入该组网的客户端上,通过浏览器访问Kubernetes Docker客户端的组网IP加NodePort端口的形式即可访问Tekton Dashboard
ArgoCD部署
了解基础知识
在有效使用Argo CD之前,有必要了解该平台构建的底层技术。还有必要了解向您提供的功能以及如何使用它们。以下部分提供了一些有用的链接来建立这种理解。
学习基础知识
浏览在线 Docker 和 Kubernetes 教程:
根据您计划如何模板化您的应用程序:
如果您要与 CI 工具集成:
先决条件
安装kubectl命令行工具。
有一个kubeconfig文件(默认位置是
~/.kube/config
)。已安装kubernetes核心组件coredns
安装Argo CD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
这将创建一个新的命名空间 argocd
,Argo CD 服务和应用程序资源将部署在其中。
下载Argo CD CLI
从https://github.com/argoproj/argo-cd/releases/latest下载最新的 Argo CD 版本。更详细的安装说明可以通过CLI 安装文档找到。
还适用于 Mac、Linux 和 WSL Homebrew:
brew install argocd
访问Argo CD API服务器
默认情况下,ArgoCD不会暴露在集群外部,可以通过任何一种Kubernetes的服务暴露方式,将Dashboard的服务端口对外暴露提供访问。
下面重点描述了一种用于在任意网络访问内网ArgoCD服务的解决方案
如果您的Kubernetes集群不提供load blancer类型的Service公网访问能力
如果您的Kubernetes集群不能通过Ingress将服务对公网提供访问入口
您需要在任何可以访问互联网的地方访问到您的Tekton Dashboard
转发端口
Kubectl 端口转发用于连接到 API 服务器,而无需公开服务。
kubectl port-forward svc/argocd-server -n argocd 8080:443
然后可以使用 https://localhost:8080 访问 API 服务器
通过SolopaceGem组网访问
此时我们希望任意外部网络访问我们的ArgoCD API服务器,则同样可以通过之前访问Tekton Dashboard的组网方式,通过SolopaceGem组网来进行访问
使用 CLI 登录
admin帐户的初始密码是自动生成的,可以通过一下命令获取初始密码和修改初始密码
#获取密码
kubectl get secrets -n argocd argocd-initial-admin-secret -o yaml
#修改密码
argocd admin initial-password -n argocd
更改密码后,应该从 Argo CD 命名空间中删除argocd-initial-admin-secret
。该秘密除了以明文形式存储最初生成的密码外没有其他用途,并且可以随时安全地删除。如果必须重新生成新的管理员密码,Argo CD 将根据需要重新创建它。
使用上面的用户名密码和Argo CD 所在集群Work节点的组网ip加端口进行登录(可以将ArgoCD CLI安装在任何地方通过SolopaceGem与k8s建立组网即可)
argocd login <SolopaceGem组网IP>:<转发端口设置的端口>
通过 CLI 创建应用程序
首先,我们需要在本地k8s集群运行以下命令将当前命名空间设置为 argocd:
kubectl config set-context --current --namespace=argocd
使用以下命令创建一个官方的示例应用程序:
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
通过 UI 创建应用程序
打开浏览器访问 Argo CD 外部 UI,通过在浏览器中访问SolopaceGem组网IP/暴露端口,并使用步骤 4 中设置的凭据。
登录后,点击+新应用按钮,如下图:
为您的应用程序命名guestbook
,使用项目default
,并将同步策略保留为Manual
:
将仓库https://github.com/argoproj/argocd-example-apps.git连接到 Argo CD,将修订版保留为HEAD
,并将路径设置为guestbook
:
对于Destination,将集群 URL 设置为https://kubernetes.default.svc
(或in-cluster
集群名称),将命名空间设置为default
:
填写完以上信息后,点击UI顶部的Createguestbook
即可创建应用程序