All Products
Search
Document Center

Container Service for Kubernetes:Pemulihan bencana antarzona dengan gateway multi-kluster ACK One MSE

Last Updated:Mar 26, 2026

Gateway multi-kluster ACK One memungkinkan Anda membangun pemulihan bencana tingkat zona untuk aplikasi di beberapa kluster Kubernetes tanpa perlu mengelola alamat IP load balancer terpisah per kluster atau menginstal Ingress controller di setiap kluster. Topik ini menjelaskan dua mode pemulihan — zona redundansi aktif dan primer/sekunder — menggunakan aplikasi contoh yang dideploy melalui GitOps ke dua kluster ACK di zona ketersediaan (AZ) berbeda di wilayah China (Hong Kong).

Gateway multi-kluster hanya menangani failover trafik Lapisan 7. Pemulihan bencana data berada di luar cakupan fitur ini.

Cara kerja

Gateway multi-kluster ACK One dibangun di atas Ingress Microservices Engine (MSE) yang dikelola. Dikombinasikan dengan ACK One GitOps (Argo CD), pengaturannya bekerja sebagai berikut:

  1. Deploy aplikasi Anda ke beberapa kluster ACK di AZ berbeda menggunakan Argo CD.

  2. Buat gateway multi-kluster (MseIngressConfig) di instans fleet. Gateway menyediakan satu alamat IP Server Load Balancer (SLB) tingkat wilayah dan secara otomatis menemukan resource Ingress dengan ingressClass tertentu di semua kluster terkait.

  3. Buat objek Ingress di instans fleet untuk menentukan aturan routing trafik. Gateway meneruskan permintaan ke layanan Backend di kluster terkait dan secara otomatis melakukan failover trafik jika suatu kluster menjadi tidak sehat.

Komponen utama:

KomponenPeran
Instans fleet ACK OneControl plane untuk mengelola resource multi-kluster; tempat Anda membuat gateway dan objek Ingress
MSE Ingress (MseIngressConfig)Gateway cloud-native yang menangani routing Lapisan 7, load balancing, dan failover lintas kluster
Argo CD (GitOps)Deploy dan sinkronisasi aplikasi ke beberapa kluster ACK dari repositori Git
Kluster ACK (Kluster 1, Kluster 2)Kluster workload di AZ terpisah yang menjalankan aplikasi; ditambahkan ke gateway sebagai backend

Mode pemulihan

Kedua mode melindungi dari kegagalan tingkat AZ. Perbedaannya terletak pada cara distribusi trafik dalam kondisi normal.

ModeDistribusi trafik normalPerilaku failoverPaling cocok untuk
Active zone redundancyDibagi merata di semua kluster berdasarkan rasio replikaSecara otomatis dialihkan ke kluster sehatAplikasi stateless yang dapat diskalakan secara horizontal
Primer/sekunderSeluruh trafik dialihkan ke kluster primerSecara otomatis dialihkan ke sekunder saat primer tidak sehatAplikasi dengan backend stateful (database, cache) di mana konfigurasi aktif-aktif menambah kompleksitas

Prasyarat

Sebelum memulai, pastikan Anda telah:

Langkah 1: Deploy aplikasi ke beberapa kluster

Gunakan Argo CD untuk deploy aplikasi web-demo ke Kluster 1 dan Kluster 2. Aplikasi ini terdiri dari Deployment dan Service.

Pilih antara UI atau CLI Argo CD.

