Gitops 实操手册 5:使用 ArgoCD 构建 GitOps 工作流

内容简介

本实验手册系列包含七个主题,涵盖了从应用容器化到 GitOps 工作流的实现与高级特性。通过这些实验手册,您将学习到如何构建、部署和管理应用,以及如何在 Kubernetes 集群上实现高效的持续交付流程。

以下是实验手册的七个章节:

  1. 应用程序容器化实验手册:学习如何将应用程序容器化,并为主流编程语言构建镜像。同时,了解如何缩减镜像体积和使用 GitHub Actions 自动构建镜像。
  2. 单节点 Kubernetes 集群部署实验手册:使用 kind 在本地部署单节点 Kubernetes 集群,安装基础服务,并熟悉 Kubernetes 的基本功能,如运行 Pod、调度工作负载、服务发布和自动扩缩容。
  3. 示例应用的部署和解析实验手册:深入了解示例应用的各个组件,学习如何在 Kubernetes 集群上部署、运行和管理这些组件,实现服务调用、应用配置和扩缩容等功能。
  4. 使用 Helm 定义应用实验手册:通过 Helm 对示例应用进行定义,以满足 GitOps 部署的需求。了解 Helm Chart 的创建和使用,以及预发布和生产环境的部署。
  5. 构建 GitOps 工作流实验手册:在 Kubernetes 集群上安装 ArgoCD,并使用 ArgoCD 定义示例应用进行部署,实现基于镜像版本变化触发的 GitOps 工作流。
  6. 实现 GitOps 高级发布策略实验手册:结合 ArgoCD 的高级特性,如 Argo Rollout、AnalysisTemplate 和 Argo Rollout Dashboard,实现蓝绿发布、金丝雀发布和自动渐进交付。
  7. ArgoCD 高级管理特性实验手册:探讨 ArgoCD 在 GitOps 场景中的高级特性,包括使用 ApplicationSet 实现多环境部署和使用 SealedSecret 保护密钥。

通过这七个实验手册,您将全面掌握应用容器化、Kubernetes 和 GitOps 的相关知识,为应用的持续交付提供可靠和高效的解决方案。

在前面的实验场景基础上,本实验手册将引导您在 Kubernetes 集群上安装 ArgoCD,并在 ArgoCD 上定义并部署示例应用,实现镜像版本变化触发的 GitOps 工作流。

本实验手册将涵盖以下主要实验环节:

  1. 在 Kubernetes 集群上安装 ArgoCD:了解 ArgoCD 的安装方法及如何在 Kubernetes 集群上进行部署。
  2. 在 ArgoCD 上定义示例应用:学习如何在 ArgoCD 控制台上创建应用,以及如何配置应用源、目标集群和目标命名空间等信息。
  3. 部署示例应用:了解如何在 ArgoCD 上将 Helm Chart 部署到 Kubernetes 集群,并观察部署过程。
  4. 实现 GitOps 工作流:学习如何在镜像版本变化时触发 GitOps 工作流,实现自动化部署和回滚。

通过本实验手册,您将掌握如何使用 ArgoCD 构建 GitOps 工作流,进一步提高 Kubernetes 应用的部署、更新和管理效率。

部署 ArgoCD

创建命名空间

kubectl create namespace argocd

安装

kubectl apply -n argocd -f https://ghproxy.com/https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

检查安装情况

kubectl wait --for=condition=Ready pods --all -n argocd --timeout 300s
root@node1:~/kubernetes-example# kubectl wait --for=condition=Ready pods --all -n argocd --timeout 300s
pod/argocd-application-controller-0 condition met
pod/argocd-applicationset-controller-69c4b965dc-mcgd9 condition met
pod/argocd-dex-server-64d856b94c-8jntz condition met
pod/argocd-notifications-controller-f7c967bc9-7nb8p condition met
pod/argocd-redis-598f75bc69-7pg4j condition met
pod/argocd-repo-server-df7f747b4-48cj7 condition met
pod/argocd-server-59d9b8cb46-wns97 condition met

安装 argocd cli

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

forward到8080端口 (建议再开一个session)

kubectl port-forward service/argocd-server 8080:80 -n argocd

创建 ingress manifest

nano argocd-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - host: argocd.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: argocd-server
            port:
              name: https
  tls:
  - hosts:
    - argocd.example.com
    secretName: argocd-secret # do not change, this is provided by Argo CD
