一、什么是 ArgoCD?

Argo CD 是一款强大的、开源的 GitOps 工具,用于在 Kubernetes 集群上管理应用的部署和生命周期。 它基于 GitOps 的最佳实践,允许团队以声明式的方式部署和管理 Kubernetes 应用,从而简化了多环境部署的复杂性。

二、对比传统 CD 流水线

Argo CD 通过周期性地监控和更新应用状态,确保应用的实际状态始终符合 Git 仓库中定义的期望状态,

这种基于 Pull 的部署模式简化了持续部署的过程,并确保了应用状态的一致性和自动化同步,从而提高了部署的可靠性和效率。

Day17-ArgoCD-图1

开发者通过提交代码触发自动 CI 流水线,并将镜像推送到私有仓库,ArgoCD 都会自动拉取最新的配置并应用到 K8s 集群中。

最终大家看到的就类似2条独立的 CI CD 流水线,结合ArgoCD的动态监控完成应用的部署。

Day17-ArgoCD-图2

三、ArgoCD 的优势

GitOps 方法论

  • 版本控制:ArgoCD 支持使用 Git 作为单一真实来源,确保应用的状态与 Git 中定义的状态保持一 致。

  • 审计和历史记录:所有更改都被记录在 Git 中,方便审计和追踪变更历史。

自动化同步和回滚

  • 自动同步:当 Git 存储库中的应用配置发生变化时,ArgoCD 可以自动将应用同步到集群中。

  • 回滚能力:如果应用更新失败或不符合期望,ArgoCD 提供一键回滚至先前版本的功能。

强大的应用管理

  • 多环境管理:可以轻松管理多个环境(如开发、测试、生产)中的应用程序。

  • 多集群支持:支持跨多个 Kubernetes 集群的应用部署和管理。

丰富的策略和策略执行

  • 同步策略:支持多种同步策略,如自动同步、按需同步等。

  • 健康检查和自我修复:可以配置应用的健康检查,并自动恢复到健康状态。

四、ArgoCD的核心组件

Day17-ArgoCD-图3

ArgoCD的核心组件分为4个层面:

  • UI:这是表示层。用户主要通过这一层的组件与 ArgoCD 进行交互(包括WebUI和CLI)。

  • Application:支持来自 UI 层的组件所需的功能。

  • Core:主要的 ArgoCD gitops 功能由核心层的组件和 Kubernetes 控制器实现。

  • Infra:表示 ArgoCD 作为其基础设施的一部分所依赖的工具。

以下是各个组件的主要职责,我们在平时维护的时候可以根据这些信息来快速定位故障:

  • Webapp:ArgoCD 附带一个强大的 Web 界面,允许管理部署在给定 Kubernetes 集群中的应用程序;

  • CLI:ArgoCD 提供了一个 CLI,用户可以使用它与 ArgoCD API 进行交互。 CLI 还可用于自动化和 脚本编写;

  • API Server:定义由 ArgoCD 公开的专有 API,该 API 为 Web 应用程序和 CLI 功能提供支持;

  • Application Controller:应用程序控制器负责协调 Kubernetes 中的应用程序资源和项目资源, 并将所需的应用程序状态(在 Git 中提供)与实时状态(在 Kubernetes 中)同步;

  • ApplicationSet Controller:ApplicationSet Controller 负责协调 ApplicationSet 资源, applicationset 是argo创建的一个CRD;

  • Repo Server:Repo Server 在 ArgoCD 架构中起着重要作用,因为它负责与 Git 存储库交互,为属于给定 application 的所有 Kubernetes 资源生成所需的状态;

  • Redis:ArgoCD 使用 Redis 来提供缓存层,减少发送到K8S的API Server和Git服务器的请求。它还支持一些 UI 操作;

  • Kube API:ArgoCD 控制器将连接到K8S的API Server以执行操作。因此如果需要管理多个集群 时,在部署了argocd之外的集群是不需要部署任何argocd的客户端程序的,只需要创建一个ServiceAccount 用于管理权限;

  • Git:作为 gitops 工具,ArgoCD 要求在 Git 存储库中提供所需的 Kubernetes 资源状态。 我们在 这里使用 git 来代表实际的 git 存储库、Helm 存储库或 OCI 工件存储库。 ArgoCD 支持所有这些选项;

  • Dex:Argo CD 依赖于 Dex 来提供与外部 OIDC 提供商的身份验证。当然,可以使用其他工具代替 Dex;