Deploy menggunakan UI Argo CD

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

  2. Di halaman Multi-cluster GitOps, klik GitOps Console.

    Jika GitOps belum diaktifkan, klik Enable GitOps. Untuk mengakses GitOps melalui jaringan publik, lihat Aktifkan akses publik ke Argo CD.
  3. Tambahkan repositori aplikasi.

    1. Di panel navigasi kiri Argo CD, klik Settings, lalu pilih Repositories > + Connect Repo.

    2. Konfigurasikan parameter berikut dan klik CONNECT.

      BagianParameterNilai
      Pilih metode koneksi AndaVIA HTTP/HTTPS
      CONNECT REPO USING HTTP/HTTPSTypegit
      Projectdefault
      Repository URLhttps://github.com/AliyunContainerService/gitops-demo.git
      Skip server verificationCentang kotak ini
      image.png

      Jika koneksi berhasil, CONNECTION STATUS menampilkan Successful.

      image.png
  4. Buat aplikasi untuk setiap kluster. Di halaman Applications, klik + NEW APP dan konfigurasikan parameter berikut. Ulangi langkah ini untuk Kluster 2, ganti URL kluster dan nilai envCluster sesuai kebutuhan.

    BagianParameterNilai
    GENERALApplication NameNama unik untuk aplikasi
    Project Namedefault
    SYNC POLICYManual (sinkronisasi sesuai permintaan) atau Automatic (Argo CD memeriksa repositori Git setiap 3 menit dan menerapkan perubahan secara otomatis)
    SYNC OPTIONSPilih AUTO-CREATE NAMESPACE
    SOURCERepository URLhttps://github.com/AliyunContainerService/gitops-demo.git
    RevisionBranches: gateway-demo
    Pathmanifests/helm/web-demo
    DESTINATIONCluster URLPilih URL untuk Kluster 1 (atau Kluster 2 untuk aplikasi kedua)
    Namespacegateway-demo
    Helm > ParametersenvClustercluster-demo-1 untuk Kluster 1, cluster-demo-2 untuk Kluster 2

Deploy menggunakan CLI Argo CD

  1. Tambahkan repositori Git.

    argocd repo add https://github.com/AliyunContainerService/gitops-demo.git --name ackone-gitops-demos

    Output yang diharapkan:

    Repository 'https://github.com/AliyunContainerService/gitops-demo.git' added
  2. Verifikasi repositori telah ditambahkan dan pastikan kedua kluster terdaftar.

    argocd repo list

    Output yang diharapkan:

    TYPE  NAME  REPO                                                       INSECURE  OCI    LFS    CREDS  STATUS      MESSAGE  PROJECT
    git         https://github.com/AliyunContainerService/gitops-demo.git  false     false  false  false  Successful           default
    argocd cluster list

    Output daftar kluster yang diharapkan:

    SERVER                          NAME                                        VERSION  STATUS      MESSAGE                                                  PROJECT
    https://1.1.XX.XX:6443      c83f3cbc90a****-temp01   1.22+    Successful
    https://2.2.XX.XX:6443      c83f3cbc90a****-temp02   1.22+    Successful
    https://kubernetes.default.svc  in-cluster                                           Unknown     Cluster has no applications and is not being monitored.
  3. Buat manifes aplikasi. Ganti repoURL dengan URL repositori aktual Anda, dan ganti ${cluster1_url} dan ${cluster2_url} dengan URL server API kluster dari langkah sebelumnya. apps-web-demo.yaml

    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: app-demo-cluster1
      namespace: argocd
    spec:
      destination:
        namespace: gateway-demo
        # https://1.1.XX.XX:6443
        server: ${cluster1_url}
      project: default
      source:
        helm:
          releaseName: "web-demo"
          parameters:
          - name: envCluster
            value: cluster-demo-1
          valueFiles:
          - values.yaml
        path: manifests/helm/web-demo
        repoURL: https://github.com/AliyunContainerService/gitops-demo.git
        targetRevision: gateway-demo
      syncPolicy:
        syncOptions:
        - CreateNamespace=true
    ---
    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: app-demo-cluster2
      namespace: argocd
    spec:
      destination:
        namespace: gateway-demo
        server: ${cluster2_url}
      project: default
      source:
        helm:
          releaseName: "web-demo"
          parameters:
          - name: envCluster
            value: cluster-demo-2
          valueFiles:
          - values.yaml
        path: manifests/helm/web-demo
        repoURL: https://github.com/AliyunContainerService/gitops-demo.git
        targetRevision: gateway-demo
      syncPolicy:
        syncOptions:
        - CreateNamespace=true
  4. Deploy aplikasi.

    kubectl apply -f apps-web-demo.yaml
  5. Verifikasi kedua aplikasi telah tersinkronisasi dan dalam kondisi sehat.

    argocd app list

    Output yang diharapkan:

    NAME                      CLUSTER                  NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                                       PATH                     TARGET
    argocd/web-demo-cluster1  https://10.1.XX.XX:6443             default  Synced  Healthy  Auto        <none>      https://github.com/AliyunContainerService/gitops-demo.git  manifests/helm/web-demo  main
    argocd/web-demo-cluster2  https://10.1.XX.XX:6443             default  Synced  Healthy  Auto        <none>      https://github.com/AliyunContainerService/gitops-demo.git  manifests/helm/web-demo  main

