Argo CD

发布时间 2023-08-10 17:29:32作者: evescn

Argo CD 服务

什么是 Argo CD

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

如何工作

Argo CD 遵循 GitOps 模式,使用 Git 仓库作为定义所需应用程序状态的真实来源,Argo CD 支持多种 Kubernetes 清单:

  • 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 提交时跟踪对分支、标签的更新,或固定到清单的指定版本。

架构

ArgoCD架构

Argo CD 是通过一个 Kubernetes 控制器来实现的,它持续 watch 正在运行的应用程序并将当前的实时状态与所需的目标状态( Git 存储库中指定的)进行比较。已经部署的应用程序的实际状态与目标状态有差异,则被认为是 OutOfSync 状态,Argo CD 会报告显示这些差异,同时提供工具来自动或手动将状态同步到期望的目标状态。在 Git 仓库中对期望目标状态所做的任何修改都可以自动应用反馈到指定的目标环境中去。

Argo CD 中的主要组件

API 服务:API 服务是一个 gRPC/REST 服务,它暴露了 Web UI、CLI 和 CI/CD 系统使用的接口,主要有以下几个功能:

  • 应用程序管理和状态报告
  • 执行应用程序操作(例如同步、回滚、用户定义的操作)
  • 存储仓库和集群凭据管理(存储为 K8S Secrets 对象)
  • 认证和授权给外部身份提供者
  • RBAC
  • Git webhook 事件的侦听器/转发器

仓库服务:存储仓库服务是一个内部服务,负责维护保存应用程序清单 Git 仓库的本地缓存。当提供以下输入时,它负责生成并返回 Kubernetes 清单:

  • 存储 URL
  • revision 版本(commit、tag、branch)
  • 应用路径
  • 模板配置:参数、ksonnet 环境、helm values.yaml 等

应用控制器:应用控制器是一个 Kubernetes 控制器,它持续 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 参数

核心概念

  • Application:应用,一组由资源清单定义的 Kubernetes 资源,这是一个 CRD 资源对象
  • Application source type:用来构建应用的工具
  • Target state:目标状态,指应用程序所需的期望状态,由 Git 存储库中的文件表示
  • Live state:实时状态,指应用程序实时的状态,比如部署了哪些 Pods 等真实状态
  • Sync status:同步状态表示实时状态是否与目标状态一致,部署的应用是否与 Git 所描述的一样?
  • Sync:同步指将应用程序迁移到其目标状态的过程,比如通过对 Kubernetes 集群应用变更
  • Sync operation status:同步操作状态指的是同步是否成功
  • Refresh:刷新是指将 Git 中的最新代码与实时状态进行比较,弄清楚有什么不同
  • Health:应用程序的健康状况,它是否正常运行?能否为请求提供服务?
  • Tool:工具指从文件目录创建清单的工具,例如 Kustomize 或 Ksonnet 等
  • Configuration management tool:配置管理工具
  • Configuration management plugin:配置管理插件

安装 Argo CD

要求

  • kubernetes 集群
  • 一个 kubectl 可访问的 Kubernetes 的集群

Argo CD 安装类型

Argo CD 还提供两种类型的安装清单

  • 非高可用清单: 用于演示和测试

    • install.yaml: 在默认的 ns 中部署,在一个集群部署仅部署一个 argodb 应用
    • namespaces-install.yaml: 在不同的 ns 中部署,在一个集群中部署多个 argocd 应用
  • 高可用清单: 建议在生产环境中使用高可用性安装

    • ha/install.yaml - 与 install.yaml 相同,但具有受支持组件的多个副本。
    • ha/namespace-install.yaml - 与 namespace-install.yaml 相同,但具有受支持组件的多个副本。

安装服务

使用版本 v2.7.10

https://github.com/argoproj/argo-cd/tree/v2.7.10/manifests

