All Products
Search
Document Center

Container Service for Kubernetes:Terapkan kluster MySQL stateful dan ketersediaan tinggi di ACK Serverless

Last Updated:Dec 26, 2025

Ketersediaan tinggi sangat penting untuk aplikasi terdistribusi. Di Kluster ACK Serverless, Anda dapat memanfaatkan semantik penjadwalan native Kubernetes untuk menyebarkan aplikasi terdistribusi ke beberapa zona guna mencapai penerapan berketersediaan tinggi. Dokumen ini menjelaskan cara menerapkan kluster MySQL stateful dengan ketersediaan tinggi di ACK Serverless.

Prasyarat

Langkah 1: Tarik file YAML dari GitHub untuk membuat sumber daya Kubernetes

  1. Jalankan perintah berikut untuk mengkloning repositori kode.

    git clone https://github.com/AliyunContainerService/serverless-k8s-examples.git
  2. Jalankan perintah berikut untuk masuk ke direktori kerja dan melihat daftar file YAML.

    cd serverless-k8s-examples/stateful-mysql
    ls -al

    Output yang diharapkan:

    README.md		secret.yaml		stateful-mysql.yaml	 storageclass.yaml

    File secret.yaml digunakan untuk membuat Secret, file storageclass.yaml digunakan untuk membuat StorageClass, dan file stateful-mysql.yaml digunakan untuk membuat StatefulSet MySQL.

Langkah 2: Buat namespace, Secret, dan StorageClass

  1. Jalankan perintah berikut untuk membuat namespace mysql.

    kubectl create namespace mysql

    Output yang diharapkan:

    namespace/mysql created
  2. Jalankan perintah berikut untuk membuat Secret guna menyimpan password MySQL.

    kubectl apply -n mysql -f secret.yaml

    Output yang diharapkan:

    secret/mysql-secret created

    Berikut adalah file YAML untuk Secret tersebut.

    Klik untuk melihat file YAML

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql-secret
    type: Opaque
    data:
      password: VGVzdFBhc3N3b3JkMTIz            # Masukkan password yang telah dienkripsi Base64.
      admin-password: QWRtaW5QYXNzd29yZDQ1Ng==  # Masukkan password admin yang telah dienkripsi Base64.
    # Hasilkan enkripsi Base64 untuk password.
    echo -n "your-password" | base64
    
    # Hasilkan enkripsi Base64 untuk password admin.
    echo -n "your-admin-password" | base64
  3. Jalankan perintah berikut untuk membuat StorageClass.

    kubectl apply -f storageclass.yaml

    Output yang diharapkan:

    storageclass.storage.k8s.io/fast-storageclass created

    Berikut adalah file YAML untuk StorageClass tersebut.

    Klik untuk melihat file YAML

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: fast-storageclass
    provisioner: diskplugin.csi.alibabacloud.com
    parameters:
      type: cloud_auto,cloud_essd,cloud_ssd # Konfigurasi ini secara adaptif memilih tipe disk berdasarkan prioritas. Tipe disk akhir bergantung pada faktor seperti instans node dan tipe disk yang didukung di zona tersebut.
      fstype: ext4
      diskTags: "a:b,b:c"
      encrypted: "false"
      performanceLevel: PL1
      volumeExpandAutoSnapshot: "forced" # Pengaturan ini hanya berlaku jika tipe disk yang dibuat adalah cloud_essd.
      provisionedIops: "40000"
      burstingEnabled: "false"
    volumeBindingMode: WaitForFirstConsumer # Menunda pembuatan disk hingga Pod dibuat. Ini memastikan disk dibuat di zona yang sama dengan Pod.
    reclaimPolicy: Retain
    allowVolumeExpansion: true