Langkah 2: Buat gateway multi-kluster

Buat resource MseIngressConfig di instans fleet untuk menyediakan gateway dan mengasosiasikan kedua kluster sebagai backend.

  1. Dapatkan ID vSwitch untuk instans fleet — lihat Dapatkan ID vSwitch.

  2. Buat manifes gateway. gateway.yaml

    Ganti ${vsw-id1} dan ${vsw-id2} dengan ID vSwitch, dan ${cluster1} dan ${cluster2} dengan ID kluster terkait. Untuk setiap kluster terkait, konfigurasikan aturan masuk grup keamanannya agar mengizinkan akses dari semua alamat IP dan port dalam blok CIDR vSwitch.
    ParameterDeskripsi
    mse.alibabacloud.com/remote-clustersID kluster yang akan ditambahkan ke gateway, dipisahkan koma. Harus merupakan kluster yang sudah diasosiasikan dengan instans fleet.
    spec.nameNama instans gateway.
    spec.common.instance.spec(Opsional) Tipe instans. Default: 4c8g.
    spec.common.instance.replicas(Opsional) Jumlah replika gateway. Default: 3.
    spec.ingress.local.ingressClass(Opsional) Nama kelas Ingress yang akan didengarkan. Gateway mendengarkan semua resource Ingress di instans fleet di mana ingressClass diatur ke mse.
    apiVersion: mse.alibabacloud.com/v1alpha1
    kind: MseIngressConfig
    metadata:
      annotations:
        mse.alibabacloud.com/remote-clusters: ${cluster1},${cluster2}
      name: ackone-gateway-hongkong
    spec:
      common:
        instance:
          replicas: 3
          spec: 2c4g
        network:
          vSwitches:
          - ${vsw-id}
      ingress:
        local:
          ingressClass: mse
      name: mse-ingress
  3. Deploy gateway.

    kubectl apply -f gateway.yaml
  4. Tunggu hingga gateway mencapai status Listening. Fase Pending, saat gateway cloud-native sedang dibuat, mungkin memerlukan waktu sekitar 3 menit.

    StatusDeskripsi
    PendingGateway sedang disediakan (~3 menit)
    RunningGateway telah dibuat dan berjalan
    ListeningGateway berjalan dan memantau resource Ingress
    FailedGateway tidak valid; periksa bidang Status untuk detailnya
    kubectl get mseingressconfig ackone-gateway-hongkong

    Output yang diharapkan:

    NAME                      STATUS      AGE
    ackone-gateway-hongkong   Listening   3m15s

    Nilai status gateway:

  5. Konfirmasi kedua kluster telah berhasil ditambahkan.

    kubectl get mseingressconfig ackone-gateway-hongkong -ojsonpath="{.status.remoteClusters}"

    Output yang diharapkan:

    [{"clusterId":"c7fb82****"},{"clusterId":"cd3007****"}]

    Kedua ID kluster muncul tanpa pesan Failed, yang mengonfirmasi kluster terhubung ke gateway.

Langkah 3: Konfigurasikan pemulihan bencana antarzona menggunakan Ingress

Gateway multi-kluster menggunakan resource Ingress yang didefinisikan di instans fleet untuk meneruskan trafik lintas kluster. Buat objek Ingress di namespace gateway-demo — namespace yang sama tempat aplikasi dideploy.

Penting

Namespace gateway-demo harus ada di instans fleet sebelum Anda membuat resource Ingress.

