全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan ApplicationSets untuk mengoordinasikan penyebaran multi-lingkungan dan ketergantungan aplikasi

更新时间:Jul 02, 2025

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:

  1. Tentukan aplikasi untuk penyebaran multi-lingkungan (dev/staging) menggunakan Matrix Generator, serta tambahkan label ke aplikasi untuk mengidentifikasi nama mereka.

  2. Tentukan urutan pembuatan aplikasi dengan ketergantungan dalam rollingSync. Sebagai contoh, sebarkan app1 terlebih dahulu, lalu sebarkan app2.

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.

Catatan

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.yaml
  • manifests/apps/env: Konfigurasikan parameter ini sesuai dengan lingkungan tertentu.

    Penting

    Jika Anda menggunakan contoh ini untuk penyebaran, buat fork contoh ke repositori Anda sendiri dan modifikasi cluster_address di config.json menjadi 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:

  1. Gunakan Fleet kubeconfig untuk menjalankan perintah berikut guna memodifikasi konfigurasi:

    kubectl edit cm -nargocd argocd-cmd-params-cm

    Tambahkan konfigurasi applicationsetcontroller.enable.progressive.syncs: "true" ke argocd-cmd-params-cm.

    apiVersion: v1
    data:
      applicationsetcontroller.enable.progressive.syncs: "true"
      ...
    kind: ConfigMap
    metadata:
      name: argocd-cmd-params-cm
      namespace: argocd
      ...
  2. 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

  1. Masuk ke konsol ACK One. Di panel navigasi di sebelah kiri, pilih Fleet > Multi-cluster Applications.

  2. Klik Create Multi-cluster Application > GitOps 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=true

    Contoh 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.steps dari 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/bj

      • manifests/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

      Catatan

      Jika 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}}, dimana target adalah nilai dari pathParamPrefix.

Penting

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

  1. Masuk ke konsol ACK One. Di panel navigasi di sebelah kiri, pilih Fleet > Multi-cluster Applications.

  2. Temukan aplikasi multi-cluster dan lihat nilai di kolom Application.image

    Aplikasi disebarkan dalam urutan berikut, dengan keluaran yang diharapkan sebagai berikut:

    1. Sebarkan dev-app1.

      image

    2. Sebarkan dev-app2.image

    3. Sebarkan staging-app1.image

    4. Sebarkan staging-app2.image

Gunakan CLI

Gunakan Fleet KubeConfig untuk menjalankan perintah berikut guna melihat status aplikasi:

 kubectl -nargocd get app

Aplikasi disebarkan dalam urutan berikut, dengan keluaran yang diharapkan sebagai berikut:

  1. 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     Missing
  2. Sebarkan 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     Missing
  3. Sebarkan 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     Missing
  4. Sebarkan 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