kubectl apply -f argocd-ingress.yaml

获取 ArgoCD Admin 初始密码

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
amsgK3UobDG6VsVd

修改本地的host文件

192.168.1.231 argocd.example.com

访问 https://argocd.example.com/ 建议修改密码

(可选)安装 cert-manager

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.10.0 \
--set ingressShim.defaultIssuerName=letsencrypt-prod \
--set ingressShim.defaultIssuerKind=ClusterIssuer \
--set ingressShim.defaultIssuerGroup=cert-manager.io \
--set installCRDs=true
nano cluster-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: "abraham.cheng@gmail.com"
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:    
    - http01:
        ingress:
          class: nginx
kubectl apply -f cluster-issuer.yaml

创建 ArgoCD 应用

请确保删除之前的 example 项目

kubectl delete ns example

登录到Argo CD

argocd login localhost:8080 --insecure
root@node1:~# argocd login localhost:8080 --insecure
Username: admin
Password:
'admin:login' logged in successfully
Context 'localhost:8080' updated

可选此处的$PASSWORD 为此前定义的 github tocken

argocd repo add https://github.com/chengzh/kubernetes-example.git --username cloudzun --password $PASSWORD

argocd app create example --sync-policy automated --repo https://github.com/cloudzun/kubernetes-example.git --revision main --path helm --dest-namespace gitops-example --dest-server https://kubernetes.default.svc --sync-option CreateNamespace=true

这条命令使用Argo CD在Kubernetes集群中创建和管理一个名为example的应用。以下是对命令各部分的详细解释:

  1. argocd app create: 这是Argo CD的命令,用于创建一个新的应用。
  2. example: 为创建的Argo CD应用分配一个名字。在这种情况下,应用的名称是example
  3. --sync-policy automated: 设置同步策略为自动化,这意味着当Git仓库中的配置发生变化时,Argo CD会自动将这些更改应用到Kubernetes集群。
  4. --repo https://github.com/cloudzun/kubernetes-example.git: 指定应用的Git仓库URL。在这个例子中,Git仓库位于https://github.com/cloudzun/kubernetes-example.git
  5. --revision main: 指定Git仓库的分支或修订版本。在这里,使用main分支。
  6. --path helm: 指定Git仓库中包含Kubernetes资源的路径。在这种情况下,路径是helm
  7. --dest-namespace gitops-example: 指定Kubernetes命名空间,用于部署应用。在这种情况下,命名空间是gitops-example
  8. --dest-server https://kubernetes.default.svc: 指定Kubernetes API服务器的URL,Argo CD将在该服务器上部署应用。在这里,使用Kubernetes集群的默认API服务器地址https://kubernetes.default.svc
  9. --sync-option CreateNamespace=true: 设置同步选项,以在应用同步时自动创建目标命名空间(如果它不存在的话)。

总之,这条命令使用Argo CD在指定的Kubernetes命名空间中创建一个名为example的应用,该应用从指定的Git仓库和分支中获取Kubernetes资源。同步策略设置为自动化,以便在Git仓库中的配置发生变化时自动应用这些更改。

实现镜像版本变化触发的 GitOps 工作流

安装和配置 ArgoCD Image Updater

安装 Argo CD Image Updater

kubectl apply -n argocd -f https://ghproxy.com/https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml

设置docker 仓库 secret (注意 docker-password 的时效)

kubectl create -n argocd secret docker-registry dockerhub-secret \
  --docker-username chengzh \
  --docker-password dckr_pat_UxCRddCJXMg9_HNyHA0gsE3BSZA \
  --docker-server "https://registry-1.docker.io"

创建 Helm Chart 仓库

创建一个新的 Git 仓库,将现有仓库的helm目录复制到新仓库

 $ cp -r ./kubernetes-example/helm ./kubernetes-example-helm

为 ArgoCD Image Updater 提供回写 kubernetes-example-helm 仓库的权限。要配置仓库访问权限,可以使用 argocd repo add 命令

argocd repo add https://github.com/cloudzun/kubernetes-example-helm.git --username $USERNAME --password $PASSWORD

注意要将仓库地址修改为新创建的用于存放 Helm Chart 的 GitHub 仓库地址,并将 $USERNAME 替换为 GitHub 账户 ID,将 $PASSWORD 替换为 GitHub Personal Token。可以在这个页面:https://github.com/settings/tokens 创建 GitHub Personal Token,并赋予仓库相关权限。

