工作原理:
Argo CD遵循GitOps模式,使用Git存储库作为定义应用程序期望状态的数据源。
Kubernetes应用清单可以通过以下几种方式指定:
kustomize应用
helm应用
ksonnet应用
jsonnet
带有yaml|json清单的目录
Argo CD可以在指定的目标环境中自动部署、维护期望的应用程序状态,该期望状态由清单文件定义。应用程序清单版本可以基于Git提交时跟踪对分支、tag或固定到特定版本的Git commit。
Argo CD基于kubernetes控制器实现,它持续监控运行中的应用程序,并将当前的活动状态与期望的目标状态(如Git repo中所指定的)进行比较。如果已部署的应用程序的活动状态偏离目标状态,则将被视为OutOfSync。Argo CD可视化展现程序状态差异,同时提供自动或手动同步工具。
特性:
将应用程序自动部署到指定的目标环境
支持多种应用配置管理工具/模板(Kustomize, Helm, Ksonnet, Jsonnet, plain-YAML)
能够管理和部署到多个k8s集群
单点登录
用于授权的多租户和RBAC策略
回滚至Git仓库中指定的commit
应用程序资源的运行状况分析
自动配置漂移检测和可视化
自动/手动同步应用至期望状态
提供应用程序活动的实时视图的Web UI
用于自动化和CI集成的CLI
Webhook集成(GitHub, BitBucket, GitLab)
PreSync, Sync, PostSync钩子来支持复杂应用(例如蓝/绿和金丝雀的升级)
应用程序事件审计和追踪API调用
Prometheus指标
覆盖Git中ksonnet/helm的参数
架构:
Argo CD 的主要职责是 CD(Continuous Delivery,持续交付),将应用部署到 Kubernetes 等环境 中,而 CI(Continuous Integration,持续集成)主要是交给 Jenkins,Gitlab CI 等工具来完成。
安装:
(1)演示安装非HA argocd
模板位置:raw.githubusercontent.com/argoproj/argo-cd/v2.10.4/manifests/install.yaml
kubectl create namespace argocd
kubectl apply -n argocd -f install.yaml
(2)从github下载argocd cli工具
github.com/argoproj/argo-cd/releases/v2.10.4/download/argocd-linux-amd64
chmod +x /usr/local/bin/argocd
(3)默认情况下, Argo CD 服务不对外暴露服务,这里使用以下命令通过 NodePort 服务的方式暴露 Argo CD 到集群外部:
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
浏览器输入 <节点 IP>:NodePort 访问 Argo CD。
(4)默认情况下 admin 帐号的初始密码是自动生成的,会以明文的形式存储在 Argo CD 安装的命名空间中 名为 argocd-initial-admin-secret 的 Secret 对象下的 password 字段下,可以用下面的命令获取:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
也可以使用argocd cli获取:
argocd admin initial-password -n argocd
部署应用:
(1)登录webUI,用户名admin,密码为上面查询的内容
(2)登陆后可以修改admin默认密码
(3)ArgoCD 准备添加REPO(仓库)
(4)ArgoCD 创建application (手动策略、自动创建命名空间、指定仓库与集群)
Application Name: 自定义的应用名。
Project: 使用默认创建好的 default 项目。
SYNC POLICY: 同步方式,可以选择自动或者手动,这里我们选择手动同步。
PRUNE LAST:可以选择是否删除在git中移除的资源,如某个git版本中创建了一个svc,随后又删除了,如果不勾选该选项,则argocd不会自动删除该svc
SKIP SCHEMA VALIDATION:跳过语法检查,不建议开启
AUTO-CREATE NAMESPACE:可以设置如果对应的namespace不存在的话是否自动创建
APPLY OUT OF SYNC ONLY:类似于增量部署而不是全量部署,仅部署和git版本中不一样的资源,而不是全部重新部署一次,可以降低K8S集群的压力
REPLACE:会将部署的命令从默认的kubectl apply变更为kubectl replace/create,可以解决部分资源修改之后无法直接apply部署的问题,同时也有可能会导致资源的重复创建
RETRY:可以设定部署失败后重试的次数和频率
Repository URL: 项目的 Git 地址。
Revision: 分支名。
Path: yaml 资源文件所在的相对路径。
Cluster URL: Kubernetes API Server 的访问地址,由于 Argo CD 和下发应用的 Kubernetes 集群是同 一个,因此可以直接使用 kubernetes.default.svc 来访问。
Namespace: 部署应用的命名空间。
(5)创建完成后如下图所示,此时处于 OutOfSync 的状态:由于设置的是手动同步,因此需要点一下下面的 SYNC 进行同步:
(6)在弹出框点击 SYNCHRONIZE,确认同步:
(7)部署成功
(8)在 Argo CD 上点击应用进入查看详情,如下图:
版本升级:
(1)修改nginx.yaml模板镜像版本号,提交git操作。
(2)ArgoCD会周期性拉取一次git仓库的内容以检测manifests的变化。如果等不及可以点击 Refresh,Argo CD 会去立即获取最新的资源 文件。当与实际应用状态不一致时,会更新成OutOfSync。
点击SYNC升级新版本
- 查看事件更新成功
版本回退:
(1)升级完成后,可以查看历史版本记录
(2)假设刚刚上线的 v2 版本出现了问题,需要回滚回 v1 版本,那么可以选中 v1 版本,然后点击 Rollback 进行回滚。
(3)等待一会可以看到此时已经回滚成功,此时 Pod 是 v1 版本的,并且由于此时线上的版本并不是 Git 仓 库中最新的版本,因此此时同步状态是 OutOfSync