认识 ArgoCD
ArgoCD
官网: https://argo-cd.readthedocs.io/en/stable/
应用程序的定义、配置和环境应该是声明式的,并受版本控制。应用程序部署和生命周期管理应该是自动化的、可审计的,并且易于理解。
Argo CD遵循GitOps模式,使用Git存储库作为定义所需应用程序状态的真实源。Kubernetes清单可以通过几种方式指定:
- kustomize应用程序
- helm charts
- jsonnet files
- Plain directory of YAML/json manifests
- 任何配置为配置管理插件的自定义配置管理工具
Argo CD在指定的目标环境中自动部署所需的应用程序状态。应用程序部署可以在Git提交时跟踪分支、标记或固定到特定版本的清单的更新。有关可用的不同跟踪策略的更多详细信息,请参阅跟踪策略。
应用程序控制器是一个 Kubernetes 控制器,它持续监控正在运行的应用程序并将当前的实时状态与所需的目标状态(如 repo 中指定)进行比较。它检测OutOfSync应用程序状态并有选择地采取纠正措施。它负责为生命周期事件(PreSync、Sync、PostSync)调用任何用户定义的挂钩
架构概述
1、核心概念
假设您熟悉核心 Git、Docker、Kubernetes、持续交付和 GitOps 概念。以下是一些特定于 Argo CD 的概念。
- 应用程序清单定义的一组 Kubernetes 资源。这是自定义资源定义 (CRD)。
- 应用程序源类型用于构建应用程序的工具。
- 目标状态应用程序的期望状态,由 Git 存储库中的文件表示。
- 实时状态该应用程序的实时状态。部署了哪些 pod 等。
- 同步状态实时状态是否与目标状态匹配。部署的应用程序是否与 Git 所说的一样?
- 同步使应用程序移动到其目标状态的过程。例如,通过将更改应用于 Kubernetes 集群。
- 同步操作状态同步是否成功。
- 刷新将 Git 中的最新代码与实时状态进行比较。弄清楚有什么不同。
- Health应用程序的健康状况,是否正常运行?它可以满足请求吗?
- 工具从文件目录创建清单的工具。例如 Kustomize。请参阅应用程序源类型。
- 配置管理工具请参阅工具。
- 配置管理插件自定义工具。
2、安装部署argocd
Argo CD 有两种安装类型:多租户和核心。
多租户部署
多租户安装是安装 Argo CD 最常见的方式。这种类型的安装通常用于为组织中的多个应用程序开发团队提供服务,并由一个平台团队维护。
最终用户可以使用 Web UI 或argocdCLI 通过 API 服务器访问 Argo CD。argocd必须使用命令配置 CLI (argocd login <server-host>在此处了解更多信息)。
提供了两种类型的安装清单:
非高可用性:
不推荐用于生产。这种类型的安装通常在评估期间用于演示和测试。
- install.yaml - 具有集群管理员访问权限的标准 Argo CD 安装。如果您计划使用 Argo CD 在运行 Argo CD 的同一集群(即 kubernetes.svc.default)中部署应用程序,请使用此清单集。它仍然可以使用输入的凭据部署到外部集群。
- namespace-install.yaml - Argo CD 安装只需要命名空间级别的权限(不需要集群角色)。如果您不需要 Argo CD 在运行 Argo CD 的同一集群中部署应用程序,并且将仅依赖于输入的集群凭据,请使用此清单集。使用这组清单的一个例子是,如果您为不同的团队运行多个 Argo CD 实例,其中每个实例都会将应用程序部署到外部集群。仍然可以使用输入的凭证(即 )部署到同一个集群(kubernetes.svc.default)argocd cluster add <CONTEXT> --in-cluster --namespace <YOUR NAMESPACE>。
注意:Argo CD CRD 不包含在namespace-install.yaml中。并且必须单独安装。CRD 清单位于manifests/crds目录中。使用以下命令安装它们: kubectl apply -k https://github.com/argoproj/argo-cd/manifests/crds\?ref\=stable
高可用性:
建议将高可用性安装用于生产用途。该捆绑包包含相同的组件,但针对高可用性和弹性进行了调整。
- ha/install.yaml - 与 install.yaml 相同,但支持的组件有多个副本。
- ha/namespace-install.yaml - 与 namespace-install.yaml 相同,但支持的组件有多个副本。
核心部署
核心安装最适合独立使用 Argo CD 且不需要多租户功能的集群管理员。此安装包括更少的组件并且更易于设置。该捆绑包不包括 API 服务器或 UI,并安装每个组件的轻量级(非 HA)版本。
最终用户需要 Kubernetes 访问权限来管理 Argo CD。argocd必须使用以下命令配置 CLI :
kubectl config set-context --current --namespace=argocd # change current kube context to argocd namespace argocd login --core
Web UI 也可用,可以使用argocd admin dashboard命令启动。
这将创建一个新的名称空间argocd, Argo CD服务和应用程序资源将驻留在其中
kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
如果您对UI, SSO,多集群功能不感兴趣,那么您可以只安装核心Argo CD组件:
kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/core-install.yaml
定制化¶
Argo CD 清单也可以使用 Kustomize 安装。建议将清单作为远程资源包含在内,并使用 Kustomize 补丁应用额外的自定义。
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: argocd resources: - github.com/argoproj/argo-cd/manifests/ha/base?ref=v2.6.2
Helm安装
Argo CD 可以使用Helm安装。Helm chart 目前由社区维护,可在 argo-helm/charts/argo-cd获取。
支持的版本
与 Kubernetes 项目类似,Argo CD 在任何给定时间点支持的版本都是 N 和 N-1 次要版本的最新补丁版本。这些 Argo CD 版本在 Kubernetes 本身支持的相同版本的 Kubernetes 上得到支持(通常是最后 3 个发布的版本)。
本质上,Argo CD 项目遵循与 Kubernetes 相同的支持方案,但针对 N、N-1,而 Kubernetes 支持 N、N-1、N-2 版本。
例如,如果 ArgoCD 的最新次要版本为 2.4.3 和 2.3.5,而支持的 Kubernetes 版本为 1.24、1.23 和 1.22,则支持以下组合:
- Kubernetes 1.24 上的 Argo CD 2.4.3
- Kubernetes 1.23 上的 Argo CD 2.4.3
- Kubernetes 1.22 上的 Argo CD 2.4.3
- Kubernetes 1.24 上的 Argo CD 2.3.5
- Kubernetes 1.23 上的 Argo CD 2.3.5
- Kubernetes 1.22 上的 Argo CD 2.3.5
Argo CD CLI
从https://github.com/argoproj/argo-cd/releases/latest下载最新的 Argo CD 版本。可以通过CLI 安装文档找到更详细的安装说明。
在 Mac、Linux 和 WSL Homebrew 中也可用:
https://github.com/argoproj/argo-cd/releases/download/v2.7.4/argocd-windows-amd64.exe
brew install argocd
Mac (M1)
VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/') curl -sSL -o argocd-darwin-arm64 https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-darwin-arm64 sudo install -m 555 argocd-darwin-arm64 /usr/local/bin/argocd rm argocd-darwin-arm64
ArchLinux
pacman -S argocd
Download latest version
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64 sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd rm argocd-linux-amd64
Download concrete version
Set VERSION replacing <TAG> in the command below with the version of Argo CD you would like to download:
VERSION=<TAG> # Select desired TAG from https://github.com/argoproj/argo-cd/releases curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64 sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd rm argocd-linux-amd64
访问 Argo CD API 服务器
默认情况下,Argo CD API 服务器不会暴露在外部 IP 中。要访问 API 服务器,请选择以下技术之一来公开 Argo CD API 服务器:
服务类型负载均衡器¶
将 argocd-server 服务类型更改为LoadBalancer:
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
转发端口
Kubectl 端口转发也可用于连接到 API 服务器而不暴露服务。
kubectl port-forward svc/argocd-server -n argocd 8080:443
然后可以使用 https://localhost:8080 访问 API 服务器
使用 CLI 登录
该admin帐户的初始密码是自动生成的,并以明文形式存储在以 Argo CD 安装命名空间password命名的秘密argocd-initial-admin-secret 字段中。您可以使用 CLI 简单地检索此密码argocd:
argocd admin initial-password -n argocd
警告: argocd-initial-admin-secret更改密码后,您应该从 Argo CD 命名空间中删除。这个秘密除了以明文形式存储最初生成的密码并可以随时安全地删除外,没有其他用途。如果必须重新生成新的管理员密码,Argo CD 将根据需要重新创建它。
使用上面的用户名admin和密码,登录到 Argo CD 的 IP 或主机名:
argocd login <ARGOCD_SERVER>
笔记: CLI 环境必须能够与 Argo CD API 服务器通信。如果它不能像上面第 3 步中描述的那样直接访问,您可以告诉 CLI 通过以下机制之一使用端口转发来访问它:1)--port-forward-namespace argocd向每个 CLI 命令添加标志;或 2) 设置ARGOCD_OPTS环境变量:export ARGOCD_OPTS='--port-forward-namespace argocd'.
argocd更改密码:
argocd account update-password
获取完整的用户列表
argocd account list
获取特定用户详细信息
argocd account get --account <username>
设置用户密码
# if you are managing users as the admin user, <current-user-password> should be the current admin password. argocd account update-password \ --account <name> \ --current-password <current-user-password> \ --new-password <new-user-password>
生成授权令牌
# if flag --account is omitted then Argo CD generates token for current user argocd account generate-token --account <username>
登录失败限速¶
为了防止密码暴力破解,Argo CD 在失败次数过多后拒绝登录尝试。以下环境变量可用于控制限制设置:
- ARGOCD_SESSION_FAILURE_MAX_FAIL_COUNT:Argo CD 开始拒绝登录尝试之前的最大登录失败次数。默认值:5。
- ARGOCD_SESSION_FAILURE_WINDOW_SECONDS:失败窗口的秒数。默认值:300(5 分钟)。如果将其设置为 0,则禁用失败窗口并且在连续 10 次登录失败后登录尝试将被拒绝,无论它们发生的时间范围如何。
- ARGOCD_SESSION_MAX_CACHE_SIZE:缓存中允许的最大条目数。默认值:1000
- ARGOCD_MAX_CONCURRENT_LOGIN_REQUESTS_COUNT:限制并发登录请求的最大数量。如果设置为 0,则禁用限制。默认值:50。
3、注册一个集群来部署应用程序
此步骤将集群的凭据注册到 Argo CD,并且仅在部署到外部集群时才需要。在内部部署时(到运行 Argo CD 的同一集群),应使用 https://kubernetes.default.svc 作为应用程序的 K8s API 服务器地址。
首先列出当前 kubeconfig 中的所有集群上下文:
kubectl config get-contexts -o name
从列表中选择上下文名称并将其提供给argocd cluster add CONTEXTNAME. 例如,对于 docker-desktop 上下文,运行:
argocd cluster add docker-desktop
上面的命令将 ServiceAccount ( argocd-manager) 安装到该 kubectl 上下文的 kube-system 命名空间中,并将服务帐户绑定到管理员级别的 ClusterRole。Argo CD 使用此服务帐户令牌来执行其管理任务(即部署/监控)。
笔记: 可以修改角色的规则argocd-manager-role,使其仅对一组有限的命名空间、组、种类具有 , create, update,patch特权delete。但是get, Argo CD 的list集群watch范围需要特权才能运行。
4. 从 Git 存储库创建应用程序¶
https://github.com/argoproj/argocd-example-apps.git提供了一个包含留言簿应用程序的示例存储库 ,以演示 Argo CD 的工作原理。
通过 CLI 创建应用程序¶
首先,我们需要将当前命名空间设置为运行以下命令的 argocd:
kubectl config set-context --current --namespace=argocd
使用以下命令创建示例留言簿应用程序:
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
通过 UI 创建应用程序¶
打开浏览器访问 Argo CD 外部 UI,并通过在浏览器中访问 IP/主机名并使用在第 4 步中设置的凭据登录。
登录后点击+New App按钮,如下图:
为您的应用命名guestbook,使用项目default,并将同步策略保留为Manual:
通过将存储库 url 设置为 github 存储库 url,将https://github.com/argoproj/argocd-example-apps.git存储库连接到 Argo CD,将修订保留为HEAD,并将路径设置为guestbook:
对于Destination,将集群 URL 设置为https://kubernetes.default.svc(或in-cluster集群名称)并将命名空间设置为default:
填写以上信息后,点击UI上方的Createguestbook创建应用:
5.同步(部署)应用程序
通过 CLI 同步
创建应用程序后,您现在可以查看其状态:
$ argocd app get guestbook Name: guestbook Server: https://kubernetes.default.svc Namespace: default URL: https://10.97.164.88/applications/guestbook Repo: https://github.com/argoproj/argocd-example-apps.git Target: Path: guestbook Sync Policy: <none> Sync Status: OutOfSync from (1ff8a67) Health Status: Missing GROUP KIND NAMESPACE NAME STATUS HEALTH apps Deployment default guestbook-ui OutOfSync Missing Service default guestbook-ui OutOfSync Missing
应用状态为初始OutOfSync状态,因为应用尚未部署,还没有创建 Kubernetes 资源。要同步(部署)应用程序,请运行:
argocd app sync guestbook
此命令从存储库中检索清单并执行kubectl apply清单中的一个。留言簿应用程序现在正在运行,您现在可以查看其资源组件、日志、事件和评估的运行状况。
通过 UI 同步¶
6、备份恢复
使用argocd admin导入和导出所有 Argo CD 数据。
确保您已~/.kube/config指向您的 Argo CD 集群。
找出您正在运行的 Argo CD 版本:
argocd version | grep server # ... export VERSION=v1.0.1
导出到备份
docker run -v ~/.kube:/home/argocd/.kube --rm argoproj/argocd:$VERSION argocd admin export > backup.yaml
从备份导入
docker run -i -v ~/.kube:/home/argocd/.kube --rm argoproj/argocd:$VERSION argocd admin import - < backup.yaml
笔记 : 如果您在不同于默认的命名空间上运行 Argo CD,请记住传递命名空间参数(-n). 如果您在错误的命名空间中运行,“argocd admin export”不会失败。
7、通过卷安装添加工具
第一种技术是使用一个init容器和一个volumeMount将不同版本的工具复制到 repo-server 容器中。在以下示例中,init 容器使用与 Argo CD 中捆绑的版本不同的版本覆盖 helm 二进制文件:
spec: # 1. Define an emptyDir volume which will hold the custom binaries volumes: - name: custom-tools emptyDir: {} # 2. Use an init container to download/copy custom binaries into the emptyDir initContainers: - name: download-tools image: alpine:3.8 command: [sh, -c] args: - wget -qO- https://storage.googleapis.com/kubernetes-helm/helm-v2.12.3-linux-amd64.tar.gz | tar -xvzf - && mv linux-amd64/helm /custom-tools/ volumeMounts: - mountPath: /custom-tools name: custom-tools # 3. Volume mount the custom binary to the bin directory (overriding the existing version) containers: - name: argocd-repo-server volumeMounts: - mountPath: /usr/local/bin/helm name: custom-tools subPath: helm
有时替换二进制文件是不够的,您需要安装其他依赖项。以下示例从 Dockerfile 构建一个完全自定义的 repo-server,安装生成清单可能需要的额外依赖项。
FROM argoproj/argocd:v2.5.4 # Replace tag with the appropriate argo version # Switch to root for the ability to perform install USER root # Install tools needed for your repo-server to retrieve & decrypt secrets, render manifests # (e.g. curl, awscli, gpg, sops) RUN apt-get update && \ apt-get install -y \ curl \ awscli \ gpg && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \ curl -o /usr/local/bin/sops -L https://github.com/mozilla/sops/releases/download/3.2.0/sops-3.2.0.linux && \ chmod +x /usr/local/bin/sops # Switch back to non-root user USER $ARGOCD_USER_ID
8、Kustomize
The following configuration options are available for Kustomize:
- namePrefix 添加到用于定制应用程序的资源的前缀
- nameSuffix 添加到用于定制应用程序的资源的后缀
- images 一个Kustomize图像覆盖列表
- replicas 一个Kustomize副本覆盖列表
- commonLabels 附加标签的字符串映射
- forceCommonLabels 一个布尔值,它定义了是否允许覆盖现有标签
- commonAnnotations 附加注释的字符串映射
- namespace kubernetes资源命名空间
- forceCommonAnnotations 一个布尔值,它定义了是否允许覆盖现有的注解
- commonAnnotationsEnvsubst 一个布尔值,它允许在注释值中替换环境变量
要对叠加使用Kustomize,请将路径指向叠加。
Tip
如果您正在生成资源,则应该了解如何使用 IgnoreExtraneouscompare option.
在某些情况下,您可能希望从应用程序的整体同步状态中排除资源。例如,如果它们是由工具生成的。这可以通过在你想要排除的资源上添加以下注释来实现
metadata: annotations: argocd.argoproj.io/compare-options: IgnoreExtraneous
参考链接: https://argo-cd.readthedocs.io/en/stable/