argocd repo add https://github.com/cloudzun/kubernetes-example-helm.git --username cloudzun --password $PASSWORD

创建 ArgoCD 应用

(可选)删除旧应用

argocd app delete example --cascade

接下来正式创建 ArgoCD 应用。在上一节课中,是使用 argocd app create 命令创建的 ArgoCD 应用 。实际上,它会创建一个特殊类型的资源,也就是 ArgoCD Application,它和 K8s 其他标准的资源对象一样,也是使用 YAML 来定义的。
在这里,直接使用 YAML 来创建新的 Application,将下面的文件内容保存为 application.yaml。

nano application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example
  annotations:
    argocd-image-updater.argoproj.io/backend.allow-tags: regexp:^main
    argocd-image-updater.argoproj.io/backend.helm.image-name: backend.image
    argocd-image-updater.argoproj.io/backend.helm.image-tag: backend.tag
    argocd-image-updater.argoproj.io/backend.pull-secret: pullsecret:argocd/dockerhub-secret
    argocd-image-updater.argoproj.io/frontend.allow-tags: regexp:^main
    argocd-image-updater.argoproj.io/frontend.helm.image-name: frontend.image
    argocd-image-updater.argoproj.io/frontend.helm.image-tag: frontend.tag
    argocd-image-updater.argoproj.io/frontend.pull-secret: pullsecret:argocd/dockerhub-secret
    argocd-image-updater.argoproj.io/image-list: frontend=chengzh/frontend, backend=chengzh/backend
    argocd-image-updater.argoproj.io/update-strategy: latest
    argocd-image-updater.argoproj.io/write-back-method: git
spec:
  destination:
    namespace: gitops-example-updater
    server: https://kubernetes.default.svc
  project: default
  source:
    path: .
    repoURL: https://github.com/cloudzun/kubernetes-example-helm.git
    targetRevision: main
  syncPolicy:
    automated: {}
    syncOptions:
      - CreateNamespace=true

这个manifest文件定义了一个名为example的Argo CD Application,用于在Kubernetes集群中部署和管理一个基于Helm的应用。同时,这个manifest还包含了Argo CD Image Updater的一些配置,用于自动更新容器镜像。以下是对文件各部分的详细解释:

  1. apiVersionkind: 这两个字段定义了Kubernetes资源的类型。在这个例子中,资源类型是argoproj.io/v1alpha1Application,表示这是一个Argo CD的Application资源。
  2. metadata: 定义了关于Application的元数据,例如名称和注释。
    • name: 定义了应用的名称,为example
    • annotations: 定义了Argo CD Image Updater的配置。这些配置允许自动更新容器镜像,同时指定了镜像名称、标签策略等信息。
  3. spec: 定义了应用的具体配置。
    • destination: 定义了应用部署的目标Kubernetes集群和命名空间。
      • namespace: 定义了部署应用的Kubernetes命名空间,为gitops-example-updater
      • server: 定义了Kubernetes API服务器的URL,为https://kubernetes.default.svc
    • project: 定义了Argo CD项目,为default
    • source: 定义了应用的源代码信息。
      • path: 定义了包含Kubernetes资源的路径,在这个例子中为.,表示当前目录。
      • repoURL: 定义了Git仓库的URL,为https://github.com/cloudzun/kubernetes-example-helm.git
      • targetRevision: 定义了Git仓库的分支或修订版本,为main
    • syncPolicy: 定义了应用的同步策略。
      • automated: 指定了自动同步策略,表示当Git仓库中的配置发生变化时,Argo CD会自动将这些更改应用到Kubernetes集群。
      • syncOptions: 定义了同步选项,例如在同步过程中自动创建命名空间。

