介绍
Argo CD 是一个为 Kubernetes 而生的,遵循声明式 GitOps 理念的持续部署(CD)工具,它的配置和使用非常简单,并且自带一个简单易用的 Dashboard 页面,并且支持多种配置管理/模板工具(例如 Kustomize、Helm、Ksonnet、Jsonnet、plain-YAML)。
Argo CD 被实现为一个 Kubernetes 控制器,它持续监控正在运行的应用程序并将当前的实时状态与所需的目标状态(例如 Git 仓库中的配置)进行比较,在 Git 仓库更改时自动同步和部署应用程序
Argo CD 在 CI/CD 流程中的位置如下图所示,Argo CD 的主要职责是 CD(Continuous Delivery,持续交付),将应用部署到 Kubernetes 等环境中,而 CI(Continuous Integration,持续集成)主要是交给 Jenkins,Gitlab CI 等工具来完成。
Argo CD 是通过一个 Kubernetes 控制器来实现的,它持续 watch 正在运行的应用程序并将当前的实时状态与所需的目标状态( Git 存储库中指定的)进行比较。已经部署的应用程序的实际状态与目标状态有差异,则被认为是 OutOfSync
状态,Argo CD 会报告显示这些差异,同时提供工具来自动或手动将状态同步到期望的目标状态。在 Git 仓库中对期望目标状态所做的任何修改都可以自动应用反馈到指定的目标环境中去
Argo CD 中的主要组件
API 服务:API 服务是一个 GRPC/REST 服务,它暴露了 web ui、CLI、CI/CD 系统使用的接口,主要有以下几个功能
- 应用程序管理和状态报告
- 执行应用程序操作(例如同步、回滚、用户定义的操作)
- 存储仓库和集群凭据管理(存储为 K8S 的 secret 对象)
- 认证和授权给外部身份提供者
- RBAC
- Git webhook 事件的侦听器/转发器
仓库服务:存储仓库是一个内部服务,负责维护保存应用程序清单 Git 仓库的本地缓存,当提供以下输入时,它负责生成并返回 kubernetes 清单
- 存储 URL
- revision 版本(commit、tag、branch)
- 应用路径
- 模板配置:参数、helm values.yaml 等
应用控制器:应用控制器是一个 kubernetes 控制器,它执行 watch 正在运行的应用程序并将当前的实时状态与期望的目标状态(repo 中指定的)进行比较,它检测应用程序的 OutOfSync 状态,并采取一些措施来同步状态,它负责调用任何用户定义的生命周期事件的钩子(PreSync、Sync、PostSync)
功能
- 自动部署应用程序到指定的目标环境
- 支持多种配置管理/模板工具(Kustomize、Helm、Ksonnet、Jsonnet)
- 能够管理和部署到多个集群
- SSO 集成(OIDC、OAuth2、LDAP、SAML 2.0、GitHub、GitLab、Microsoft、LinkedIn)
- 用于授权的多租户和 RBAC 策略
- 回滚/随时回滚到 Git 存储库中提交的任何应用配置
- 应用资源的健康状况分析
- 自动配置检测和可视化
- 自动或手动将应用程序同步到所需状态
- 提供应用程序活动实时视图的 Web UI
- 用于自动化和 CI 集成的 CLI
- Webhook 集成(GitHub、BitBucket、GitLab)
- 用于自动化的 AccessTokens
- PreSync、Sync、PostSync Hooks,以支持复杂的应用程序部署(例如蓝/绿和金丝雀发布)
- 应用程序事件和 API 调用的审计
- Prometheus 监控指标
- 用于覆盖 Git 中的 ksonnet/helm 参数
核心概念
- Application:应用,一组由资源清单定义的 kubernetes 资源,这是一个 CRD 资源对象
- Application source type:用来构建应用的工具
- Target state:目标状态,指应用程序所需的期望状态,由 git 存储库中的文件表示
- Live status:实时状态,指应用程序实时的状态,比如部署了哪些 pods 等真实状态
- Sync status:同步状态,表示实时状态是否与目标状态一致,部署的应用是否与 Git 所描述的一样
- Sync:同步,指将应用程序迁移到其目标状态的过程,比如通过对 Kubernetes 集群应用变更
- Sync operation status:同步操作状态,指的是同步是否成功
- Refresh:刷新,是指将 git 中的最新代码与实时状态进行比较,弄清楚有什么不同
- Health:应用程序的健康状况,它是否正常运行,能否为请求提供服务
- Tool:工具指从文件目录创建清单的工具,例如 kustomize 或 Ksonnet 等
- Configuration management tool:配置管理工具
- Configuration management plugin:配置管理插件
安装 argocd
使用以下命令在 argocd 命名空间部署 Argo CD。
# 创建命名空间 kubectl create namespace argocd # 下载资源清单 wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml # 部署 argo cd kubectl apply -n argocd -f install.yaml
部署完成之后查看 pod 是否都正常起来
[root@master1 ~]# kubectl get pod -n argocd
安装 Argo CD CLI
Argo CD CLI 是用于管理 Argo CD 的命令行工具,不同操作系统具体的安装方式可以参考 Argo CD CLI Installation
我的是 centos ,使用下面命令进行安装
# 下载后移动到 /usr/local/bin/argocd 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 验证
[root@master1 ~]# argocd argocd controls a Argo CD server Usage: argocd [flags] argocd [command] Available Commands: account Manage account settings admin Contains a set of commands useful for Argo CD administrators and requires direct Kubernetes access app Manage applications cert Manage repository certificates and SSH known hosts entries cluster Manage cluster credentials completion output shell completion code for the specified shell (bash or zsh) context Switch between contexts gpg Manage GPG keys used for signature verification ......
暴露 Argo CD 服务
默认情况下, Argo CD 服务不对外暴露服务,可以通过 LoadBalancer 或者 NodePort 类型的 Service、Ingress、Kubectl 端口转发等方式将 Argo CD 服务发布到 Kubernetes 集群外部。
这里使用以下命令通过 NodePort 服务的方式暴露 Argo CD 到集群外部。
# 暴露服务,使用 NodePort [root@master1 ~]# kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}' service/argocd-server patched
现在我们已经将名字为 argocd-server 的 Service 改成 NodePort 类型了,可以在集群外部通过 <节点 IP>:<随机生成的 NodePort 端口> 来访问 Argo CD,我这里随机生成的 NodePort 端口是 32382
浏览器输入 https://<节点 IP>:32382 访问 Argo CD。如果看到下面页面则部署成功
获取 Argo CD 密码
默认情况下 admin
帐号的初始密码是自动生成的,会以明文的形式存储在 Argo CD 安装的命名空间中名为 argocd-initial-admin-secret
的 Secret 对象下的 password
字段下,我们可以用下面的命令来获取
# 获取密码 [root@master1 ~]# kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d t3b8TQvLjugSIrMq
使用 admin 和上面的 密码进行登录,登录后的页面如下
命令行可以使用以下方式登录
# 登录,你的 ip 地址和端口号 [root@master1 ~]# argocd login 10.6.215.30:32382 # 接收证书风险 WARNING: server certificate had error: x509: cannot validate certificate for 10.6.215.30 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y Username: admin # 用户名 Password: # 密码 'admin:login' logged in successfully Context '10.6.215.30:32382' updated
更新密码
默认的密码太难记了,我们也可以修改,登录到页面上点击 USER INFO
修改完成之后点击 SAVE NEW PASSWORD 就可以了,注意:密码最少为 8 位
也可以在命令行里更新密码
# 先登录 [root@master1 ~]# argocd login 10.6.215.30:32382 WARNING: server certificate had error: x509: cannot validate certificate for 10.6.215.30 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y Username: admin Password: 'admin:login' logged in successfully Context '10.6.215.30:32382' updated # 登录成功后更新密码 [root@master1 ~]# argocd account update-password *** Enter password of currently logged in user (admin): # 输入当前的密码 *** Enter new password for user admin: 12345678 # 新密码 *** Confirm new password for user admin: 12345678 # 确认密码 Password updated Context '10.6.215.30:32382' updated
更新成功后,就可以用 admin 和 12345678 去登录了