作者:阳明 2021-07-04 07:24:48
云计算 Argo CD 是一个为 Kubernetes 而生的,遵循声明式 GitOps 理念的持续部署工具。Argo CD 可在 Git 存储库更改时自动同步和部署应用程序。 

创新互联建站-专业网站定制、快速模板网站建设、高性价比溪湖网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式溪湖网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖溪湖地区。费用合理售后完善,10年实体公司更值得信赖。
Argo CD 是一个为 Kubernetes 而生的,遵循声明式 GitOps 理念的持续部署工具。Argo CD 可在 Git 存储库更改时自动同步和部署应用程序。
Argo CD 遵循 GitOps 模式,使用 Git 仓库作为定义所需应用程序状态的真实来源,Argo CD 支持多种 Kubernetes 清单:
Any custom config management tool configured as a config management plugin
Argo CD 可在指定的目标环境中自动部署所需的应用程序状态,应用程序部署可以在 Git 提交时跟踪对分支、标签的更新,或固定到清单的指定版本。
ArgoCD架构
Argo CD 是通过一个 Kubernetes 控制器来实现的,它持续 watch 正在运行的应用程序并将当前的实时状态与所需的目标状态( Git 存储库中指定的)进行比较。已经部署的应用程序的实际状态与目标状态有差异,则被认为是 OutOfSync 状态,Argo CD 会报告显示这些差异,同时提供工具来自动或手动将状态同步到期望的目标状态。在 Git 仓库中对期望目标状态所做的任何修改都可以自动应用反馈到指定的目标环境中去。
下面简单介绍下 Argo CD 中的几个主要组件:
API 服务:API 服务是一个 gRPC/REST 服务,它暴露了 Web UI、CLI 和 CI/CD 系统使用的接口,主要有以下几个功能:
仓库服务:存储仓库服务是一个内部服务,负责维护保存应用程序清单 Git 仓库的本地缓存。当提供以下输入时,它负责生成并返回 Kubernetes 清单:
应用控制器:应用控制器是一个 Kubernetes 控制器,它持续 watch 正在运行的应用程序并将当前的实时状态与所期望的目标状态( repo 中指定的)进行比较。它检测应用程序的 OutOfSync 状态,并采取一些措施来同步状态,它负责调用任何用户定义的生命周期事件的钩子(PreSync、Sync、PostSync)。
当然前提是需要有一个 kubectl 可访问的 Kubernetes 的集群,直接使用下面的命令即可,这里我们安装最新的稳定版 v2.0.4:
- kubectl create namespace argocd
 - kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.0.4/manifests/install.yaml
 
如果你要用在生产环境,则可以使用下面的命令部署一个 HA 高可用的版本:
- kubectl create namespace argocd
 - kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.0.4/manifests/ha/install.yaml
 
这将创建一个新的命名空间 argocd,Argo CD 的服务和应用资源都将部署到该命名空间。
- $ kubectl get pods -n argocd
 - NAME READY STATUS RESTARTS AGE
 - argocd-application-controller-0 1/1 Running 0 15m
 - argocd-dex-server-76ff776f97-ds7mm 1/1 Running 0 15m
 - argocd-redis-747b678f89-w99wf 1/1 Running 0 15m
 - argocd-repo-server-6fc4456c89-586zl 1/1 Running 0 15m
 - argocd-server-7d57bc994b-kkwsd 1/1 Running 0 15m
 