总之,这个manifest文件定义了一个名为example的Argo CD应用,用于在指定的Kubernetes命名空间中部署和管理一个基于Helm的应用。同时,它还包含了Argo CD Image Updater的配置,用于自动更新容器镜像。

  • annotations 部分包含了Argo CD Image Updater的配置。这些配置用于指定自动更新容器镜像的策略、参数和相关信息。以下是对这些注释的详细解释:

    1. argocd-image-updater.argoproj.io/backend.allow-tagsargocd-image-updater.argoproj.io/frontend.allow-tags: 这两个注释分别针对后端(backend)和前端(frontend)镜像,指定了允许更新的镜像标签。这里使用正则表达式 regexp:^main,表示允许使用以 “main” 开头的标签。
    2. argocd-image-updater.argoproj.io/backend.helm.image-nameargocd-image-updater.argoproj.io/frontend.helm.image-name: 这两个注释分别针对后端(backend)和前端(frontend)镜像,指定了在Helm chart中的镜像名称字段。这里的值是backend.imagefrontend.image
    3. argocd-image-updater.argoproj.io/backend.helm.image-tagargocd-image-updater.argoproj.io/frontend.helm.image-tag: 这两个注释分别针对后端(backend)和前端(frontend)镜像,指定了在Helm chart中的镜像标签字段。这里的值是backend.tagfrontend.tag
    4. argocd-image-updater.argoproj.io/backend.pull-secretargocd-image-updater.argoproj.io/frontend.pull-secret: 这两个注释分别针对后端(backend)和前端(frontend)镜像,指定了用于拉取镜像的Secret。在这里,Secret名称是dockerhub-secret,位于argocd命名空间下。
    5. argocd-image-updater.argoproj.io/image-list: 这个注释定义了应用中使用的镜像列表。这里列出了前端(frontend)和后端(backend)的镜像,分别对应chengzh/frontendchengzh/backend
    6. argocd-image-updater.argoproj.io/update-strategy: 这个注释定义了镜像更新策略。这里的值是latest,表示使用最新的镜像标签进行更新。
    7. argocd-image-updater.argoproj.io/write-back-method: 这个注释定义了更新后的配置写回方法。这里的值是git,表示将更新后的配置写回到Git仓库。

    这些注释与Argo CD Image Updater相关,用于配置自动更新容器镜像的策略、参数和相关信息。这样,当有新版本的镜像可用时,Argo CD Image Updater可以自动更新部署在Kubernetes集群中的应用。

然后,使用 kubectl apply 命令创建 ArgoCD Application,效果等同于使用 argocd app create 命令创建应用。

kubectl apply -n argocd -f application.yaml

触发 GitOps 工作流

接下来,可以尝试修改 frontend/src/App.js 文件,例如修改文件第 49 行的“Hi! I am abraham”内容。修改完成后,将代码推送到 GitHub 的 main 分支。此时会触发两个 GitHub Action 工作流。其中,当 build-every-branch 工作流被触发时,它将构建 Tag 为 main 开头的镜像版本,并将其推送到镜像仓库中,

#22 pushing manifest for docker.io/chengzh/backend:main-2fff0b2@sha256:20ae4681cebb5c3096a43f067f53e5255777b4de52d1b636a2143e8ed130845e

