写点什么

GitOps 工具 Argo CD 实战

用户头像
雪雷
关注
发布于: 2020 年 08 月 21 日
GitOps工具Argo CD实战

背景


GitOps 的概念最初来源于 Weaveworks 的联合创始人 Alexis 在 2017 年 8 月发表的一篇博客 [GitOps - Operations by Pull Request](https://links.jianshu.com/go?to=https%3A%2F%2Fyq.aliyun.com%2Fgo%2FarticleRenderRedirect%3Furl%3Dhttps%3A%2F%2Fwww.weave.works%2Fblog%2Fgitops-operations-by-pull-request)。其是开发者和运维在集群上线和更新在 Kubernetes 运行的复杂应用程序的一种快速、安全的方法。Alexis 的文章文章介绍了 Weaveworks 的工程师如何以 Git 作为事实的唯一真实来源,部署、管理和监控基于 Kubernetes 的 SaaS 应用。


核心:


  • 对于 K8s 和其他云原生技术 GitOps 可谓一个操作模型,提供了一组最佳实践,对于容器集群和应用的统一部署,管理和监控。


  • 端到端的 CICD 管道和 git 工作流都应用于操作和开发通向管理应用程序的开发人员体验之路;


近来研究 GitOps 工具 Arog,一文走入 GitOps 之门,体验为开发人员带来的将上线部署结合在 Git 中的畅快体验,git commit/reserve 的上线发布与回滚变的如此简单。

一 概述


1.1 什么时候 Argo CD


argo CD 对 k8s 是一个声明式的,gitops 的持续集成工具。


1.2 为什么使用 Argo CD


应用的定义/配置和环境应该被声明和版本管理,应用程序部署和生命周期管理应该是自动化的,可审核的且易于理解的。


1.3 使用


1.3.1 工作方式


Argo CD 遵循 GitOps 模式,该模式使用 Git 存储库作为定义所需应用程序状态的真实来源。Kubernetes 清单可以通过几种方式指定:


  • kustomize applications

  • helm charts

  • ksonnet applications

  • jsonnet files

  • Plain directory of YAML/json manifests

  • Any custom config management tool configured as a config management plugin


Argo CD 可在指定的目标环境中自动部署所需的应用程序状态。应用程序部署可以在 Git 提交时跟踪对分支,标签的更新,或固定到清单的特定版本。有关可用的不同跟踪策略的更多详细信息,请参见跟踪策略。


1.3.2 架构



Argo CD 被实现为 kubernetes 控制器,该控制器连续监视正在运行的应用程序,并将当前的活动状态与所需的目标状态(在 Git 存储库中指定)进行比较。处于活动状态偏离目标状态的已部署应用程序被视为 OutOfSync。Argo CD 报告并可视化差异,同时提供了自动或手动将实时状态同步回所需目标状态的功能。在 Git 存储库中对所需目标状态所做的任何修改都可以自动应用并反映在指定的目标环境中。


二 基础概念


在有效使用 Argo CD 之前,有必要了解该平台所基于的基础技术。还需要了解向您提供的功能以及如何使用它们。以下部分提供了一些有用的链接,可以帮助您理解。


2.1 了解基础


2.1.1 k8s 知识点



2.1.2 自定义模版



2.1.3 jenkins 集成



三 核心概念


假设您熟悉核心的 Git,Docker,Kubernetes,持续交付和 GitOps 概念。


  • Application:清单定义的一组 Kubernetes 资源。这是一个自定义资源定义(CRD)。


  • Application source type:使用哪个工具来构建应用程序

  • Target state:应用程序的期望状态,由 Git 存储库中的文件表示。

  • Live state:该应用程序的实时状态。部署了哪些 Pod 等。

  • Sync status:实时状态是否与目标状态匹配。部署的应用程序是否与 Git 所说的相同?

  • Sync:使应用程序移至其目标状态的过程。例如。通过将更改应用于 Kubernetes 集群。

  • Refresh:将 Git 中的最新代码与实时状态进行比较。找出有什么不同。

  • Health:应用程序的运行状况是否正常运行?它可以满足请求吗?

  • Tool:从文件目录创建清单的工具。例如。Kustomize 或 Ksonnet。请参阅应用程序源类型。


四 安装部署


4.1 安装 Argo CD


kubectl create namespace argocdkubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
复制代码


这将创建一个新的命名空间 argocd,Argo CD 服务和应用程序资源将驻留在该命名空间中。


4.2 下载 Argo CD CLI


https://github.com/argoproj/argo-cd/releases/latest.下载 Argo CD 工具


  • mac 可以利用如下方式进行安装


brew tap argoproj/tapbrew install argoproj/tap/argocd
复制代码


  • Linux 安装


VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64chmod +x /usr/local/bin/argocd
复制代码


可以参考:https://argoproj.github.io/argo-cd/cli_installation/


4.3 访问 Argo CD API server


默认情况下,Argo CD API 服务器未使用外部 IP 公开。要访问 API 服务器,请选择以下技术之一以公开 Argo CD API 服务器:


端口转发


[root@master ~]# kubectl port-forward svc/argocd-server -n argocd --address 0.0.0.0 8080:443
复制代码


4.4 通过 CLI 登录 Argo


初始密码将自动生成为 Argo CD API 服务器的容器名称。可以使用以下命令进行检索:


[root@master ~]# kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2argocd-server-656f9b895b-bfjvw
复制代码


使用用户名 admin 和上面的密码,登录到 Argo CD 的 IP 或主机名:


argocd login <ARGOCD_SERVER>
复制代码


使用以下命令更改密码:


argocd account update-password
复制代码


# 登录[root@master ~]# argocd login localhost:8080WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? yesUsername: adminPassword: 'admin' logged in successfullyContext 'localhost:8080' updated# 修改密码[root@master ~]# argocd account update-password*** Enter current password: *** Enter new password: *** Confirm new password: Password updatedContext 'localhost:8080' updated
复制代码


4.5 注册集群以将应用程序部署到(可选)


此步骤将群集的凭据注册到 Argo CD,仅在部署到外部群集时才需要。在内部进行部署(到与 Argo CD 运行所在的同一集群)时,应将 https://kubernetes.default.svc 用作应用程序的 K8s API 服务器地址。


首先列出当前 kubconfig 中的所有集群上下文:


argocd cluster add
复制代码


上面的命令将 ServiceAccount(argocd-manager)安装到该 kubectl 上下文的 kube-system 命名空间中,并将服务帐户绑定到管理员级别的 ClusterRole。Argo CD 使用此服务帐户令牌执行其管理任务(即部署/监视)。


可以修改 argocd-manager-role 角色的规则,使其仅具有对一组有限的名称空间,组和种类的创建,更新,修补,删除特权。但是,在群集作用域中,获取,列出,监视特权是 Argo CD 起作用所必需的。


4.6 从 Git 存储库创建应用程序


一个 guestbook 的应用来仓库保护示例,来说明 Argo CD 如何去工作:https://github.com/argoproj/argocd-example-apps.git



4.6.1 通过 CLI 创建 APP


You can access Argo CD using port forwarding: add --port-forward-namespace argocd flag to every CLI command or set ARGOCD_OPTS environment variable: export ARGOCD_OPTS='--port-forward-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
复制代码


4.6.2 通过 web UI 创建 APP


打开浏览器进入 Argo CD 外部 UI,然后通过在浏览器中访问 IP /主机名登录并使用在步骤 4 中设置的凭据。



给您的应用命名为留言簿,使用项目默认值,并将同步策略保留为“手动”:



Connect the https://github.com/redhatxl/argocd-example-apps.git repo to Argo CD by setting repository url to the github repo url, leave revision as HEAD, and set the path to guestbook:


注意:仓库可以使用我 fork 的,目前以及更改了镜像地址,可以正常拉取,



对于目标,将集群设置为集群内,并将名称空间设置为默认值:



填写完以上信息后,请单击 UI 顶部的“创建”以创建留言簿应用程序:



4.7 同步(部署)应用


创建留言簿应用程序后,您现在可以查看其状态:


[root@master ~]# argocd app get guestbookName:               guestbookProject:            defaultServer:             https://kubernetes.default.svcNamespace:          defaultURL:                https://localhost:8080/applications/guestbookRepo:               https://github.com/redhatxl/argocd-example-apps.gitTarget:             HEADPath:               guestbookSyncWindow:         Sync AllowedSync Policy:        <none>Sync Status:        OutOfSync from HEAD (4973f15)Health Status:      Missing
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui OutOfSync Missing apps Deployment default guestbook-ui OutOfSync Missing
复制代码


由于尚未部署应用程序,并且尚未创建 Kubernetes 资源,因此应用程序状态最初处于 OutOfSync 状态。要同步(部署)应用程序,请运行:


[root@master ~]# argocd app sync guestbookTIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME    STATUS    HEALTH        HOOK  MESSAGE2020-01-24T12:59:13+08:00            Service     default          guestbook-ui  OutOfSync  Missing              2020-01-24T12:59:13+08:00   apps  Deployment     default          guestbook-ui  OutOfSync  Missing              2020-01-24T12:59:14+08:00            Service     default          guestbook-ui    Synced  Healthy              
Name: guestbookProject: defaultServer: https://kubernetes.default.svcNamespace: defaultURL: https://localhost:8080/applications/guestbookRepo: https://github.com/redhatxl/argocd-example-apps.gitTarget: HEADPath: guestbookSyncWindow: Sync AllowedSync Policy: <none>Sync Status: Synced to HEAD (4973f15)Health Status: Progressing
Operation: SyncSync Revision: 4973f150497aa18bc5fbd81b19102db2469eb6f0Phase: SucceededStart: 2020-01-24 12:59:11 +0800 CSTFinished: 2020-01-24 12:59:12 +0800 CSTDuration: 1sMessage: successfully synced (all tasks run)
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui Synced Healthy service/guestbook-ui createdapps Deployment default guestbook-ui Synced Progressing deployment.apps/guestbook-ui created
复制代码



此命令从存储库中检索清单,并对清单执行 kubectl 应用。该留言簿应用程序现在正在运行,您现在可以查看其资源组件,日志,事件和评估的健康状态:


部署完成后状态:




[root@master ~]# kubectl  get all -l app=guestbook-uiNAME                                READY   STATUS    RESTARTS   AGEpod/guestbook-ui-7bc795dc8c-m69fl   1/1     Running   0          3m6s
NAME DESIRED CURRENT READY AGEreplicaset.apps/guestbook-ui-7bc795dc8c 1 1 1 3m6s
复制代码


修改 guestbook 的访问方式为 NodePort




五 操作手册


5.1 概述


本指南适用于希望为其他开发人员安装和配置 Argo CD 的管理员和操作员。


5.2 架构概述



5.2.1 API Server


API 服务器是 gRPC / REST 服务器,它公开了 Web UI,CLI 和 CI / CD 系统使用的 API。它具有以下职责:


  • 应用管理和状态报告

  • 应用调用操作(同步,回滚,用户定义)

  • 仓库和集群认证管理

  • 向外部身份提供者的身份验证和身份验证委派

  • RBAC 强制执行

  • 监听/转发 Git webhook events


5.2.2 Repository Server


仓库服务是一个内部的服务,维护了一个本地的 git 仓库缓存了应用的 manifests,利用他来生成和返回 kubernetes 的 manifests 当提供一下的输入的时候


  • 仓库 URL

  • 版本(commit,tag,branch)

  • 应用补丁

  • 模版设置


5.2.3 Application Controller


应用控制器是一个 k8s 的控制器,利用他来持续的监控正在运行的应用和对比当前的状态,和存活的状态分配已经期望的目标状态(来源于制定的 repo), 他检测 outofsync 应用状态和可选的任务,它调用任何用户自定义的 hooks 对于声明周期事件


5.3 声明设置


5.3.1 快速参考


可以使用 Kubernetes 清单声明性地定义 Argo CD 应用程序,项目和设置。


| Name | Kind | Description |

| :----------------------------------------------------------- | :---------- | :----------------------------------------------------------- |

| argocd-cm.yaml | ConfigMap | General Argo CD configuration |

| argocd-secret.yaml | Secret | Password, Certificates, Signing Key |

| argocd-rbac-cm.yaml | ConfigMap | RBAC Configuration |

| argocd-tls-certs-cm.yaml | ConfigMap | Custom TLS certificates for connecting Git repositories via HTTPS (v1.2 and later) |

| argocd-ssh-known-hosts-cm.yaml | ConfigMap | SSH known hosts data for connecting Git repositories via SSH (v1.2 and later) |

| application.yaml | Application | Example application spec |

| project.yaml | AppProject | Example project spec |


5.3.2 应用


Application CRD 是 Kubernetes 资源对象,代表环境中已部署的应用程序实例。它由两个关键信息定义:


  • 对 Git 中所需状态的源引用(存储库,修订版,路径,环境)对


  • 目标集群和名称空间的目标引用。


最低的应用程序规范如下:


apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata:  name: guestbook  namespace: argocdspec:  project: default  source:    repoURL: https://github.com/argoproj/argocd-example-apps.git    targetRevision: HEAD    path: guestbook  destination:    server: https://kubernetes.default.svc    namespace: guestbook
复制代码


参考 application.yaml 查看附加字段


名称空间必须与 Argo cd 的名称空间匹配,通常为 argocd。


默认情况下,删除应用程序将不会执行级联删除,从而删除其资源。如果需要这种行为,则必须添加终结器-您可能不希望这样做。


您可以创建一个可以创建其他应用程序的应用程序,而该应用程序又可以创建其他应用程序。这样,您就可以声明性地管理可以协调部署和配置的一组应用程序。请参阅群集引导。


AppProject CRD 是 Kubernetes 资源对象,代表应用程序的逻辑分组。它由以下关键信息定义:


  • sourceRepos 引用项目中的应用程序可以从中提取清单的存储库。

  • 目标引用项目中的应用程序可以部署到的群集和名称空间。

  • 实体的角色列表及其在项目中对资源的访问权限的定义。


参考链接


  • https://argoproj.github.io/argo-cd/?spm=a2c4e.10696291.0.0.6fc419a4zmeq9o


发布于: 2020 年 08 月 21 日阅读数: 239
用户头像

雪雷

关注

stay hungry stay foolish 2019.08.16 加入

Devops,python,shell,云原生,云架构,kubernetes https://github.com/redhatxl

评论

发布
暂无评论
GitOps工具Argo CD实战