Topik ini menjelaskan cara membangun sistem penyebaran otomatis yang mendukung manajemen ketergantungan aplikasi antara lingkungan pengembangan dan staging dengan menggabungkan fitur Progressive Syncs dari Argo CD dan kemampuan orkestrasi sumber daya multi-lingkungan dari ApplicationSets.
Informasi latar belakang
Aplikasi web terdiri dari tiga komponen utama: Frontend, Backend, dan Database. Saat melakukan penyebaran, urutan yang harus diikuti adalah Database > Backend > Frontend untuk memastikan manajemen ketergantungan yang tepat. Dengan menggunakan Distributed Cloud Container Platform for Kubernetes (ACK One) GitOps untuk menyebarkan aplikasi seperti itu, setiap komponen (Database/Backend/Frontend) sesuai dengan satu aplikasi Argo CD. Anda perlu menangani ketergantungan penyebaran antar beberapa aplikasi tersebut.
ApplicationSets menyederhanakan orkestrasi aplikasi multi-cluster dengan secara otomatis menghasilkan satu atau lebih aplikasi berdasarkan template orkestrasi aplikasi tunggal. ApplicationSets umumnya digunakan untuk mengelola penyebaran multi-cluster atau multi-lingkungan (dev/staging/prod).
Persyaratan untuk manajemen ketergantungan aplikasi dan penyebaran multi-lingkungan cukup kompleks. Topik ini memperkenalkan penggunaan lanjutan dari ApplicationSet untuk manajemen terpadu ketergantungan aplikasi dan penyebaran multi-lingkungan. Berikut adalah penjelasan tentang cara kerjanya:
Tentukan aplikasi untuk penyebaran multi-lingkungan (dev/staging) menggunakan Matrix Generator, serta tambahkan label ke aplikasi untuk mengidentifikasi nama mereka.
Tentukan urutan pembuatan aplikasi dengan ketergantungan dalam
rollingSync. Sebagai contoh, sebarkanapp1terlebih dahulu, lalu sebarkanapp2.
Setelah konfigurasi, penyebaran akan dilanjutkan dalam urutan berikut: dev-app1>dev-app2>staging-app1>staging-app2, seperti yang ditunjukkan pada gambar berikut:
Progressive Syncs
Fitur Progressive Syncs dari Argo CD memungkinkan orkestrasi penyebaran cerdas dengan menggunakan ApplicationSet. Fitur ini mengontrol urutan pembuatan dan pembaruan aplikasi berdasarkan ketergantungan dan status kesehatan aplikasi yang dikelola oleh ApplicationSets. Anda dapat mendefinisikan daftar steps, dan Progressive Syncs akan terus memantau status kesehatan aplikasi di setiap fase. Fase operasi berikutnya hanya dipicu ketika status aplikasi adalah Healthy.
DaemonSet, StatefulSet, dan Argo Rollout didukung oleh fitur Progressive Syncs karena aplikasi masuk ke status Progressing selama penyebaran pod. Faktanya, sumber daya apa pun dengan pemeriksaan kesehatan yang melaporkan status Progressing didukung oleh fitur ini.
Struktur direktori aplikasi
Contoh ini mencakup dua aplikasi, app1 dan app2, dimana app2 bergantung pada app1. Kedua aplikasi tersebut perlu disebarkan ke lingkungan dev dan staging. Struktur direktori contoh adalah sebagai berikut:
manifests
└── apps
├── env
│ ├── dev
│ │ └── config.json
│ └── staging
│ └── config.json
├── app1
│ ├── base
│ │ ├── deployment.yaml
│ │ ├── kustomization.yaml
│ │ └── service.yaml
│ └── overlay
│ ├── dev
│ │ └── bj
│ │ ├── deployment.yaml
│ │ └── kustomization.yaml
│ └── staging
│ └── bj
│ ├── deployment.yaml
│ └── kustomization.yaml
└── app2
├── base
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlay
├── dev
│ └── bj
│ ├── deployment.yaml
│ └── kustomization.yaml
└── staging
└── bj
├── deployment.yaml
└── kustomization.yamlmanifests/apps/env: Konfigurasikan parameter ini sesuai dengan lingkungan tertentu.PentingJika Anda menggunakan contoh ini untuk penyebaran, buat fork contoh ke repositori Anda sendiri dan modifikasi
cluster_addressdiconfig.jsonmenjadi titik akhir server API kluster terkait.manifests/apps/app1: Aplikasi 1 yang dikelola oleh kustomize. Setiap jenis lingkungan mungkin berisi beberapa wilayah (contoh sebelumnya hanya menunjukkan satu: bj).manifests/apps/app2: Aplikasi 2 yang dikelola oleh kustomize. Setiap jenis lingkungan mungkin berisi beberapa wilayah.
Prasyarat
Langkah 1: Aktifkan fitur Progressive Syncs
ACK One GitOps hanya mendukung pengaktifan Progressive Syncs dalam mode ketersediaan tinggi. Langkah-langkah untuk mengaktifkannya adalah sebagai berikut:
Gunakan Fleet kubeconfig untuk menjalankan perintah berikut guna memodifikasi konfigurasi:
kubectl edit cm -nargocd argocd-cmd-params-cmTambahkan konfigurasi
applicationsetcontroller.enable.progressive.syncs: "true"keargocd-cmd-params-cm.apiVersion: v1 data: applicationsetcontroller.enable.progressive.syncs: "true" ... kind: ConfigMap metadata: name: argocd-cmd-params-cm namespace: argocd ...Jalankan perintah berikut untuk me-restart pod argocd-application-controller:
kubectl rollout restart deployment argocd-application-controller -n argocd
Langkah 2: Buat ApplicationSet di Fleet untuk mengelola ketergantungan aplikasi dan penyebaran multi-lingkungan
Masuk ke konsol ACK One. Di panel navigasi di sebelah kiri, pilih .
Klik untuk masuk ke halaman Create Multi-cluster Application - GitOps, klik tab YAML Create, dan gunakan contoh berikut untuk membuat aplikasi.
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: dependency-apps namespace: argocd spec: goTemplate: true goTemplateOptions: ["missingkey=error"] generators: - matrix: generators: - git: repoURL: https://github.com/AliyunContainerService/gitops-demo.git revision: main pathParamPrefix: env files: - path: "manifests/apps/env/*/config.json" - git: repoURL: https://github.com/AliyunContainerService/gitops-demo.git revision: main pathParamPrefix: target directories: - path: "manifests/apps/app1/overlay/{{.env.path.basename}}/*" - matrix: generators: - git: repoURL: https://github.com/AliyunContainerService/gitops-demo.git revision: HEAD pathParamPrefix: env files: - path: "manifests/apps/env/*/config.json" - git: repoURL: https://github.com/AliyunContainerService/gitops-demo.git revision: HEAD pathParamPrefix: target directories: - path: "manifests/apps/app2/overlay/{{.env.path.basename}}/*" strategy: type: RollingSync rollingSync: steps: - matchExpressions: - key: app.kubernetes.io/instance operator: In values: - app1 - key: environment operator: In values: - dev - matchExpressions: - key: app.kubernetes.io/instance operator: In values: - app2 - key: environment operator: In values: - dev - matchExpressions: - key: app.kubernetes.io/instance operator: In values: - app1 - key: environment operator: In values: - staging - matchExpressions: - key: app.kubernetes.io/instance operator: In values: - app2 - key: environment operator: In values: - staging template: metadata: name: '{{.env.path.basename}}-{{index .target.path.segments 2}}-{{.target.path.basename}}' labels: app.kubernetes.io/instance: '{{index .target.path.segments 2}}' environment: '{{.env.path.basename}}' spec: project: default source: repoURL: https://github.com/AliyunContainerService/gitops-demo.git targetRevision: HEAD path: '{{.target.path.path}}' destination: #server: https://kubernetes.default.svc server: '{{index .cluster_address .target.path.basename}}' namespace: demo syncPolicy: automated: prune: true selfHeal: true retry: limit: 5 backoff: duration: 5s maxDuration: 3m0s factor: 2 syncOptions: - CreateNamespace=trueContoh ini menggunakan Matrix Generator untuk menyebarkan aplikasi ke beberapa lingkungan dan menggunakan RollingSync dari fitur Progressive Syncs untuk mengimplementasikan ketergantungan antar aplikasi. Dalam contoh ini, ApplicationSet menghasilkan empat aplikasi.
Pada parameter
rollingSync.stepsdari Progressive Syncs, label pencocokan adalah label dari aplikasi ArgoCD, sehingga Anda harus menentukan label yang dihasilkan di.spec.template.metadata.labels.Matrix Generator menggabungkan dua generator Git. Berikut adalah variabel yang disediakan oleh generator Git.
Parameter
Deskripsi
Contoh
{{.path.basename}}Nama dasar dari jalur direktori yang berisi file konfigurasi.
dev
staging
{{.target.path.path}}Jalur direktori di repositori Git yang berisi file konfigurasi yang cocok.
manifests/apps/app2/overlay/dev/bjmanifests/apps/app2/overlay/staging/bj
{{index .path.segments n}}Jalur file konfigurasi yang cocok di repositori Git, dibagi menjadi elemen array (n - indeks array).
app1
app2
CatatanJika Anda menentukan
pathParamPrefix, saat ingin merujuk variabel seperti{{.path.basename}}, Anda harus menambahkan awalan jalur untuk mengakses variabel. Misalnya, variabel asli{{.path.basename}}harus dimodifikasi menjadi{{.target.path.basename}}, dimanatargetadalah nilai daripathParamPrefix.
Untuk memastikan keamanan lingkungan produksi, kami sarankan untuk memisahkan lingkungan produksi dan lingkungan pengembangan/pengujian/staging ke dalam dua ApplicationSets yang berbeda. Saat menghasilkan aplikasi lingkungan produksi, Anda harus memilih metode Manual Sync.
Langkah 3: Lihat ketergantungan penyebaran aplikasi dan status rilis
Karena setiap aplikasi perlu dirilis ke lingkungan pengembangan dan staging, app1 dan app2 masing-masing perlu menghasilkan dua aplikasi, total empat instans aplikasi. Urutan penyebaran mereka adalah dev-app1>dev-app2>staging-app1>staging-app2, dengan setiap aplikasi menunggu aplikasi sebelumnya untuk mensinkronkan dengan sukses dan mencapai status sehat sebelum memulai.
Gunakan konsol
Masuk ke konsol ACK One. Di panel navigasi di sebelah kiri, pilih .
Temukan aplikasi multi-cluster dan lihat nilai di kolom Application.