[root@node argocd]# kubectl create namespace argocd
[root@node argocd]# kubectl apply -n argocd -f https://ghproxy.com/https://raw.githubusercontent.com/argoproj/argo-cd/v2.7.10/manifests/install.yaml

安装创建的资源信息

# CRD
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created

# ServiceAccount
serviceaccount/argocd-application-controller created
serviceaccount/argocd-applicationset-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-notifications-controller created
serviceaccount/argocd-redis created
serviceaccount/argocd-repo-server created
serviceaccount/argocd-server created

# RBAC: Role ClusterRole RoleBinding ClusterRoleBinding
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-applicationset-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-notifications-controller created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-notifications-controller created
rolebinding.rbac.authorization.k8s.io/argocd-redis created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created

# ConfigMap
configmap/argocd-cm created
configmap/argocd-cmd-params-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-notifications-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created

# Secret
secret/argocd-notifications-secret created
secret/argocd-secret created

# Service
service/argocd-applicationset-controller created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-notifications-controller-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server created
service/argocd-server-metrics created

# Deployment
deployment.apps/argocd-applicationset-controller created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-notifications-controller created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created

# StatefulSet
statefulset.apps/argocd-application-controller created

# NetworkPolicy
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-applicationset-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-notifications-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created

查看 Argo CD 服务

[root@node argocd]# kubectl -n argocd get pods
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          2m42s
argocd-applicationset-controller-57bbb6bcdf-kgzmk   1/1     Running   0          2m43s
argocd-dex-server-7fd667d566-m94wr                  1/1     Running   0          2m43s
argocd-notifications-controller-ccd6b9d56-dlsmx     1/1     Running   0          2m43s
argocd-redis-74f98b85f-j5fp2                        1/1     Running   0          2m43s
argocd-repo-server-b55c54f9b-vj6t8                  1/1     Running   0          2m43s
argocd-server-7b5cb98999-cw4b7                      1/1     Running   0          2m42s

创建 ingress 访问 web 界面

此处依赖 traefik ,或者也可以安装 nginx ingressargocd ingress 配置官网文档:https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#ingressroute-crd

[root@node argocd]# cat traefik.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: argocd-server
  namespace: argocd
spec:
  entryPoints:
    - websecure
  routes:
    - kind: Rule
      match: Host(`argocd.evescn.com`)
      priority: 10
      services:
        - name: argocd-server
          port: 80
    - kind: Rule
      match: Host(`argocd.evescn.com`) && Headers(`Content-Type`, `application/grpc`)
      priority: 11
      services:
        - name: argocd-server
          port: 80
          scheme: h2c
  tls:
    certResolver: default

访问服务出现 url 307 问题,详细的查看这个文章:https://devpress.csdn.net/k8s/62fff4557e6682346619531a.html

307 问题解决方法

[root@node argocd]# wget https://ghproxy.com/https://raw.githubusercontent.com/argoproj/argo-cd/v2.7.10/manifests/install.yaml


# 这个文中找到 ConfigMapargocd-cmd-params-cm 更改的配置
# 官方文档也有说明(如果没有提供 ssl 证书):https://devpress.csdn.net/k8s/62fff4557e6682346619531a.html
# The API server should be run with TLS disabled. Edit the argocd-server deployment to add the --insecure flag to the argocd-server command, or simply set server.insecure: "true" in the argocd-cmd-params-cm ConfigMap as described here.

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cmd-params-cm
data:
  server.insecure: "true"

[root@node argocd]# kubeclt -n argocd delete -f install.yaml
[root@node argocd]# kubeclt -n argocd apply -f install.yaml

访问 web

默认情况下 admin 帐号的初始密码是自动生成的,会以明文的形式存储在 Argo CD 安装的命名空间中名为 argocd-initial-admin-secret 的 Secret 对象下的 password 字段下,我们可以用下面的命令来获取:

$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo

使用用户名 admin 和上面输出的密码即可登录 Dashboard。

安装 cli 命令行工具

