本文介紹基于ACK One GitOps部署的應用示例。
應用部署倉庫的目錄結構
一個完整的CI/CD流水線中,涉及業務代碼倉庫和應用部署代碼倉庫兩類。ACK One GitOps本實踐的倉庫說明如下。
業務代碼倉庫包含2個,分別從echo-server項目和echo-web-server項目Fork得到。
應用部署代碼倉庫用于存放您需要部署到集群中的應用的YAML。本實踐覆蓋完整研發流程的開發(Dev)、預發(Staging)、生產(Production)環境的示例,包含Helm和Kustomize兩種方式,實際使用中任選一種。更多信息,請參見阿里云GitOps Demo。本實踐目錄結構如下所示。
manifests ├── helm │ ├── echo-server │ │ ├── .argocd-source-app-helm-dev.yaml │ │ ├── .argocd-source-app-helm-production.yaml │ │ ├── .argocd-source-app-helm-staging.yaml │ │ ├── Chart.yaml │ │ ├── templates │ │ │ ├── NOTES.txt │ │ │ ├── _helpers.tpl │ │ │ ├── deployment-echo-server.yaml │ │ │ ├── deployment-echo-web-server.yaml │ │ │ ├── external-secret.yaml │ │ │ ├── hpa.yaml │ │ │ ├── ingress.yaml │ │ │ ├── rollout.yaml │ │ │ ├── service-echo-server.yaml │ │ │ ├── service-echo-web-server.yaml │ │ │ ├── serviceaccount.yaml │ │ │ └── tests │ │ │ └── test-connection.yaml │ │ ├── values-dev.yaml │ │ ├── values-production.yaml │ │ ├── values-staging.yaml │ │ └── values.yaml │ └── web-demo │ ├── Chart.yaml │ ├── templates │ │ ├── deployment.yaml │ │ └── service.yaml │ └── values.yaml └── kustomize ├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlay ├── dev │ ├── .argocd-source-app-kust-dev.yaml │ ├── deployment.yaml │ └── kustomization.yaml ├── production │ ├── .argocd-source-app-kust-production.yaml │ ├── deployment.yaml │ └── kustomization.yaml └── staging ├── .argocd-source-app-kust-staging.yaml ├── deployment.yaml └── kustomization.yaml
該應用部署倉庫的目錄結構中使用Helm管理的echo-server項目,包含多環境或多集群、多個Deployment、多集群Secret管理、Rollout等能力。
多環境或多集群部署
基于不同的環境,需要配置不同的信息。關于Helm管理的應用和Kustomize管理的應用的配置說明如下。
Helm管理的應用
您可以使用不同的
values.yaml
進行差異化部署,例如,上述目錄結構中的values-dev.yaml
、values-staging.yaml
、values-production.yaml
。如果在Dev環境不需要開啟Rollout滾動升級,而Staging、Production環境下需要開啟Rollout滾動升級,您可以在不同的
values.yaml
中配置不同的信息。values-****.yaml
文件中鏡像倉庫的信息應配置為您實際使用的容器鏡像服務ACR企業版實例(ACR EE)。本實踐使用的ACR EE實例名稱為demo-test
。
Kustomize管理的應用
由于此類應用需基于base+overlay的方式完成資源的修改,所以針對不同環境的差異化配置,您可以在overlay中使用不同的目錄來實現。
目錄結構中的.argocd-source-app-helm-xxx.yaml
和.argocd-source-app-kust-xxx.yaml
文件,為應用鏡像更新后,Image Updater自動將最新的鏡像信息更新到Git倉庫的文件,具體內容如下圖所示。關于Application配置的更多信息,請參見基于ACK One GitOps和ACR構建CI/CD流水線。
敏感信息多集群差異化分發
如果您需要在多集群中實現差異化配置、并且使用數據庫的用戶名和密碼等敏感信息,基于上述的多集群差異化部署后,您可以使用憑據管家進行加密管理,然后在各個集群中使用ack-secret-manager或csi-secrets-store-provider-alibabacloud導入阿里云KMS服務憑據。關于憑據管家的使用方式,請參見憑據管理快速入門。
使用此能力需要在應用部署倉庫中添加相應的YAML(即external-secret.yaml
),在部署應用時,用于創建ExternalSecret觸發從KMS中獲取服務憑據,并且在deployment-echo-server.yaml
中掛載相應Secret。
本實踐中在各環境對應的values.yaml
中需配置不同的信息,例如,Dev環境下,可以不開啟secretManager能力。請您在實際使用中根據實際情況進行修改。
灰度發布
在預發(Staging)、生產(Production)環境中,一般需要通過Rollout能力實現滾動發布,所以需要在應用部署倉庫中添加相應的YAML,用于部署Rollout資源來觸發灰度、滾動升級,即目錄結構中的rollout.yaml
。關于灰度發布的更多信息,請參見基于ACK One Gitops使用Argo Rollouts實現金絲雀發布和使用Kruise Rollout實現灰度發布(金絲雀&A/B Testing)。
部署倉庫對應的Application
Helm
對應以上目錄結構,Helm目錄下的應用對應各環境下的Application如下。
Dev環境
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: app-helm-dev annotations: argocd-image-updater.argoproj.io/image-list: echoserver=demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server,webserver=demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-web-server argocd-image-updater.argoproj.io/echoserver.helm.image-name: image.echoServer.repository argocd-image-updater.argoproj.io/echoserver.helm.image-tag: image.echoServer.tag argocd-image-updater.argoproj.io/echoserver.update-strategy: latest argocd-image-updater.argoproj.io/webserver.helm.image-name: image.echoWebServer.repository argocd-image-updater.argoproj.io/webserver.helm.image-tag: image.echoWebServer.tag argocd-image-updater.argoproj.io/webserver.update-strategy: latest argocd-image-updater.argoproj.io/write-back-method: git spec: destination: namespace: app-helm-dev # https://XX.XX.XX.XX:6443 server: ${url} source: path: manifests/helm/echo-server repoURL: 'git@github.com:ivan-cai/gitops-demo.git' targetRevision: stable-example helm: valueFiles: - values-dev.yaml sources: [] project: default syncPolicy: automated: {} syncOptions: - CreateNamespace=true
Staging環境
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: app-helm-staging annotations: argocd-image-updater.argoproj.io/image-list: echoserver=demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server,webserver=demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-web-server argocd-image-updater.argoproj.io/echoserver.helm.image-name: image.echoServer.repository argocd-image-updater.argoproj.io/echoserver.helm.image-tag: image.echoServer.tag argocd-image-updater.argoproj.io/echoserver.update-strategy: latest argocd-image-updater.argoproj.io/webserver.helm.image-name: image.echoWebServer.repository argocd-image-updater.argoproj.io/webserver.helm.image-tag: image.echoWebServer.tag argocd-image-updater.argoproj.io/webserver.update-strategy: latest argocd-image-updater.argoproj.io/write-back-method: git spec: destination: namespace: app-staging # https://XX.XX.XX.XX:6443 server: ${url} source: path: manifests/helm/echo-server repoURL: 'git@github.com:ivan-cai/gitops-demo.git' targetRevision: stable-example helm: valueFiles: - values-staging.yaml sources: [] project: default syncPolicy: syncOptions: - CreateNamespace=true
Production環境
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: app-helm-production annotations: argocd-image-updater.argoproj.io/image-list: echoserver=demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server,webserver=demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-web-server argocd-image-updater.argoproj.io/echoserver.helm.image-name: image.echoServer.repository argocd-image-updater.argoproj.io/echoserver.helm.image-tag: image.echoServer.tag argocd-image-updater.argoproj.io/echoserver.update-strategy: latest argocd-image-updater.argoproj.io/webserver.helm.image-name: image.echoWebServer.repository argocd-image-updater.argoproj.io/webserver.helm.image-tag: image.echoWebServer.tag argocd-image-updater.argoproj.io/webserver.update-strategy: latest argocd-image-updater.argoproj.io/write-back-method: git spec: destination: namespace: app-production # https://XX.XX.XX.XX:6443 server: ${url} source: path: manifests/helm/echo-server repoURL: 'git@github.com:ivan-cai/gitops-demo.git' targetRevision: stable-example helm: valueFiles: - values-production.yaml project: default syncPolicy: syncOptions: - CreateNamespace=true
Kustomize
對應以上目錄結構,Kustomize目錄下的應用對應各環境下的Application如下。
Dev環境
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: annotations: argocd-image-updater.argoproj.io/image-list: echoserver=demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server:v1.0 argocd-image-updater.argoproj.io/echoserver.kustomize.image-name: demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server argocd-image-updater.argoproj.io/echoserver.update-strategy: latest argocd-image-updater.argoproj.io/write-back-method: git name: app-kust-dev spec: destination: namespace: app-kust-dev # https://XX.XX.XX.XX:6443 server: ${url} source: path: manifests/kustomize/overlay/dev repoURL: 'git@github.com:ivan-cai/gitops-demo.git' targetRevision: stable-example kustomize: images: [] project: default syncPolicy: automated: {} syncOptions: - CreateNamespace=true
Staging環境
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: annotations: argocd-image-updater.argoproj.io/image-list: echoserver=demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server:v1.0 argocd-image-updater.argoproj.io/echoserver.kustomize.image-name: demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server argocd-image-updater.argoproj.io/echoserver.update-strategy: latest argocd-image-updater.argoproj.io/write-back-method: git name: app-kust-staging spec: destination: namespace: app-staging-kust # https://XX.XX.XX.XX:6443 server: ${url} source: path: manifests/kustomize/overlay/staging repoURL: 'git@github.com:ivan-cai/gitops-demo.git' targetRevision: stable-example kustomize: images: [] sources: [] project: default syncPolicy: syncOptions: - CreateNamespace=true
Production環境
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: annotations: argocd-image-updater.argoproj.io/image-list: echoserver=demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server:v1.0 argocd-image-updater.argoproj.io/echoserver.kustomize.image-name: demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server argocd-image-updater.argoproj.io/echoserver.update-strategy: latest argocd-image-updater.argoproj.io/write-back-method: git name: app-kust-production spec: destination: namespace: app-production-kust # https://XX.XX.XX.XX:6443 server: ${url} source: path: manifests/kustomize/overlay/production repoURL: 'git@github.com:ivan-cai/gitops-demo.git' targetRevision: stable-example kustomize: images: [] project: default syncPolicy: syncOptions: - CreateNamespace=true