1. Argo CD简介
Argo CD是一个基于Kubernetes的声明式GitOps持续交付工具。Argo CD功能有:
- 将应用程序自动部署到指定的目标环境
- 支持多种配置管理/模板工具(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)
- 用于自动化的访问令牌
- PreSync、Sync、PostSync钩子支持复杂的应用程序发布(例如,blue/green & canary升级)
- 应用程序事件和API调用的审计跟踪
- Prometheus指标
- 在Git中重写ksonnet/helm参数的参数覆盖
2. Argo CD架构
从上面架构图可以看出,Argo CD包括三个核心服务:API Server、Repository Server和Application Controller
2.1 API Server
API Server提供gRPC、REST接口,与web UI、CLI、CI/CD系统交互,API Server的功能有:
- application管理和状态上报
- application操作(同步、回滚、自定义操作)
- repository和集群证书管理(存为k8s secrets)
- 与外部认证provider进行认证/鉴权
- RBAC限制
- 监听/转发Git webhook事件
2.2 Repository Server
Repository Server会克隆application声明式配置清单仓库,并缓存到本地存储;声明式配置清单形式支持 Kustomize、Helm、Ksonnet、Jsonnet、k8s yaml;提供输入可以生成和返回k8s声明式配置清单.
2.3 Application Controller
Application Controller是K8s controller实现,持续监控运行中的application并对当前状态与期望状态进行对比. 如果检测到application OutOfSync状态,就会向期望状态校正.也可以添加任何用户自定义的hook在application生命周期事件上(PreSync,Sync,PostSync)
3. Argo CD核心概念
3.1 Project
Project可用于不同Application的分组,针对每个Project还可以设置一些精细化限制:
- 设置Application部署清单的来源Repositories白名单
- 设置Application部署的目标集群和目标命名空间白名单
- 设置部署Cluster cluster级别、namespace级别资源的白名单/黑名单
- 设置GPG签名Key
- 设置目标命名空间Application资源级别的监控
- 设置项目角色,为Application设置RBAC规则
- 设置资源同步时间窗口的白名单/黑名单
3.2 Application
Application定义了部署清单Repository、目标Cluster、关联Project、同步策略/同步参数设置、部署清单的方式; 其中部署清单Repository声明的状态最终呈现在目标Cluster. Application是GitOps的最小发布单元.
单个Application不支持在多个Cluster同时部署,社区有相应的issue讨论:https://github.com/argoproj/argo-cd/issues/1673
3.3 ApplicationSet
ApplicationSet是Application的高级版,支持generators语法,批量创建Application
支持的generators有:
- List generator:从定义的列表中获取
- Cluster generator:从argocd定义的集群列表种获取
- Git generator:从git仓库获取定义的资源
- Matrix generator:把其它两种generator产生的参数组合起来
3.4 Cluster
即k8s集群列表,Argo CD部署所在集群作为内置集群自动添加,还可以添加外部集群
3.5 Repositories
部署清单Repository,支持ssh、https、Github App方式,其中https方式支持git、helm类型
4. Argo CD部署
Argo CD有两种部署模式:多租户和Core
4.1 多租户模式
多租户模式是最通用部署模式,适用于同一组织下的多个开发团队协同开发. 用户可以使用web UI或argocd命令行
4.1.1 非高可用
非高可用模式,不建议在生产使用. 通常用于测试和演示环境. 提供两种部署形式:
- install.yaml:具有cluster-admin权限的标准部署方式, 可以使用这个清单文件部署argocd,然后使用argocd在同个集群中部署应用程序. 也还是支持使用其它凭据(如kubeconfig)部署应用到外部集群.
- namespace-install.yaml:命名空间权限级别的部署方式,适用于在 同个集群为多个开发团队部署多个argocd实例,然后每个argocd实例部署应用到外部集群。也还是支持使用其它凭据(如kubeconfig)部署应用到同个集群. 这种方式下crd需要额外单独安装.
4.1.2 高可用
高可用模式,推荐在生产使用. 同样提供两种部署形式:
- ha/install.yaml:与上面的Install.yaml类似,但组件配置了多副本
- ha/namespace-install.yaml:与上面的namespace-install.yaml类似,但组件配置了多副本
4.2 Core模式
Core模式最适用于集群管理员独立使用Argo CD,不需要多租户能力. 这种部署方式只安装更少的组件,API Server、UI都不需要安装,同时每个组件没有高可用.终端用户可以通过以下命令行操作获得k8s权限来管理Argo CD.
# kubectl config set-context --current --namespace=argocd
# argocd login --core
Web UI还是可以手工启用
# argocd admin dashboard
4.3 Kustomize模式
Argo CD也支持Kustomize模式安装,使用Kustomize patch自定义配置
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd
resources:
- https://raw.githubusercontent.com/argoproj/argo-cd/v2.0.4/manifests/ha/install.yaml
4.4 Helm模式
Argo CD也支持Helm模式安装, Helm chart维护在:argo-helm/charts/argo-cd
5. Argo CD使用
5.1 Argo CD Login
Argo CD CLI下载:https://argo-cd.readthedocs.io/en/stable/cli_installation/
Argo CD admin密码查看
# kubectl get secret -n argocd argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d
[root@devops ~]# argocd login <argocd-server service地址>:443
WARNING: server certificate had error: x509: cannot validate certificate for 10.233.11.240 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context '10.233.11.240:443' updated
5.1 添加外部Cluster
Argo CD添加的外部集群需要存在于kubeconfig中的context
# KUBECONFIG=~/.kube/config:/tmp/231-config kubectl config view --flatten > /tmp/config && mv /tmp/config ~/.kube/config
[root@devops ~]# argocd cluster add kubernetes-admin-231@cluster.local-231
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `kubernetes-admin-231@cluster.local-231` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0001] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0001] ClusterRole "argocd-manager-role" updated
INFO[0001] ClusterRoleBinding "argocd-manager-role-binding" updated
Cluster 'https://xxx.xxx.xxx.231:6443' added
5.2 添加Project
[root@devops ~]# kubectl get appprojects.argoproj.io test-cd -o yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
creationTimestamp: "2022-08-25T02:31:06Z"
generation: 9
name: test-cd
namespace: argocd
resourceVersion: "19661314"
uid: e4736065-d0ca-4622-93ab-948ff7283c43
spec:
clusterResourceWhitelist:
- group: '*'
kind: '*'
description: 测试argocd部署
destinations:
- name: in-cluster
namespace: '*'
server: https://kubernetes.default.svc
- name: kubernetes-admin-231@cluster.local-231
namespace: '*'
server: https://172.16.xxx.xxx:6443
sourceRepos:
- https://git.xxx.com/xxx/charts.git
status: {}
5.2 添加Application
WebUI上依次创建Repositories、Projects、Applications
参考链接
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付