下载连接:

  • 从 web 界面获取地址

https://argocd.evescn.com:20443/download/argocd-linux-amd64

  • 从文档中获取的地址

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

安装 cli

[root@node argocd]# wget https://argocd.evescn.com/download/argocd-linux-amd64 --no-check-certificate

[root@node argocd]# chmod a+x argocd-linux-amd64 && mv argocd-linux-amd64 /usr/local/bin/argocd

[root@node argocd]# argocd version
argocd: v2.7.10+469f257.dirty
  BuildDate: 2023-07-31T22:05:17Z
  GitCommit: 469f25753b2be7ef0905a11632a6382060bcae99
  GitTreeState: dirty
  GoVersion: go1.19.10
  Compiler: gc
  Platform: linux/amd64
FATA[0000] Argo CD server address unspecified   

通过 ArgoCD CLI 命令行工具进行登录:

[root@node argocd]# argocd login argocd.evescn.com:20080 --insecure 
Username: admin
Password: 
'admin:login' logged in successfully
Context 'argocd.evescn.com' updated

需要注意的是这里登录的地址为 gRPC 暴露的服务地址。

CLI 登录成功后,可以使用如下所示命令更改密码:

[root@node ~]# argocd account update-password
*** Enter password of currently logged in user (admin): 
*** Enter new password for user admin: 
*** Confirm new password for user admin: 
Password updated
Context 'argocd.evescn.com' updated
[root@node ~]# argocd version
argocd: v2.7.10+469f257.dirty
  BuildDate: 2023-07-31T22:05:17Z
  GitCommit: 469f25753b2be7ef0905a11632a6382060bcae99
  GitTreeState: dirty
  GoVersion: go1.19.10
  Compiler: gc
  Platform: linux/amd64
argocd-server: v2.7.10+469f257.dirty
  BuildDate: 2023-07-31T22:05:17Z
  GitCommit: 469f25753b2be7ef0905a11632a6382060bcae99
  GitTreeState: dirty
  GoVersion: go1.19.10
  Compiler: gc
  Platform: linux/amd64
  Kustomize Version: v5.0.1 2023-03-14T01:32:48Z
  Helm Version: v3.11.2+g912ebc1
  Kubectl Version: v0.24.2
  Jsonnet Version: v0.19.1

配置集群

由于 Argo CD 支持部署应用到多集群,所以如果你要将应用部署到外部集群的时候,需要先将外部集群的认证信息注册到 Argo CD 中,如果是在内部部署(运行 Argo CD 的同一个集群,默认不需要配置),直接使用 https://kubernetes.default.svc 作为应用的 K8S APIServer 地址即可。

首先列出当前 kubeconfig 中的所有集群上下文:

[root@node ~]# kubectl config get-contexts -o name
context-cluster1

从列表中选择一个上下文名称并将其提供给 argocd cluster add CONTEXTNAME,比如对于 kind-kind上下文,运行:

[root@node ~]# argocd cluster add context-cluster1
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `context-cluster1` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0002] ServiceAccount "argocd-manager" created in namespace "kube-system" 
INFO[0002] ClusterRole "argocd-manager-role" created    
INFO[0002] ClusterRoleBinding "argocd-manager-role-binding" created 
Cluster 'https://192.168.0.101:6443' added

[root@node ~]# argocd cluster list
SERVER                          NAME              VERSION  STATUS   MESSAGE                                                  PROJECT
https://192.168.0.101:6443      context-cluster1           Unknown  Cluster has no applications and is not being monitored.  
https://kubernetes.default.svc  in-cluster                 Unknown  Cluster has no applications and is not being monitored. 

img

Argo CD 创建部署应用

https://www.cnblogs.com/evescn/p/17614884.html

Argo CD YAML 资源清单

https://www.cnblogs.com/evescn/p/17617392.html

Argo CD Project

https://www.cnblogs.com/evescn/p/17617484.html