五、基于 ArgoCD 的工作模式

Argo CD 的工作流程可以概括为以下几个关键步骤:

  1. 开发人员将代码推送到 Git 仓库,触发 CI 流程,包括自动化测试、构建 Docker 镜像并推送到镜像 仓库。

  2. CI 完成后,可以手动或自动更新应用配置,并将更新推送到 Git 仓库。

  3. ArgoCD 在 Kubernetes 集群中监控应用状态,定期从 Git 仓库拉取最新配置,并与集群中的当前状态进行比较。

  4. 如果检测到状态不一致,ArgoCD 将自动执行 CD 流程,更新集群中的应用状态以匹配 Git 仓库中的期望状态。

Day17-ArgoCD-图4

六、实验环境

  • Kubernetes 版本:1.27.4

  • Containerd 版本:1.6.22

  • ArgoCD 版本:v2.11.xx

七、ArgoCD 部署配置

官方数据:https://argo-cd.readthedocs.io/en/latest/getting_started/

7.1 安装Argo CD

创建命名空间

[root@master01 ~]# cd /root/17

[root@master01 17]# kubectl create namespace argocd

部署 argocd

[root@master01 17]#

wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# 修改国外镜像为国内镜像

## 修改前

[root@master01 17]# grep -ri "image:" install.yaml 

        image: quay.io/argoproj/argocd:v2.11.3

        image: ghcr.io/dexidp/dex:v2.38.0

        image: quay.io/argoproj/argocd:v2.11.3

        image: quay.io/argoproj/argocd:v2.11.3

        image: redis:7.0.14-alpine

        image: quay.io/argoproj/argocd:v2.11.3

        image: quay.io/argoproj/argocd:v2.11.3

        image: quay.io/argoproj/argocd:v2.11.3

        image: quay.io/argoproj/argocd:v2.11.3

        image: quay.io/argoproj/argocd:v2.11.3

## 修改命令

sed -i s#quay.io/argoproj/argocd:v2.11.3#registry.cn-hangzhou.aliyuncs.com/github_images1024/argocd:v2.11.3#g install.yaml

sed -i s#ghcr.io/dexidp/dex:v2.38.0#registry.cn-hangzhou.aliyuncs.com/github_images1024/dex:v2.38.0#g install.yaml

sed -i s#redis:7.0.14-alpine#registry.cn-hangzhou.aliyuncs.com/github_images1024/redis:7.0.14-alpine#g install.yaml

## 修改后

[root@master01 17]# grep -ri "image:" install.yaml 

        image: registry.cn-hangzhou.aliyuncs.com/github_images1024/argocd:v2.11.3

        image: registry.cn-hangzhou.aliyuncs.com/github_images1024/dex:v2.38.0

        image: registry.cn-hangzhou.aliyuncs.com/github_images1024/argocd:v2.11.3

        image: registry.cn-hangzhou.aliyuncs.com/github_images1024/argocd:v2.11.3

        image: registry.cn-hangzhou.aliyuncs.com/github_images1024/redis:7.0.14-alpine

        image: registry.cn-hangzhou.aliyuncs.com/github_images1024/argocd:v2.11.3

        image: registry.cn-hangzhou.aliyuncs.com/github_images1024/argocd:v2.11.3

        image: registry.cn-hangzhou.aliyuncs.com/github_images1024/argocd:v2.11.3

        image: registry.cn-hangzhou.aliyuncs.com/github_images1024/argocd:v2.11.3

        image: registry.cn-hangzhou.aliyuncs.com/github_images1024/argocd:v2.11.3

# 应用

[root@master01 17]# kubectl apply -n argocd -f install.yaml

7.2 部署验证

查看状态

[root@master01 17]# kgp -n argocd

NAME                                               READY   STATUS    RESTARTS   AGE

argocd-application-controller-0                    1/1     Running   0          42s

argocd-applicationset-controller-8dc84546d-pllzn   1/1     Running   0          42s

argocd-dex-server-6f78b8dc7c-rwbsh                 1/1     Running   0          42s

argocd-notifications-controller-6c4b6b59d4-5tzqm   1/1     Running   0          42s

argocd-redis-6755b67f67-gkqwp                      1/1     Running   0          42s

argocd-repo-server-5c8486d555-mtscv                1/1     Running   0          42s