Langkah 3: Konfigurasikan penyebaran topologi Pod dan buat StatefulSet MySQL

  1. Jalankan perintah berikut untuk membuat StatefulSet MySQL. Contoh ini membuat StatefulSet yang tersebar merata di beberapa zona dengan mengonfigurasi batasan penyebaran topologi Pod untuk node virtual. Untuk informasi selengkapnya tentang cara menyebarkan Pod di beberapa zona pada node virtual, lihat Spread pods on virtual nodes across zones and configure affinity.

    kubectl apply -n mysql -f stateful-mysql.yaml

    Output yang diharapkan:

    statefulset.apps/dbc1 created

    Berikut adalah file YAML untuk StatefulSet tersebut.

    Klik untuk melihat file YAML

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: dbc1
      labels:
        app: mysql
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: mysql
      serviceName: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          topologySpreadConstraints:
            - maxSkew: 1
              topologyKey: "topology.kubernetes.io/zone"
              whenUnsatisfiable: DoNotSchedule
              labelSelector:
                matchLabels:
                  app: mysql
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchExpressions:
                      - key: app
                        operator: In
                        values:
                          - mysql
                  topologyKey: "kubernetes.io/hostname"
          containers:
            - name: mysql
              image: registry.cn-hangzhou.aliyuncs.com/kubeway/hub:mysql-server_8.0.28
              command:
                - /bin/bash
              args:
                - -c
                - >-
                  /entrypoint.sh
                  --server-id=$((20 +  $(echo $HOSTNAME | grep -o '[^-]*$') + 1))
                  --report-host=${HOSTNAME}.mysql.mysql.svc.cluster.local
                  --binlog-checksum=NONE
                  --enforce-gtid-consistency=ON
                  --gtid-mode=ON
                  --default-authentication-plugin=mysql_native_password
              env:
                - name: MYSQL_ROOT_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: mysql-secret
                      key: password
                - name: MYSQL_ADMIN_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: mysql-secret
                      key: admin-password
                - name: MYSQL_ROOT_HOST
                  value: "%"
              ports:
                - name: mysql
                  containerPort: 3306
                - name: mysqlx
                  containerPort: 33060
                - name: xcom
                  containerPort: 33061
              resources:
                limits:
                  cpu: "500m"
                  ephemeral-storage: "1Gi"
                  memory: "1Gi"
                requests:
                  cpu: "500m"
                  ephemeral-storage: "1Gi"
                  memory: "1Gi"
              volumeMounts:
                - name: mysql
                  mountPath: /var/lib/mysql
                  subPath: mysql
              readinessProbe:
                exec:
                  command:
                    - bash
                    - "-c"
                    - |
                      mysql -h127.0.0.1 -uroot -p$MYSQL_ROOT_PASSWORD -e'SELECT 1'
                initialDelaySeconds: 5
                periodSeconds: 2
                timeoutSeconds: 1
              livenessProbe:
                exec:
                  command:
                    - bash
                    - "-c"
                    - |
                      mysqladmin -uroot -p$MYSQL_ROOT_PASSWORD ping
                initialDelaySeconds: 30
                periodSeconds: 10
                timeoutSeconds: 5
      updateStrategy:
        rollingUpdate:
          partition: 0
        type: RollingUpdate
      volumeClaimTemplates:
        - metadata:
            name: mysql
            labels:
              app: mysql
          spec:
            storageClassName: fast-storageclass
            volumeMode: Filesystem
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 25Gi

Langkah 4: Verifikasi penerapan Pod di kluster MySQL

  1. Jalankan perintah berikut untuk memverifikasi bahwa StatefulSet telah dibuat.

    kubectl get statefulset -n mysql

    Output yang diharapkan:

    NAME   READY   AGE
    dbc1   3/3     7m21s
  2. Jalankan perintah berikut untuk melihat detail Pod.

    kubectl -n mysql get po -o wide

    Output yang diharapkan:

    NAME     READY   STATUS    RESTARTS   AGE     IP             NODE                            NOMINATED NODE   READINESS GATES
    dbc1-0   1/1     Running   0          2m28s   10.1.214.213   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dbc1-1   1/1     Running   0          106s    10.3.146.113   virtual-kubelet-cn-hangzhou-h   <none>           <none>
    dbc1-2   1/1     Running   0          64s     10.4.232.78    virtual-kubelet-cn-hangzhou-g   <none>           <none>

    Kolom `NODE` menunjukkan node tempat setiap Pod diterapkan. Nama node tersebut berisi informasi zona, yang menunjukkan bahwa Pod tersebar di zona yang berbeda.

Referensi