一、定义
Argo CD 是用于 Kubernetes 的声明式 GitOps 持续交付工具。
Argo CD 遵循GitOps模式,使用 Git 存储库作为定义所需应用程序状态的真实来源
Argo CD 被实现为一个 kubernetes 控制器,它持续监控正在运行的应用程序并将当前的实时状态与所需的目标状态(如 Git 存储库中指定的)进行比较。考虑了一个已部署的应用程序,其活动状态偏离目标状态OutOfSync。Argo CD 报告并可视化差异,同时提供自动或手动将实时状态同步回所需目标状态的工具。对 Git 存储库中所需目标状态所做的任何修改都可以自动应用并反映在指定的目标环境中。
二、Argo CD 架构
从功能架构来看,Argo CD 主要有三个组件:API Server、Repository Server 和 Application Controller。从 GitOps 工作流的角度来看,总共分为 3 个阶段:检索、调谐和呈现。
(1)检索 – Repository Server
检索阶段会克隆应用声明式配置清单所在的 Git 仓库,并将其缓存到本地存储。包含 Kubernetes 原生的配置清单、Helm Chart 以及 Kustomize 配置清单。履行这些职责的组件就是 Repository Server。
(2)调谐 – Application Controller
调谐(Reconcile)阶段是最复杂的,这个阶段会将 Repository Server 获得的配置清单与反映集群当前状态的实时配置清单进行对比,一旦检测到应用处于 OutOfSync 状态,Application Controller 就会采取修正措施,使集群的实际状态与期望状态保持一致。
(3)呈现 – API Server
最后一个阶段是呈现阶段,由 Argo CD 的 API Server 负责,它本质上是一个 gRPC/REST Server,提供了一个无状态的可视化界面,用于展示调谐阶段的结果。同时还提供了以下这些功能:
- 应用管理和状态报告;
- 调用与应用相关的操作(例如同步、回滚、以及用户自定义的操作);
- Git 仓库与集群凭证管理(以 Kubernetes Secret 的形式存储);
- 为外部身份验证组件提供身份验证和授权委托;
- RBAC 增强;
- Git Webhook 事件的监听器/转发器。
三、核心概念
假设熟悉核心 Git、Docker、Kubernetes、持续交付和 GitOps 概念。以下是一些特定于 Argo CD 的概念。
应用程序 清单定义的一组 Kubernetes 资源。这是自定义资源定义 (CRD)。
应用程序源类型 用于构建应用程序的工具。
目标状态 应用程序的期望状态,由 Git 存储库中的文件表示。
实时状态 该应用程序的实时状态。部署了哪些 pod 等。
同步状态 实时状态是否与目标状态匹配。部署的应用程序是否与 Git 所说的一样?
同步 使应用程序移动到其目标状态的过程。例如,通过将更改应用于 Kubernetes 集群。
同步操作状态 同步是否成功。
刷新 将 Git 中的最新代码与实时状态进行比较。弄清楚有什么不同。
Health 应用程序的健康状况,是否正常运行?它可以满足请求吗?
工具 从文件目录创建清单的工具。例如 Kustomize。请参阅应用程序源类型。
配置管理工具 请参阅工具。
配置管理插件 自定义工具。
三、部署(带UI界面)
[root@k8s-master ~]# kubectl create namespace argocd
[root@k8s-master ~]# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
[root@k8s-master ~]# kubectl -n argocd get pod
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 4h33m
argocd-applicationset-controller-d7cbbcdc8-pb2wj 1/1 Running 0 4h33m
argocd-dex-server-6d7b7b6b4d-4xmbd 1/1 Running 0 4h33m
argocd-notifications-controller-77546bbb87-57zm2 1/1 Running 0 4h33m
argocd-redis-98fbb98fc-47pqj 1/1 Running 0 4h33m
argocd-repo-server-c45579b5d-vbjp6 1/1 Running 0 4h33m
argocd-server-85cf95fd9b-gspzn 1/1 Running 0 4h33m
四、访问 Argo CD
部署完成后,可以通过 Service argocd-server 来访问可视化界面。
[root@k8s-master ~]# kubectl -n argocd get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-applicationset-controller ClusterIP 10.107.222.224 <none> 7000/TCP,8080/TCP 4h33m
argocd-dex-server ClusterIP 10.106.111.12 <none> 5556/TCP,5557/TCP,5558/TCP 4h33m
argocd-metrics ClusterIP 10.108.142.245 <none> 8082/TCP 4h33m
argocd-notifications-controller-metrics ClusterIP 10.101.163.114 <none> 9001/TCP 4h33m
argocd-redis ClusterIP 10.104.219.224 <none> 6379/TCP 4h33m
argocd-repo-server ClusterIP 10.111.121.38 <none> 8081/TCP,8084/TCP 4h33m
argocd-server NodePort 10.109.42.42 <none> 80:31977/TCP,443:32617/TCP 4h33m #修改service文件 以 NodePort 形式访问
argocd-server-metrics ClusterIP 10.98.218.217 <none> 8083/TCP 4h33m
五、访问密码获取
初始密码以明文形式存储在 Secret argocd-initial-admin-secret 中,可以通过以下命令获取:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
也可以通过以下命令来修改登录密码:
argocd account update-password --account admin --current-password xxxx --new-password xxxx
六、访问并登录默认账号
http://主机IP:31977
admin
七、示例应用
(1)git仓库目录结构
app-src/ #程序代码
├── code-of-conduct.md
├── yaml.go
└── yaml_go110.go
app-config/ #清单配置
└── deployment.yaml
└── service.yaml
application.yaml #放在仓库的根目录
#deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
replicas: 7
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx:1.20
ports:
- containerPort: 80
#service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 80
protocol: TCP
targetPort: 80
#application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-argo-application
namespace: argocd
spec:
project: default
source:
repoURL: https://gitee.com/laolaoxu/argocd-lab.git
targetRevision: HEAD
path: app-config #注意此处写清单配置的目录名称
destination:
server: https://kubernetes.default.svc
namespace: myapp
syncPolicy:
syncOptions:
- CreateNamespace=true
automated:
selfHeal: true
prune: true
参数解释:
syncPolicy : 指定自动同步策略和频率,不配置时需要手动触发同步。
syncOptions : 定义同步方式。
CreateNamespace=true : 如果不存在这个 namespace,就会自动创建它。
automated : 检测到实际状态与期望状态不一致时,采取的同步措施。
selfHeal : 当集群世纪状态不符合期望状态时,自动同步。
prune : 自动同步时,删除 Git 中不存在的资源。
Argo CD 默认情况下每 3 分钟会检测 Git 仓库一次,用于判断应用实际状态是否和 Git 中声明的期望状态一致,如果不一致,状态就转换为 OutOfSync。默认情况下并不会触发更新,除非通过 syncPolicy 配置了自动同步。
如果嫌周期性同步太慢了,也可以通过设置 Webhook 来使 Git 仓库更新时立即触发同步。
(2)argocd的UI界面配置,添加应用程序
(3)点击“sync”进行同步配置