All Products
Search
Document Center

Container Service for Kubernetes:Gunakan StatefulSet untuk membuat aplikasi berstatus

Last Updated:Nov 11, 2025

Berbeda dengan Penyebaran (Deployments), StatefulSet mempertahankan informasi mengenai status Pod. Oleh karena itu, StatefulSet sangat ideal untuk skenario yang menggunakan database, antrian pesan, atau sistem penyimpanan terdistribusi. Topik ini memperkenalkan StatefulSet dan menjelaskan cara membuat StatefulSet di Konsol Container Service for Kubernetes (ACK) atau menggunakan kubectl.

Pengenalan StatefulSet

Seperti halnya Penyebaran (Deployment), StatefulSet mempertahankan sejumlah Pod tertentu yang berjalan secara normal. Namun, StatefulSet menyediakan fitur-fitur berikut untuk mempertahankan identitas Pod:

  • Nama Pod yang terurut dan tetap: Pod yang dibuat oleh StatefulSet diberi nama secara berurutan dalam format <Nama StatefulSet>-<Nomor seri>. Misalnya, jika dua Pod disediakan oleh StatefulSet bernama db-app, maka Pod tersebut diberi nama db-app-0 dan db-app-1. Ketika sebuah Pod dibuat ulang, nama aslinya tetap digunakan.

  • Identifikasi jaringan yang stabil: Dalam kebanyakan kasus, Anda perlu mengaitkan Layanan headless (headless Service) dengan StatefulSet. Anda dapat menentukan nama Layanan headless di parameter spec.serviceName StatefulSet. Layanan headless tidak melakukan load balancing terhadap Pod StatefulSet. Sebaliknya, Layanan tersebut hanya menyediakan nama domain tetap untuk Pod. Alamat IP semua Pod backend Layanan headless dikembalikan sebagai respons terhadap kueri DNS untuk Layanan headless tersebut. Setelah Anda mengaitkan Layanan headless dengan StatefulSet, nama domain Pod menggunakan format <Nama Pod>.<Nama Layanan Headless>.<namespace>.svc.<ClusterDomain>. Contoh: db-app-01.db-app.default.svc.cluster.local. Jika sebuah Pod dibuat ulang, nama domain Pod tersebut secara otomatis diarahkan ke alamat IP Pod baru.

  • Penyimpanan persisten yang stabil: Anda dapat menentukan templat klaim volume persisten (PVC) di parameter spec.volumeClaimTemplates StatefulSet. StatefulSet secara otomatis membuat PVC terpisah untuk setiap Pod berdasarkan templat yang ditentukan. PVC diberi nama dalam format <Nama templat PVC>-<Nama Pod>. Ketika sebuah Pod dihapus, PVC terkait tetap dipertahankan. Saat Pod dibuat ulang, PVC secara otomatis dikaitkan kembali dengan Pod baru yang memiliki nomor seri asli.

Ketika sebuah Pod StatefulSet dibuat ulang, fitur-fitur ini memastikan bahwa Pod baru mewarisi status jaringan dan penyimpanan dari Pod aslinya. Hal ini memungkinkan Pod baru untuk pulih dengan data yang tersimpan di penyimpanan persisten. Untuk informasi lebih lanjut tentang StatefulSet, lihat StatefulSets.

Penting

Create a StatefulSet

Buat dari konsol

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, temukan kluster yang diinginkan lalu klik namanya. Di panel kiri, pilih Workloads > StatefulSets.

  3. Di pojok kanan atas halaman StatefulSets, klik Create From Image.

  4. Pada langkah Basic Information, konfigurasikan pengaturan dasar aplikasi. Klik Next untuk menuju ke halaman Container.

  5. Pada langkah Container, konfigurasikan parameter Image Name dan Port. Parameter lain bersifat opsional. Biarkan pengaturan default. Klik Next untuk menuju ke halaman Advanced. Bagian berikut menjelaskan detail gambar kontainer.

    Penting

    Sebelum menarik gambar ini, Anda perlu mengaktifkan akses Internet untuk kluster. Jika Anda mempertahankan nilai default untuk parameter Configure SNAT For VPC saat membuat kluster, maka kluster dapat mengakses Internet. Untuk informasi lebih lanjut tentang cara mengaktifkan akses Internet untuk kluster ACK yang sudah ada, lihat Enable an existing ACK cluster to access the Internet.

    registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest

    image

  6. Pada langkah Advanced, konfigurasikan pengaturan berikut: kontrol akses, penskalaan, penjadwalan, label, dan anotasi. Di bagian Access Control, buat layanan ClusterIP. Saat mengonfigurasi Layanan tersebut, pilih Headless Service lalu klik OK. Kemudian, klik Create di bagian bawah halaman.

    image

  7. Parameter pada langkah Basic Information, Container, dan Advanced sama seperti saat Anda membuat Penyebaran (Deployment). Untuk informasi lebih lanjut tentang parameter lainnya, lihat Parameters.

