Membuat workload stateful

Halaman ini menjelaskan cara membuat dan mengelola workload stateful dalam cluster Kubernetes air-gapped Google Distributed Cloud (GDC). Workload stateful memungkinkan Anda menskalakan deployment aplikasi dengan penyimpanan persisten. Penyimpanan persisten memberikan identitas yang konsisten dan nama host yang stabil untuk aplikasi Anda, terlepas dari tempat beban kerjanya dijadwalkan.

Halaman ini ditujukan bagi developer dalam grup operator aplikasi, yang bertanggung jawab membuat workload aplikasi untuk organisasi mereka. Untuk mengetahui informasi selengkapnya, lihat dokumentasi Audiens untuk GDC yang terisolasi dari internet.

Sebelum memulai

Untuk menjalankan perintah terhadap cluster Kubernetes, pastikan Anda memiliki resource berikut:

  1. Temukan nama cluster Kubernetes, atau tanyakan kepada Administrator Platform Anda nama cluster tersebut.

  2. Login dan buat file kubeconfig untuk cluster Kubernetes jika Anda belum memilikinya.

  3. Gunakan jalur kubeconfig cluster Kubernetes untuk mengganti KUBERNETES_CLUSTER_KUBECONFIG dalam petunjuk ini.

Untuk mendapatkan izin yang diperlukan guna membuat workload stateful, minta Admin IAM Organisasi Anda untuk memberi Anda peran Admin Namespace (namespace-admin) di namespace project Anda.

Buat resource StatefulSet

Buat objek StatefulSet dengan menulis manifes StatefulSet dan menjalankan kubectl apply untuk membuat resource. Untuk menyediakan cara yang stabil bagi klien untuk mengirim permintaan ke pod resource StatefulSet, Anda juga harus membuat objek Service.

Perintah kubectl apply menggunakan file manifes untuk membuat, memperbarui, dan menghapus resource di cluster Kubernetes Anda. Ini adalah metode deklaratif konfigurasi objek. Metode ini mempertahankan penulisan yang dilakukan pada objek aktif tanpa menggabungkan kembali perubahan ke dalam file konfigurasi objek.

Untuk membuat resource StatefulSet dan Service, jalankan:

kubectl --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG -n NAMESPACE \
    apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: SERVICE_NAME
  labels:
    app: APP_NAME
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: APP_NAME
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  selector:
    matchLabels:
      app: APP_LABEL_NAME
  serviceName: "SERVICE_NAME"
  replicas: NUMBER_OF_REPLICAS
  template:
    metadata:
      labels:
        app: APP_LABEL_NAME
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: CONTAINER_NAME
        image: CONTAINER_IMAGE
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: CONTAINER_STORAGE_VOLUME_PATH
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
EOF

Ganti kode berikut:

  • KUBERNETES_CLUSTER_KUBECONFIG: file kubeconfig untuk cluster tempat Anda men-deploy workload container.

  • NAMESPACE: namespace project tempat men-deploy workload penampung.

  • SERVICE_NAME: nama objek Service. Pastikan objek StatefulSet menetapkan objek Service di serviceName-nya juga.

  • APP_NAME: nama aplikasi yang akan dijalankan dalam deployment.

  • APP_LABEL_NAME: pemilih label yang menentukan pod mana yang termasuk dalam objek StatefulSet.

  • STATEFULSET_NAME: nama objek StatefulSet.

  • NUMBER_OF_REPLICAS: jumlah objek Pod replika yang dikelola deployment.

  • CONTAINER_NAME: nama container.

  • CONTAINER_IMAGE: nama image container. Anda harus menyertakan jalur registry container dan versi image, seperti REGISTRY_PATH/nginx:1.23.

  • CONTAINER_STORAGE_VOLUME_PATH: jalur dalam container tempat volume penyimpanan dipasang.

Sebagai contoh, objek StatefulSet berikut dan objek Service yang sesuai membuat workload container stateful:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: REGISTRY_PATH/nginx:1.23
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Dalam contoh ini:

  • Objek Service bernama nginx dibuat, yang ditunjukkan oleh kolom metadata: name. Objek Service menargetkan aplikasi bernama nginx, yang ditunjukkan oleh labels.app: nginx dan selector.app: nginx. Objek Service mengekspos port 80 dan menamainya web. Objek Service ini mengontrol domain jaringan dan merutekan traffic internet ke aplikasi dalam container yang di-deploy oleh objek StatefulSet.
  • StatefulSet bernama web dibuat dengan tiga objek Pod yang direplikasi, seperti yang ditetapkan oleh kolom replicas: 3.
  • Template Pod, yang ditetapkan oleh bagian .spec.template, menunjukkan bahwa objek Pod diberi label app: nginx.
  • Spesifikasi Pod, yang ditetapkan oleh bagian .template.spec, menunjukkan bahwa Pod StatefulSet menjalankan satu container, nginx, yang menjalankan image nginx pada versi 1.23.
  • Spesifikasi Pod menggunakan port web yang dibuka oleh objek Service.
  • Bagian .template.spec.volumeMounts menentukan kolom mountPath, yang diberi nama www. mountPath adalah jalur dalam container tempat volume penyimpanan dipasang.
  • StatefulSet menyediakan tiga objek PersistentVolumeClaim, yang diberi nama web-www-0, web-www-1, dan web-www-2, dengan masing-masing penyimpanan yang disediakan sebesar 1 GB.

Setelah dibuat, StatefulSet akan memastikan bahwa jumlah objek Pod yang diinginkan berjalan dan tersedia setiap saat. StatefulSet otomatis mengganti objek Pod yang gagal atau dikeluarkan dari node-nya, dan mengaitkan objek Pod baru dengan resource penyimpanan, permintaan dan batas resource, serta konfigurasi lain yang ditentukan dalam spesifikasi Pod dari objek StatefulSet.

Meminta penyimpanan persisten di resource StatefulSet

Penyimpanan persisten dapat disediakan secara dinamis sehingga volume yang mendasarinya dibuat sesuai permintaan. Aplikasi dapat meminta penyimpanan persisten dengan objek PersistentVolumeClaim.

Biasanya, Anda harus membuat objek PersistentVolumeClaim selain membuat objek Pod. Namun, objek StatefulSet menyertakan array volumeClaimTemplates yang menghasilkan objek PersistentVolumeClaim. Setiap replika StatefulSet mendapatkan objek PersistentVolumeClaim-nya sendiri.

Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi penyimpanan container.