一、什么是 ArgoCD?¶
Argo CD 是一款强大的、开源的 GitOps 工具,用于在 Kubernetes 集群上管理应用的部署和生命周期。 它基于 GitOps 的最佳实践,允许团队以声明式的方式部署和管理 Kubernetes 应用,从而简化了多环境部署的复杂性。
二、对比传统 CD 流水线¶
Argo CD 通过周期性地监控和更新应用状态,确保应用的实际状态始终符合 Git 仓库中定义的期望状态,
这种基于 Pull 的部署模式简化了持续部署的过程,并确保了应用状态的一致性和自动化同步,从而提高了部署的可靠性和效率。

开发者通过提交代码触发自动 CI 流水线,并将镜像推送到私有仓库,ArgoCD 都会自动拉取最新的配置并应用到 K8s 集群中。
最终大家看到的就类似2条独立的 CI CD 流水线,结合ArgoCD的动态监控完成应用的部署。

三、ArgoCD 的优势¶
GitOps 方法论:
-
版本控制:ArgoCD 支持使用 Git 作为单一真实来源,确保应用的状态与 Git 中定义的状态保持一 致。
-
审计和历史记录:所有更改都被记录在 Git 中,方便审计和追踪变更历史。
自动化同步和回滚:
-
自动同步:当 Git 存储库中的应用配置发生变化时,ArgoCD 可以自动将应用同步到集群中。
-
回滚能力:如果应用更新失败或不符合期望,ArgoCD 提供一键回滚至先前版本的功能。
强大的应用管理:
-
多环境管理:可以轻松管理多个环境(如开发、测试、生产)中的应用程序。
-
多集群支持:支持跨多个 Kubernetes 集群的应用部署和管理。
丰富的策略和策略执行:
-
同步策略:支持多种同步策略,如自动同步、按需同步等。
-
健康检查和自我修复:可以配置应用的健康检查,并自动恢复到健康状态。
四、ArgoCD的核心组件¶

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 的工作流程可以概括为以下几个关键步骤:
-
开发人员将代码推送到 Git 仓库,触发 CI 流程,包括自动化测试、构建 Docker 镜像并推送到镜像 仓库。
-
CI 完成后,可以手动或自动更新应用配置,并将更新推送到 Git 仓库。
-
ArgoCD 在 Kubernetes 集群中监控应用状态,定期从 Git 仓库拉取最新配置,并与集群中的当前状态进行比较。
-
如果检测到状态不一致,ArgoCD 将自动执行 CD 流程,更新集群中的应用状态以匹配 Git 仓库中的期望状态。

六、实验环境¶
-
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>

八、部署 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 集群上的应用进行统一部署和管理。