简介

Argo CD是一个为Kubernetes而生的遵循声明书GitOps理念的持续部署工具,Argo CD可在git存储库更新时自动同步和部署应用程序。

Argo CD支持多种k8s清单:

  • kustomize
  • helm charts
  • ksonnet applications
  • jsonnet files
  • Plain directory of YAML/json manifests
  • Any custom config management tool configured as a config management plugin

Argo CD可在指定的目标环境中自动部署所需的应用程序状态,应用程序部署可以在Git提交时跟踪对分支、标签的更新,或固定到清单的指定版本。

  • 架构

Argo CD是通过一个k8s控制器来实现的,它持续watch正在运行的应用程序并将当前的实时状态与所需的目标状态(Git仓库中指定的)进行比较。状态有差异则认为是 OutOfSync 状态,Argo CD同时提供工具来自动或手动将状态同步到期望的目标状态。

核心组件
  • API服务:是一个gRPC/REST服务,它暴露了Web UI、CLI和CI/CD系统使用的接口,主要有以下几个功能
  • 应用程序管理和状态报告
  • 执行应用程序操作(如同步、回滚、用户自定义的操作)
  • 存储仓库和集群凭据管理(存储为k8s secrets对象)
  • 认证和授权给外部身份提供者
  • RBAC
  • Git webhook事件的侦听器/转发器
  • 存库服务:这是一个内部服务,负责维护保存应用程序清单Git仓库的本地缓存。当提供以下输入时,它负责生成并返回k8s清单:
  • 存储URL
  • revision版本(commit、tag、branch)
  • 应用路径
  • 模板配置:参数、ksonnet环境、helm values.yaml等
  • 应用控制器:是一个k8s控制器,它持续watch正在运行的应用程序并将当前的实时状态与所期望的目标状态(repo中指定的)进行比较。它检测应用程序的OutOfSync状态,并采取同步措施来同步。负责调用任何用户自定义的生命周期事件的钩子(PreSync、Sync、PostSync)
功能
  • 自动部署应用程序到指定的目标环境
  • 支持多种配置管理/模板工具(Kustomize、Helm、Ksonnet、Jsonnet、plain-YAML)
  • 能够管理和部署到多个集群
  • 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 参数
安装

​https://github.com/argoproj/argo-cd/releases​

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

# 生产环境可部署HA高可用版本(当前稳定版v2.4.9)
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.9/manifests/ha/install.yaml
  • 资源查看
[root@master ~]# kubectl get pod -n argocd 
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 3 (3h8m ago) 2d20h
argocd-applicationset-controller-86c8556b6d-qvmtd 1/1 Running 3 (3h8m ago) 2d20h
argocd-dex-server-5c65569f55-ns6rm 1/1 Running 14 (3h8m ago) 13d
argocd-notifications-controller-f5d57bc55-d49cc 1/1 Running 2 (3h8m ago) 2d20h
argocd-redis-65596bf87-l7ppm 1/1 Running 2 (3h8m ago) 2d20h
argocd-repo-server-5bfd7c4cfd-sc58x 1/1 Running 14 (3h8m ago) 13d
argocd-server-8544dd9f89-ws6xk 1/1 Running 2 (3h8m ago) 2d20h
  • 后台登录
# 查看后台初始密码,登录后请修改初始密码
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo

# 通过web浏览器访问登录
kubectl edit svc -n argocd argocd-server # type改为NodePort

# 通过argocd CLI命令行工具进行登录
[root@master ~]# argocd login 10.233.81.124
WARNING: server certificate had error: x509: cannot validate certificate for 10.233.81.124 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context '10.233.81.124' updated
配置
  • 配置集群
Argo CD支持部署应用到多集群,如需将应用部署到外部集群时需要先将外部集群的认证信息注册到Argo CD中,如内部部署(运行Argo CD的同一个集群默认不需要配置),直接使用https://kubernetes.default.svc 作为应用的k8s APIServer地址。

# 列出当前kubeconfig中的所有集群上下文
kubectl config get-contexts -o name

# 从列表选择上下文名称并提供给argocd
argocd cluster add xxxx
  • 创建应用
Git仓库选用https://github.com/argoproj/argocd-example-apps.git,这是一个包含留言簿应用程序的示例库。由于国内访问github速度慢,将其clone到gitee上。
  • 2种创建方式
  • 通过CLI创建应用
argocd app create guestbook --repo https://gitee.com/liyk1024/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
  • 通过web UI(控制台)创建应用
a.点击 +NEW APP 新建应用
b.给应用命名,使用default project,并将同步策略设置为Manual
c.配置Repository URL:https://gitee.com/liyk1024/argocd-example-apps.git
d.Revision填写master,Path填写guestbook
e.Cluster URL:https://kubernetes.default.svc,Namespace填写需要创建资源的ns

ArgoCD默认每3分钟会检测Git仓库一次,用于判断应用实际状态是否和Git中声明的期望状态一致(不一致OutOfSync)
部署应用

由于上面创建应用时同步策略为Manual,所以应用创建完成后没有自动部署需手动去部署应用。同样支持CLI和UI界面2种同步方式。

  • 2种同步方式
  • 通过CLI同步
argocd app sync guestbook  #此命令从git仓库中检索资源清单并执行kubectl apply部署应用
argocd app get guestbook #查看资源状态
  • 通过UI同步
点击进入创建的应用,点击上方菜单栏的 SYNC 按钮进行同步。

Argo CD安装配置_k8s

  • 资源查看
[root@master ~]# kubectl get pod -l app=guestbook-ui
NAME READY STATUS RESTARTS AGE
guestbook-ui-6b689986f-8rwz7 1/1 Running 1 (4h35m ago) 47h
guestbook-ui-6b689986f-bcch6 1/1 Running 2 (4h35m ago) 2d20h
[root@master ~]# kubectl get svc -l app.kubernetes.io/instance=guestbook
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
guestbook-ui ClusterIP 10.233.8.43 <none> 80/TCP 2d20h