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.serviceNameStatefulSet. 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.volumeClaimTemplatesStatefulSet. 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.
Create a StatefulSet
Buat dari konsol
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang diinginkan lalu klik namanya. Di panel kiri, pilih .
Di pojok kanan atas halaman StatefulSets, klik Create From Image.
Pada langkah Basic Information, konfigurasikan pengaturan dasar aplikasi. Klik Next untuk menuju ke halaman Container.
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.
PentingSebelum 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
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.

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
Sebelum membuat beban kerja, pastikan Anda telah terhubung ke kluster menggunakan kubectl. Untuk informasi lebih lanjut, lihat Obtain the kubeconfig file of a cluster and use kubectl to connect to the cluster.
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
hostPathyang 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.Jalankan perintah berikut untuk membuat StatefulSet dan Layanan:
kubectl apply -f statefulset.yamlOutput yang diharapkan:
service/nginx created statefulset.apps/nginx-test created service/nginx-test-svc createdJalankan perintah berikut untuk mengkueri alamat IP publik Layanan:
kubectl get svcOutput 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 1h10mMasukkan alamat IP publik (
106.14.**.***) NGINX ke bilah alamat browser Anda untuk mengakses kontainer NGINX tempat beban kerja tersebut berada.
Verifikasi fitur-fitur StatefulSet
Jalankan perintah berikut untuk mengkueri status Pod:
kubectl get pod nginx-test-0Output yang diharapkan:
NAME READY STATUS RESTARTS AGE nginx-test-0 1/1 Running 0 7m41sJalankan perintah berikut untuk menghapus Pod:
kubectl delete pod nginx-test-0Output yang diharapkan:
pod "nginx-test-0" deletedJalankan perintah berikut untuk mengkueri status Pod:
kubectl get pod nginx-test-0Runningditampilkan di kolomSTATUSpada 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.