[1034](https://github.com/cloudzun/kubernetes-example/actions/runs/4252208283/jobs/7395500319#step:8:1034)#22 pushing manifest for docker.io/chengzh/backend:main-2fff0b2@sha256:20ae4681cebb5c3096a43f067f53e5255777b4de52d1b636a2143e8ed130845e 0.9s done

注意以上日志的中的 backend:main-2fff0b2

到docker hub上查看新上线的镜像 tag:
![[Pasted image 20230223194606.png]]
可以观察到 main-2fff0b2

与此同时,ArgoCD Image Updater 将会每 2 分钟从镜像仓库检索 frontendbackend 的镜像版本,一旦发现有新的并且以 main 开头的镜像版本,它将自动使用新版本来更新集群内工作负载的镜像,并将镜像版本回写到 kubernetes-example-helm 仓库。在回写时,ArgoCD Image Updater 并不会直接修改仓库的 values.yaml 文件,而是会创建一个专门用于覆盖 Helm Chart values.yaml 的 .argocd-source-example.yaml 文件

helm:
  parameters:
  - name: frontend.image
    value: chengzh/frontend
    forcestring: true
  - name: frontend.tag
    value: main-2fff0b2
    forcestring: true
  - name: backend.image
    value: chengzh/backend
    forcestring: true
  - name: backend.tag
    value: main-2fff0b2
    forcestring: true

使用以下命令查看 deployment

kubectl get deployment -n gitops-example-updater  -o wide
root@node1:~# kubectl get deployment -n gitops-example-updater  -o wide
NAME       READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS       IMAGES                          SELECTOR
backend    1/2     2            1           13m   flask-backend    chengzh/backend:main-2fff0b2    app=backend
frontend   2/7     7            2           13m   react-frontend   chengzh/frontend:main-2fff0b2   app=frontend
postgres   1/1     1            1           13m   postgres         postgres                        app=database

此处关注镜像:chengzh/backend:main-2fff0b2

Demo提示

使用简化版的application manifest,只响应frontend的更新

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example
  annotations:
    argocd-image-updater.argoproj.io/frontend.allow-tags: regexp:^main
    argocd-image-updater.argoproj.io/frontend.helm.image-name: frontend.image
    argocd-image-updater.argoproj.io/frontend.helm.image-tag: frontend.tag
    argocd-image-updater.argoproj.io/frontend.pull-secret: pullsecret:argocd/dockerhub-secret
    argocd-image-updater.argoproj.io/image-list: frontend=chengzh/frontend
    argocd-image-updater.argoproj.io/update-strategy: latest
    argocd-image-updater.argoproj.io/write-back-method: git
spec:
  destination:
    namespace: gitops-example-updater
    server: https://kubernetes.default.svc
  project: default
  source:
    path: .
    repoURL: https://github.com/cloudzun/kubernetes-example-helm.git
    targetRevision: main
  syncPolicy:
    automated: {}
    syncOptions:
      - CreateNamespace=true
  • 做演示之前记得删除https://github.com/cloudzun/kubernetes-example-helm/ 中的 .argocd-source-example.yaml

  • 从触发action运行到新版本部署大概需要20多分钟,耐心是美德

后记

本课程体系旨在为学员提供一套全面的云原生技术学习路径,包括容器技术、Kubernetes 部署和管理、Ingress 管理、持久化存储、应用部署、可观测性、服务网格、DevOps 工具链和流水线以及 GitOps 等方面的内容。通过学习这套课程体系,学员将掌握云原生技术的关键概念、原理和实践方法,从而提升云原生应用的部署、管理和协作效率。

  1. Docker 技术实战:学习容器技术的基础知识,包括 Docker 的运作原理、核心组件以及应用部署和监控管理。
  2. Kubernetes 部署和管理实战:深入了解 Kubernetes 的核心概念和基础组件,掌握 Kubernetes 集群的部署、管理和监控技能。
  3. Kubernetes Ingress 管理与运维:学习 Kubernetes Ingress 的概念、工作机制和运维管理方法,提升 Ingress 的部署和管理能力。
  4. Kubernetes 持久化存储实践:探讨 Kubernetes 持久化存储的原理、实现方式和实际应用,提高在 Kubernetes 上实现持久化存储的能力。
  5. Kubernetes 应用部署和管理:学习 Kubernetes 应用部署和管理的基本概念、原理和实现方法,掌握在 Kubernetes 上部署和管理应用的技巧。
  6. Kubernetes 可观测性实践:研究 Kubernetes 可观测性实践的概念、原理和实现方法,涉及监控、日志记录和分析等方面。
  7. 基于 Istio 的服务网格实战:深入了解基于 Istio 的服务网格概念、原理和实现方法,包括服务路由、流量管理、弹性能力和微服务可观测性等。
  8. DevOps 工具链与流水线实践:探讨 DevOps 工具链与流水线的概念、原理和实现方法,涵盖自动化构建、测试、部署和监控等环节。
  9. GitOps 云原生应用的高效部署与管理:全面掌握 GitOps 原理、技术和工具,提高云原生应用部署、管理和协作效率。

通过对这九门课程的学习,学员可以:

  1. 熟练运用 Docker 和 Kubernetes 进行容器化应用的部署和管理。
  2. 掌握 Ingress 和持久化存储在 Kubernetes 集群中的配置和管理方法。
  3. 了解 Kubernetes 可观测性实践,提高应用监控、日志和分析的能力。
  4. 探究 Istio 服务网格的原理和实现,实现微服务的高可用、弹性和安全。
  5. 运用 DevOps 工具链和流水线实现自动化构建、测试、部署和监控。
  6. 掌握 GitOps 的原理和技术,提升云原生应用的部署、管理和协作效率。

本课程体系适合对云原生技术感兴趣的开发者、运维工程师、架构师等专业人士。课程内容丰富、实践性强,旨在帮助学员在实际工作中更好地应用云原生技术,为企业的数字化转型做出贡献。

如果希望获得更详细的课程介绍,请联系: info@cloudzun.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值