然后我们可以在本地安装 CLI 工具方便操作 Argo CD,我们可以在 Argo CD Git 仓库发布页面(https://github.com/argoproj/argo-cd/releases/latest)查看最新版本的 Argo CD 或运行以下命令来获取版本:
- VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
 
VERSION 在下面的命令中替换为你要下载的 Argo CD 版本:
- curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64
 
为 argocd CLI 赋予可执行权限:
- $ chmod +x /usr/local/bin/argocd
 - $ argocd version
 - argocd: v2.0.4+0842d44
 - BuildDate: 2021-06-23T01:29:55Z
 - GitCommit: 0842d448107eb1397b251e63ec4d4bc1b4efdd6e
 - GitTreeState: clean
 - GoVersion: go1.16
 - Compiler: gc
 - Platform: darwin/amd64
 - argocd-server: v2.0.4+0842d44
 - BuildDate: 2021-06-23T01:27:53Z
 - GitCommit: 0842d448107eb1397b251e63ec4d4bc1b4efdd6e
 - GitTreeState: clean
 - GoVersion: go1.16
 - Compiler: gc
 - Platform: linux/amd64
 - Ksonnet Version: v0.13.1
 - Kustomize Version: v3.9.4 2021-02-09T19:22:10Z
 - Helm Version: v3.5.1+g32c2223
 - Kubectl Version: v0.20.4
 - Jsonnet Version: v0.17.0
 
现在我们就可以使用 argocd 命令了。
如果你是 Mac,则可以直接使用 brew install argocd 进行安装。
Argo CD 会运行一个 gRPC 服务(由 CLI 使用)和 HTTP/HTTPS 服务(由 UI 使用),这两种协议都由 argocd-server 服务在以下端口进行暴露:
我们可以通过配置 Ingress 的方式来对外暴露服务,这里我们仍然使用 Traefik 的 IngressRoute 进行配置,其他 Ingress 控制器的配置可以参考官方文档 https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/ 进行配置。
由于 Traefik 它可以在同一端口处理 TCP 和 HTTP 连接,所以我们不需要定义多个 IngressRoute 来暴露 HTTP 和 gRPC 服务,然后应在禁用 TLS 的情况下运行 API 服务,编辑 argocd-server Deployment 以将 --insecure 标志添加到 argocd-server 命令中:
- spec:
 - template:
 - spec:
 - containers:
 - - name: argocd-server
 - command:
 - - argocd-server
 - - --staticassets
 - - /shared/app
 - - --repo-server
 - - argocd-repo-server:8081
 - - --insecure # 需要禁用 tls,否则会 `redirected you too many times`
 
然后创建如下所的 IngressRoute 资源对象即可,我们创建了一个 redirect-https 的中间件,可以让 http 服务强制跳转到 https 服务去:
- apiVersion: traefik.containo.us/v1alpha1
 - kind: Middleware
 - metadata:
 - name: redirect-https
 - namespace: argocd
 - spec:
 - redirectScheme:
 - scheme: https
 - ---
 - apiVersion: traefik.containo.us/v1alpha1
 - kind: IngressRoute
 - metadata:
 - name: argocd-server-http
 - namespace: argocd
 - spec:
 - entryPoints:
 - - web
 - routes:
 - - kind: Rule
 - match: Host(`argocd.k8s.local`)
 - priority: 10
 - middlewares:
 - - name: redirect-https
 - services:
 - - name: argocd-server
 - port: 80
 - - kind: Rule
 - match: Host(`argocd.k8s.local`) && Headers(`Content-Type`, `application/grpc`)
 - priority: 11
 - middlewares:
 - - name: redirect-https
 - services:
 - - name: argocd-server
 - port: 80
 - scheme: h2c
 - ---
 - apiVersion: traefik.containo.us/v1alpha1
 - kind: IngressRoute
 - metadata:
 - name: argocd-server
 - namespace: argocd
 - spec:
 - entryPoints:
 - - websecure
 - routes:
 - - kind: Rule
 - match: Host(`argocd.k8s.local`)
 - priority: 10
 - services:
 - - name: argocd-server
 - port: 80
 - - kind: Rule
 - match: Host(`argocd.k8s.local`) && Headers(`Content-Type`, `application/grpc`)
 - priority: 11
 - services:
 - - name: argocd-server
 - port: 80
 - scheme: h2c
 - tls:
 - certResolver: default
 - options: {}
 
创建完成后,我们就可以通过 argocd.k8s.local 来访问 Argo CD 服务了,不过需要注意我们这里配置的证书是自签名的,所以在第一次访问的时候会提示不安全,强制跳转即可:
argocd ui
默认情况下 admin 帐号的初始密码是自动生成的,会以明文的形式存储在 Argo CD 安装的命名空间中名为 password 的 Secret 对象下的 argocd-initial-admin-secret 字段下,我们可以用下面的命令来获取:
- kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo
 
使用用户名 admin 和上面输出的密码即可登录 Dashboard,同样我们也可以通过 ArgoCD CLI 命令行工具进行登录:
- $ argocd login argocd.k8s.local
 - WARNING: server certificate had error: x509: certificate is valid for e2d1e856c987c94f3c918276921a61ba.6a98e1283291d1b7a23d19e240b6ee89.traefik.default, not argocd.k8s.local. Proceed insecurely (y/n)? y
 - Username: admin
 - Password:
 - 'admin:login' logged in successfully
 - Context 'argocd.k8s.local' updated
 
CLI 登录成功后,可以使用如下所示命令更改密码:
- $ argocd account update-password
 - *** Enter current password:
 - *** Enter new password:
 - *** Confirm new password:
 - Password updated
 - Context 'argocd.k8s.local' updated
 
由于 Argo CD 支持部署应用到多集群,所以如果你要将应用部署到外部集群的时候,需要先将外部集群的认证信息注册到 Argo CD 中,如果是在内部部署(运行 Argo CD 的同一个集群,默认不需要配置),应该使用 https://kubernetes.default.svc 作为应用的 K8S APIServer 地址。
首先列出当前 kubeconfig 中的所有集群上下文:
- kubectl config get-contexts -o name
 
从列表中选择一个上下文名称并将其提供给 argocd cluster add CONTEXTNAME,比如对于 docker-desktop上下文,运行:
- argocd cluster add docker-desktop
 
上述命令会将 ServiceAccount (argocd-manager) 安装到该 kubectl 上下文的 kube-system 命名空间中,并将 ServiceAccount 绑定到管理员级别的 ClusterRole,Argo CD 使用此 ServiceAccount 令牌来执行任务管理(部署/监控)。
Git 仓库 https://github.com/argoproj/argocd-example-apps.git 是一个包含留言簿应用程序的示例库,我们可以用该应用来演示 Argo CD 的工作原理。
我们可以通过 argocd app create xxx 命令来创建一个应用:
- $ argocd app create --help
 - Create an application
 - Usage:
 - argocd app create APPNAME [flags]
 - Examples:
 - # Create a directory app
 - argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --directory-recurse
 - # Create a Jsonnet app
 - argocd app create jsonnet-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path jsonnet-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --jsonnet-ext-str replicas=2
 - # Create a Helm app
 - argocd app create helm-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --helm-set replicaCount=2
 - # Create a Helm app from a Helm repo
 - argocd app create nginx-ingress --repo https://kubernetes-charts.storage.googleapis.com --helm-chart nginx-ingress --revision 1.24.3 --dest-namespace default --dest-server https://kubernetes.default.svc
 - # Create a Kustomize app
 - argocd app create kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image gcr.io/heptio-images/ks-guestbook-demo:0.1
 - # Create a app using a custom tool:
 - argocd app create ksane --repo https://github.com/argoproj/argocd-example-apps.git --path plugins/kasane --dest-namespace default --dest-server https://kubernetes.default.svc --config-management-plugin kasane
 - Flags:
 - ......
 
直接执行如下所示命令即可:
- $ argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
 - application 'guestbook' created
 
除了可以通过 CLI 工具来创建应用,我们也可以通过 UI 界面来创建,定位到 argocd.k8s.local 页面,登录后,点击 +New App 新建应用按钮,如下图:
New App
将应用命名为 guestbook,使用 default project,并将同步策略设置为 Manual:
配置应用
然后在下面配置 Repository URL 为 https://github.com/argoproj/argocd-example-apps.git,由于某些原因我们这里使用迁移到 Gitee 上面的仓库地址 https://gitee.com/cnych/argocd-example-apps,将 Revision 设置为 HEAD,并将路径设置为 guestbook:
配置Repo
然后下面的 Destination 部分,将 cluster 设置为 in-cluster 和 namespace 为 default:
配置集群
填写完以上信息后,点击页面上方的 Create 安装,即可创建 guestbook 应用,创建完成后可以看到当前应用的处于 OutOfSync 状态:
guestbook application
由于上面我们在创建应用的时候使用的同步策略为 Manual,所以应用创建完成后没有自动部署,需要我们手动去部署应用。同样可以通过 CLI 和 UI 界面两种同步方式。
应用创建完成后,我们可以通过如下所示命令查看其状态:
- $ argocd app get guestbook
 - Name: guestbook
 - Project: default
 - Server: https://kubernetes.default.svc
 - Namespace: default
 - URL: https://argocd.k8s.local/applications/guestbook
 - Repo: https://gitee.com/cnych/argocd-example-apps
 - Target: HEAD
 - Path: guestbook
 - SyncWindow: Sync Allowed
 - Sync Policy:
 - Sync Status: OutOfSync from HEAD (53e28ff)
 - Health Status: Missing
 - GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
 - Service default guestbook-ui OutOfSync Missing
 - apps Deployment default guestbook-ui OutOfSync Missing
 
应用程序状态为初始 OutOfSync 状态,因为应用程序尚未部署,并且尚未创建任何 Kubernetes 资源。要同步(部署)应用程序,可以执行如下所示命令:
- argocd app sync guestbook
 
此命令从 Git 仓库中检索资源清单并执行 kubectl apply 部署应用,执行上面命令后 guestbook 应用便会运行在集群中了,现在我们就可以查看其资源组件、日志、事件和评估其健康状态了。
直接添加 UI 界面上应用的 Sync 按钮即可开始同步:
sync 操作
同步完成后可以看到我们的资源状态:
Sync 完成
还可以有不同的视角进行查看:
Sync 完成
也可以通过 kubectl 查看到我们部署的资源:
- ~ kubectl get pods
 - NAME READY STATUS RESTARTS AGE
 - guestbook-ui-6c96fb4bdc-nmk9b 1/1 Running 0 2m22s
 - ~ kubectl get svc
 - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
 - guestbook-ui ClusterIP 10.96.32.11
 80/TCP 11m - kubernetes ClusterIP 10.96.0.1
 443/TCP 41d 
和我们从 Git 仓库中同步 guestbook 目录下面的资源状态也是同步的,证明同步成功了。
期望状态
                本文标题:GitOps持续部署工具ArgoCD初体验
                
                文章出自:http://www.csdahua.cn/qtweb/news30/75530.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网