Aplikasi disebarkan dalam urutan berikut, dengan keluaran yang diharapkan sebagai berikut:
Sebarkan
dev-app1.
Sebarkan
dev-app2.
Sebarkan
staging-app1.
Sebarkan
staging-app2.
Gunakan CLI
Gunakan Fleet KubeConfig untuk menjalankan perintah berikut guna melihat status aplikasi:
kubectl -nargocd get appAplikasi disebarkan dalam urutan berikut, dengan keluaran yang diharapkan sebagai berikut:
Sebarkan
dev-app1.NAME SYNC STATUS HEALTH STATUS dev-app1-bj Synced Progressing dev-app2-bj OutOfSync Missing staging-app1-bj OutOfSync Missing staging-app2-bj OutOfSync MissingSebarkan
dev-app2.NAME SYNC STATUS HEALTH STATUS dev-app1-bj Synced Healthy dev-app2-bj Synced Progressing staging-app1-bj OutOfSync Missing staging-app2-bj OutOfSync MissingSebarkan
staging-app1.NAME SYNC STATUS HEALTH STATUS dev-app1-bj Synced Healthy dev-app2-bj Synced Healthy staging-app1-bj Synced Progressing staging-app2-bj OutOfSync MissingSebarkan
staging-app2.NAME SYNC STATUS HEALTH STATUS dev-app1-bj Synced Healthy dev-app2-bj Synced Healthy staging-app1-bj Synced Healthy staging-app2-bj Synced Progressing