1.argo介绍
什么是 Argo CD
ArgoCD 是使用 Kubernetes 持续交付的流行工具。它通过不断协调 repo 的状态与实时工作负载,自动将应用程序部署到 Kubernetes 集群中。
GitOps模型是Argo设计中不可或缺的一部分。它使 repo 成为应用程序所需状态的单一事实来源。应用所需的所有 Kubernetes 清单、Kustomize 模板、Helm charts 和配置文件都应提交到您的存储库。这些资源“声明”应用的成功部署。
Argo 将声明的状态与集群中实际运行的状态进行比较,然后应用正确的更改来解决任何差异。此过程可以配置为自动运行,防止集群偏离存储库。每当出现差异时,Argo 都会重新同步状态,例如在您手动运行 Kubectl 命令之后。
Argo带有CLI和Web UI。它支持多租户和多集群环境,与 SSO 提供程序集成,生成审计跟踪,并可以实施复杂的 rollout 策略,例如 Canary 部署和蓝/绿升级。它还提供集成的回滚功能,因此您可以快速从部署故障中恢复
从历史上看,大多数 CI/CD 实现都依赖于推送驱动行为。这需要您将集群连接到 CI/CD 平台,然后在管道中使用 Kubectl 和 Helm 等工具来应用 Kubernetes 的更改
Argo是一个基于拉动的CI / CD系统。它运行在您的 Kubernetes 集群中,并从您的存储库中提取源代码。然后,Argo 无需手动配置管道即可为您应用更改。
此模型比基于推送的工作流更安全。您不必公开集群的 API 服务器或在 CI/CD 平台中存储 Kubernetes credentials。破坏源存储库只会使攻击者能够访问您的代码,而不是你的集群。
为什么选择Argo CD?
应用程序定义、配置和环境应具有声明性和版本控制。应用程序部署和生命周期管理应该是自动化的、可审计的且易于理解的。
快速入门
前置条件
- 安装 kubectl 命令行工具
- 有一个 kubeconfig 文件(默认位置是 ~/.kube/config)
安装命令
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
这将创建一个新的命名空间 argocd ,Argo CD 服务和应用程序资源将驻留在其中。
安装清单包括引用 argocd 命名空间的 ClusterRoleBinding 资源。如果要将Argo CD安装到不同的命名空间中,请确保更新命名空间引用
此默认安装将具有自签名证书,如果不进行一些额外的工作,则无法访问。执行以下操作之一:
- 按照说明配置证书(并确保客户端操作系统信任它)
- 将客户端操作系统配置为信任自签名证书
- 在本指南中的所有 Argo CD CLI 操作上使用 --insecure 标志
Argo的所有组件可能需要几秒钟才能在您的集群中运行。通过使用 Kubectl 列出 argocd 命名空间中的部署来监视进度。
$ kubectl get deployments -n argocd
NAME READY UP-TO-DATE AVAILABLE AGE
argocd-applicationset-controller 1/1 1 1 67s
argocd-dex-server 1/1 1 1 67s
argocd-notifications-controller 1/1 1 1 67s
argocd-redis 1/1 1 1 67s
argocd-repo-server 1/1 1 1 67s
argocd-server 1/1 1 1 67s
Kubectl 端口转发也可用于连接到 API 服务器,而无需公开服务
kubectl port-forward svc/argocd-server -n argocd 8080:443
实际示例:使用 Argo CD 部署到 Kubernetes
让我们使用 Argo 在 Kubernetes 中运行一个基本的 NGINX Web 服务器实例。我们假设您已经可以访问 Kubernetes 集群,并且您的机器上已经拥有可用的 Kubectl 和 Helm CLI。
创建应用的 GitHub 存储库
首先,前往 GitHub 并为您的应用程序创建一个新的存储库。之后,将您的存储库克隆到您的计算机,准备提交您的 Kubernetes 清单
$ git clone https://github.com/<username>/<repo>.git
复制以下 YAML 并将其另存为 deployment.yaml 在存储库中
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: argo-demo
labels:
app.kubernetes.io/name: nginx
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: nginx
template:
metadata:
labels:
app.kubernetes.io/name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- name: http
containerPort: 80
它定义了一个运行三个 NGINX 副本的基本 Kubernetes 部署对象
接下来,复制第二个 YAML 文件并将其保存到 service.yaml 。它会设置负载均衡器服务以在群集外部公开部署
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: argo-demo
spec:
type: LoadBalancer
selector:
app.kubernetes.io/name: nginx
ports:
- protocol: TCP
port: 80
targetPort: http
最后,添加一个将创建应用程序命名空间的清单:
apiVersion: v1
kind: Namespace
metadata:
name: argo-demo
将更改提交到存储库,然后将其推送到 GitHub:
$ git add .
$ git commit -m "Added initial Kubernetes YAML files"
$ git push
您已准备好安装 Argo 并开始部署您的应用程序。
获取 Argo 命令行界面
Argo的CLI允许您从终端与应用程序进行交互。稍后您将需要它来向 Argo 实例注册您的应用程序。
您可以从 GitHub 下载最新的 CLI 版本。为您的平台选择正确的二进制文件,然后使其可执行并将其移动到路径中的某个位置。以下步骤适用于大多数 Linux 系统 - 首先替换最新版本号而不是下面的 2.6.1:
$ wget https://github.com/argoproj/argo-cd/releases/download/v2.6.1/argocd-linux-amd64
$ chmod +x argocd-linux-amd64
$ mv argocd-linux-amd64 /usr/bin/argocd
在登录之前,您需要检索默认管理员用户的密码。这是在Argo的安装过程中自动生成的。可以通过运行以下 argocd 命令来访问它:
使用这些凭据登录到Argo
进入后,直接转到左侧边栏中的“用户信息”项,然后单击屏幕顶部的“更新密码”按钮。按照提示将您的密码更改为唯一的密码
Login to the CLI 登录到命令行界面
要登录到 Argo CLI,请运行 argocd login 并提供 API 服务器的 URL 作为参数:
$ argocd login localhost:8080
与上面遇到的浏览器警告类似,如果您尚未配置自己的TLS,系统将提示您接受Argo的内置自签名证书:
通过键入 y 并按回车键接受提示。然后,系统会要求您输入用户名和密码。CLI 应成功向您的 Argo 实例进行身份验证:
'admin:login' logged in successfully
Context 'localhost:8080' updated
使用 Argo 部署您的应用程序
一切准备就绪,可以开始将应用程序部署到 Argo!首先,运行以下 CLI 命令来注册应用:
$ argocd app create argo-demo \
--repo https://github.com/<username>/<repo>.git \
--path . \
--dest-server https://kubernetes.default.svc \
--dest-namespace argo-demo
application 'argo-demo' created
让我们解释这里发生的事情:
- --repo 标志指定 Git 存储库的 URL。
- --path 标志指示 Argo 在存储库的此路径中搜索 Kubernetes 清单、Helm 图表和其他可部署资产。 此处使用 . 是因为示例清单存储在存储库的根目录中。
- --dest-server 标志指定要部署到的 Kubernetes 群集的 URL。在部署到运行 Argo 的同一群集时,可以使用 kubernetes.default.svc 。
- --dest-namespace 设置应用将部署到的 Kubernetes 命名空间。这应与资源上设置的 metadata.namespace 字段匹配。
您的应用程序现在将在 Argo 中注册。您可以使用 argocd app list 命令检索其详细信息:
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd/argo-demo https://kubernetes.default.svc argo-demo default OutOfSync Missing <none> <none> https://github.com/ilmiont/spacelift-argo-cd-demo.git
该应用程序还显示在Argo UI中:
Your First Sync 您的首次同步
应用显示为“缺失”和“不同步”。创建应用不会自动将其同步到群集中。立即执行同步,让 Argo 应用存储库内容当前定义的目标状态:
$ argocd app sync argo-demo
...
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Namespace argo-demo argo-demo Running Synced namespace/argo-demo created
Service argo-demo nginx Synced Progressing service/nginx created
apps Deployment argo-demo nginx Synced Progressing deployment.apps/nginx created
Namespace argo-demo Synced
同步结果显示在您的终端中。应会看到命名空间、服务和部署对象都同步到群集中,如上面的命令输出所示。所有三个对象的消息都确认它们已成功创建。
重复 apps list 命令以检查应用的新状态
$ argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd/argo-demo https://kubernetes.default.svc argo-demo default Synced Healthy <none> <none> https://github.com/ilmiont/spacelift-argo-cd-demo.git .
现在应用程序已同步且健康!它在Argo UI中也是绿色的:
作为最终证明,请使用 Kubectl 检查应用命名空间中的部署。这应确认 nginx 已启动并运行三个副本:
$ kubectl get deployment -n argo-demo
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 3/3 3 3 7m56s
Syncing App Updates 同步应用更新
现在,让我们对应用进行更改。修改 deployment.yaml 中的 spec.replicas 字段,以便部署中现在有五个 Pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: argo-demo
labels:
app.kubernetes.io/name: nginx
spec:
replicas: 5
...
提交并推送更改
$ git add .
$ git commit -m "Run 5 replicas"
$ git push
接下来,重复 argocd app sync 命令以将更改应用于群集。或者,您可以单击用户界面中的“同步”按钮。
Argo 从存储库刷新应用的目标状态,然后执行操作来转换实时状态。部署已重新配置,现在运行五个 Pod:
$ kubectl get deployment -n argo-demo
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 5/5 5 5 12m
启用自动同步
在重复同步命令之前,对五个副本的更改不适用。不过,Argo 可以自动同步存储库中的更改,无需每次都发出命令。这完全自动化了您的交付工作流程。
您可以通过单击用户界面中的“应用程序详细信息”按钮并向下滚动到“同步策略”部分来激活应用程序的自动同步。单击“启用自动同步”按钮。
还可以通过运行以下命令使用 CLI 启用自动同步:$ argocd app set argo-demo --sync-policy automated
默认情况下,自动同步每三分钟运行一次。如果需要更频繁的部署,您可以通过修改 Argo 的配置映射来更改此值。
总结
Argo CD 是 Kubernetes 的持续交付工具。它提供基于拉取的 GitOps 工作流,用于自动将源存储库与群集内部署同步。虽然本文只介绍了基础知识,但 Argo 为您提供了一个完整的工具包,用于部署应用程序、检查其运行状况以及快速回滚任何失败的更改。