Pilih mode pemulihan yang sesuai dengan aplikasi Anda:

Zona redundansi aktif

Dalam mode zona redundansi aktif, trafik dibagi merata di semua backend kluster berdasarkan rasio replika. Jika suatu kluster menjadi tidak sehat, gateway secara otomatis mengalihkan bagian trafiknya ke kluster sehat yang tersisa.

Contoh: Dengan 9 replika di Kluster 1 dan 1 replika di Kluster 2, 90% trafik dialihkan ke Kluster 1 dan 10% ke Kluster 2 secara default. Jika semua backend Kluster 1 gagal, 100% trafik dialihkan ke Kluster 2.

image.png

Buat Ingress untuk zona redundansi aktif

Buat Ingress yang meneruskan trafik ke service1 di domain example.com. Gateway mendistribusikan permintaan ke Service dengan nama yang sama di kedua kluster.

ingress-demo.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-demo
spec:
  ingressClassName: mse
  rules:
  - host: example.com
    http:
      paths:
      - path: /svc1
        pathType: Exact
        backend:
          service:
            name: service1
            port:
              number: 80

Deploy Ingress di instans fleet.

kubectl apply -f ingress-demo.yaml -n gateway-demo

Verifikasi zona redundansi aktif

  1. Dapatkan Alamat IP publik gateway multi-kluster.

    kubectl get ingress web-demo -n gateway-demo -ojsonpath="{.status.loadBalancer}"
  2. Kirim 100 permintaan dan amati distribusi trafik. Ganti XX.XX.XX.XX dengan alamat IP gateway.

    for i in {1..100}; do curl -H "host: example.com" XX.XX.XX.XX; done

    Hasil yang diharapkan: Trafik didistribusikan antara Kluster 1 dan Kluster 2 dengan rasio 9:1.

    image.png

  3. Simulasikan kegagalan kluster dengan menskalakan replika Deployment di Kluster 1 menjadi 0. Seluruh trafik secara otomatis dialihkan ke Kluster 2.

    image.png

Lakukan rilis canary dengan routing berbasis header

Dalam mode zona redundansi aktif, Anda dapat menguji rilis canary di satu kluster tanpa memengaruhi trafik langsung. Deploy versi canary sebagai Service dan Deployment terpisah, lalu gunakan anotasi Ingress untuk meneruskan permintaan dengan header tertentu ke versi tersebut.

  1. Deploy aplikasi canary di Kluster 1. new-app.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: service1-canary-1
      namespace: gateway-demo
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: web-demo-canary-1
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-demo-canary-1
      namespace: gateway-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: web-demo-canary-1
      template:
        metadata:
          labels:
            app: web-demo-canary-1
        spec:
          containers:
            - env:
                - name: ENV_NAME
                  value: cluster-demo-1-canary
              image: 'registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.6.0'
              imagePullPolicy: Always
              name: web-demo
    kubectl apply -f new-app.yaml
  2. Buat Ingress canary berbasis header di instans fleet. Permintaan dengan header canary-dest: cluster1 akan diteruskan ke Service canary. new-ingress.yaml

    AnotasiDeskripsi
    nginx.ingress.kubernetes.io/canaryDiatur ke "true" untuk mengaktifkan routing berbasis header untuk Ingress ini
    nginx.ingress.kubernetes.io/canary-by-headerKunci header yang dicocokkan (canary-dest)
    nginx.ingress.kubernetes.io/canary-by-header-valueNilai header yang dicocokkan (cluster1)
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: web-demo-canary-1
      namespace: gateway-demo
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "canary-dest"
        nginx.ingress.kubernetes.io/canary-by-header-value: "cluster1"
    spec:
      ingressClassName: mse
      rules:
      - host: example.com
        http:
          paths:
          - path: /svc1
            pathType: Exact
            backend:
              service:
                name: service1-canary-1
                port:
                  number: 80
    kubectl apply -f new-ingress.yaml
  3. Verifikasi bahwa permintaan dengan header tersebut diteruskan ke versi canary.

    for i in {1..100}; do curl -H "host: example.com" -H "canary-dest: cluster1" XX.XX.XX.XX/svc1; sleep 1; done

    Hasil yang diharapkan: Semua permintaan dengan canary-dest: cluster1 ditangani oleh rilis canary di Kluster 1.

    image.png