Gunakan kubectl

Penting
  1. Buat file bernama statefulset.yaml dan salin templat YAML berikut ke dalam file tersebut. Templat YAML mencakup sumber daya berikut:

    • Layanan headless bernama nginx. Layanan headless digunakan untuk menyediakan nama domain yang stabil.

    • StatefulSet yang memiliki volume hostPath yang dipasang.

    • Layanan LoadBalancer yang digunakan untuk mengekspos StatefulSet. Dalam contoh ini, Layanan membantu Anda memverifikasi fitur-fitur StatefulSet.

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      clusterIP: None  # Headless Service
      selector:
        app: nginx
      ports:
      - port: 80
        name: http
    ---
    apiVersion: apps/v1
    kind: StatefulSet   # The workload type.
    metadata:
      name: nginx-test
      namespace: default  # Change the namespace as needed.
      labels:
        app: nginx
    spec:
      serviceName: "nginx" # Specify the name of the headless Service you created.
      replicas: 2  # Specify the number of pods.
      selector:
        matchLabels:
          app: nginx
      template: # The pod configurations.
        metadata:
          labels: # The pod labels.
            app: nginx 
        spec:
          containers:
          - name: nginx  # The name of the container.
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6  # The version of the NGINX image.
            ports:
            - containerPort: 80  # The port exposed by the container.
              protocol: TCP  # Set the protocol to TCP or UDP.
            volumeMounts:
            - name: node-dir-volume  # The volume name. The value must be the same as the volume name specified in the following volumes section.
              mountPath: /tmp  # The mount path of the volume in the container.
          volumes:
          - name: node-dir-volume
            hostPath:
              path: /local_storage  # The directory on the host that you want to mount as a volume.
              type: DirectoryOrCreate     # If the specified directory does not exist, the system automatically creates the directory.
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-test-svc
      namespace: default  # Change the namespace as needed.
      labels:
        app: nginx
    spec:
      selector:
        app: nginx  # The label used to match backend pods.
      ports:
        - port: 80           # The port provided by the Service in the cluster.
          targetPort: 80     # The port on which the application in the container listens (containerPort).
          protocol: TCP      # The protocol. Default value: TCP.
      type: LoadBalancer      # The Service type. Default value: ClusterIP. ClusterIP Services are accessible from within the cluster.
  2. Jalankan perintah berikut untuk membuat StatefulSet dan Layanan:

    kubectl apply -f statefulset.yaml

    Output yang diharapkan:

    service/nginx created
    statefulset.apps/nginx-test created
    service/nginx-test-svc created
  3. Jalankan perintah berikut untuk mengkueri alamat IP publik Layanan:

    kubectl get svc

    Output yang diharapkan:

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
    kubernetes      ClusterIP      172.16.**.***    <none>          443/TCP        4h47m
    nginx           ClusterIP      None             <none>          80/TCP         1h10m
    nginx-test-svc  LoadBalancer   172.16.**.***    106.14.**.***   80:31130/TCP   1h10m
  4. Masukkan alamat IP publik (106.14.**.***) NGINX ke bilah alamat browser Anda untuk mengakses kontainer NGINX tempat beban kerja tersebut berada.image

Verifikasi fitur-fitur StatefulSet

  1. Jalankan perintah berikut untuk mengkueri status Pod:

    kubectl get pod nginx-test-0

    Output yang diharapkan:

    NAME           READY   STATUS    RESTARTS   AGE
    nginx-test-0   1/1     Running   0          7m41s
  2. Jalankan perintah berikut untuk menghapus Pod:

    kubectl delete pod nginx-test-0

    Output yang diharapkan:

    pod "nginx-test-0" deleted
  3. Jalankan perintah berikut untuk mengkueri status Pod:

    kubectl get pod nginx-test-0

    Running ditampilkan di kolom STATUS pada output. Hal ini menunjukkan bahwa Pod baru telah dibuat dengan nama asli dan berjalan secara normal.

    NAME           READY   STATUS    RESTARTS   AGE
    nginx-test-0   1/1     Running   0          20s

Referensi

  • Untuk informasi lebih lanjut tentang cara menangani masalah yang terjadi saat membuat beban kerja, lihat FAQ about workloads.

  • Untuk informasi lebih lanjut tentang cara memecahkan masalah pengecualian Pod, lihat Pod troubleshooting.