Argo CD学习笔记

Posted by 爱折腾的工程师 on Monday, August 22, 2022

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 高可用

高可用模式,推荐在生产使用. 同样提供两种部署形式:

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 

core-install.yaml部署清单

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

参考链接

「真诚赞赏,手留余香」

爱折腾的工程师

真诚赞赏,手留余香

使用微信扫描二维码完成支付