Pemulihan bencana primer/sekunder

Dalam mode primer/sekunder, seluruh trafik dialihkan ke Kluster 1 (primer) dalam kondisi normal. Jika Kluster 1 menjadi tidak sehat, gateway secara otomatis mengalihkan trafik ke Kluster 2 (sekunder).

image.png

Mode ini menggunakan dua anotasi spesifik MSE untuk mengikat rute Ingress ke kluster tertentu:

AnotasiDeskripsi
mse.ingress.kubernetes.io/service-subsetLabel deskriptif untuk subset layanan. Gunakan nama yang menunjukkan kluster target.
mse.ingress.kubernetes.io/subset-labelsID kluster yang dituju, menggunakan label topology.istio.io/cluster.

Untuk daftar lengkap anotasi Ingress MSE, lihat Anotasi yang didukung oleh gateway Ingress MSE.

Buat Ingress untuk pemulihan bencana primer/sekunder

  1. Buat Ingress primer yang mengikat trafik ke Kluster 1. Ganti ${cluster1-id} dengan ID kluster aktual. ingress-demo-cluster-one.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        mse.ingress.kubernetes.io/service-subset: cluster-demo-1
        mse.ingress.kubernetes.io/subset-labels: |
          topology.istio.io/cluster ${cluster1-id}
      name: web-demo-cluster-one
    spec:
      ingressClassName: mse
      rules:
      - host: example.com
        http:
          paths:
          - path: /service1
            pathType: Exact
            backend:
              service:
                name: service1
                port:
                  number: 80
    kubectl apply -f ingress-demo-cluster-one.yaml -n gateway-demo

Lakukan rilis canary tingkat kluster

Gunakan Ingress canary berbasis header bersama Ingress primer untuk meneruskan permintaan tertentu ke Kluster 2 guna validasi, tanpa mengubah jalur trafik default.

  1. Buat Ingress canary yang menargetkan Kluster 2. Ganti ${cluster2-id} dengan ID kluster aktual. ingress-demo-cluster-gray.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        mse.ingress.kubernetes.io/service-subset: cluster-demo-2
        mse.ingress.kubernetes.io/subset-labels: |
          topology.istio.io/cluster ${cluster2-id}
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "app-web-demo-version"
        nginx.ingress.kubernetes.io/canary-by-header-value: "gray"
      name: web-demo-cluster-gray
    spec:
      ingressClassName: mse
      rules:
      - host: example.com
        http:
          paths:
          - path: /service1
            pathType: Exact
            backend:
              service:
                name: service1
                port:
                  number: 80
    kubectl apply -f ingress-demo-cluster-gray.yaml -n gateway-demo

Verifikasi pemulihan bencana primer/sekunder

  1. Dapatkan Alamat IP publik gateway multi-kluster.

    kubectl get ingress web-demo -n gateway-demo -ojsonpath="{.status.loadBalancer}"
  2. Konfirmasi trafik default dialihkan ke Kluster 1.

    for i in {1..100}; do curl -H "host: example.com" XX.XX.XX.XX/service1; sleep 1; done

    Hasil yang diharapkan: Seluruh trafik default ditangani oleh Kluster 1.

    image.png

  3. Konfirmasi trafik canary dialihkan ke Kluster 2.

    for i in {1..50}; do curl -H "host: example.com" -H "app-web-demo-version: gray" XX.XX.XX.XX/service1; sleep 1; done

    Hasil yang diharapkan: Semua permintaan dengan app-web-demo-version: gray ditangani oleh Kluster 2.

    image.png

  4. Simulasikan kegagalan Kluster 1 dengan menskalakan replika Deployment menjadi 0. Seluruh trafik default secara otomatis dialihkan ke Kluster 2.

    image.png

Langkah selanjutnya