argocd-server-6584bdffbf-8mc46                     1/1     Running   0          42s

通过ingress-nginx暴露ui访问,也可以通过nodePort临时访问。

[root@master01 17]# vim argocd-ing.yaml

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: argocd-server-ingress

  namespace: argocd

  annotations:

    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

    nginx.ingress.kubernetes.io/ssl-passthrough: "true"

spec:

  ingressClassName: "nginx"

  rules:

  - host: argocd.example.com

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: argocd-server

            port:

              name: https

  tls:

  - hosts:

    - argocd.example.com

    secretName: argocd-secret-1

# 应用

[root@master01 17]# kaf argocd-ing.yaml

# 查看

[root@master01 17]# kubectl get ing -nargocd

NAME                    CLASS   HOSTS                   ADDRESS     PORTS     AGE

argocd-server-ingress   nginx   argocd.example.com   <node-ip>   80, 443   62m

创建tls证书

[root@master01 17]#

kubectl create secret tls argocd-secret-1 -nargocd --key argocd.example.com.key  --cert argocd.example.com.pem

解析&访问验证

# 查看ingress

[root@master01 17]# kubectl get ing -nargocd

NAME                    CLASS   HOSTS                   ADDRESS     PORTS     AGE

argocd-server-ingress   nginx   argocd.example.com   <node-ip>   80, 443   46s

# 访问验证

[root@master01 17]# curl https://argocd.example.com -I

HTTP/1.1 200 OK

Date: Mon, 21 Apr 2025 02:05:59 GMT

Content-Type: text/html; charset=utf-8

Content-Length: 788

Connection: keep-alive

Accept-Ranges: bytes

Content-Security-Policy: frame-ancestors 'self';

Vary: Accept-Encoding

X-Frame-Options: sameorigin

X-Xss-Protection: 1

Strict-Transport-Security: max-age=15724800; includeSubDomains

默认情况下argocd会暴露两个端口,其中80端口会自动重定向到443端口,如果配置反向代理的需要需要额外注意。

  • 443 - gRPC/HTTPS

  • 80 - HTTP (redirects to HTTPS)

7.3 获取Argo CD密码

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

[root@master01 17]# kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

<initial-admin-password>

Day17-ArgoCD-图5

八、部署 ArgoCD CLI

下载对应系统版本的二进制文件

# 下载文件

[root@master01 17]# curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/download/v2.11.3/argocd-linux-amd64

# 复制二进制文件到/usr/local/bin/目录下面

[root@master01 17]# sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd

# 删除自身目录下的文件

[root@master01 17]# rm -f argocd-linux-amd64

安装完成之后输入 argocd --help 查看 CLI 是否能够正常运行

[root@master01 17]# argocd --help

argocd controls a Argo CD server

Usage:

  argocd [flags]

  argocd [command]

...

...

argocd CLI 的默认配置文件会放置在 ~/.config/argocd/config 目录下,当然也可以像 kubectl 一样使用 --config 手动指定。

8.1 修改初始账号密码

通过CLI工具来快速获取初始密码:

[root@master01 17]# argocd admin initial-password -n argocd

<initial-admin-password>

获取初始密码之后,我们可以使用初始账号 admin 和初始密码进行登录,然后进行密码的修改。

# 先使用初始密码登录

[root@master01 17]# argocd login argocd.example.com

Username: admin

Password: <initial-admin-password>

# 随即修改密码

[root@master01 17]# argocd account update-password

*** Enter password of currently logged in user (admin): <initial-admin-password>

*** Enter new password for user admin: <new-admin-password>

*** Confirm new password for user admin: <new-admin-password>

Password updated

Context 'argocd.example.com' updated

# 随后再次退出然后即可使用新密码进行重新登录

[root@master01 17]# argocd logout argocd.example.com

Logged out from 'argocd.example.com'

# 使用修改后的密码登录

[root@master01 17]# argocd login argocd.example.com

Username: admin

Password: <new-admin-password>

'admin:login' logged in successfully

Context 'argocd.example.com' updated

九、总结

基于 ArgoCD 的云原生 CD 解决方案优势:

1、应用定义、配置和环境信息是声明式的,并且可以进行版本控制;

2、应用部署和生命周期管理是全自动化的,是可审计的,清晰易懂;

3、Argo CD 是一个独立的部署工具,支持对多个环境、多个 Kubernetes 集群上的应用进行统一部署和管理。