Kubernetes dari Nol hingga Profesional: 100 Contoh dengan kubectl, Manifes, Helm, dan GitOps

Kubernetes dari Nol hingga Profesional: 100 Contoh dengan kubectl, Manifes, Helm, dan GitOps

Kubernetes menjalankan kontainer di seluruh klaster yang terdiri atas banyak mesin. Ia memulai ulang kontainer yang gagal, menyebarkannya ke seluruh node, merilis versi baru tanpa downtime, dan menskalakannya sesuai beban. Artikel ini membawa Anda dari Pod pertama hingga pengaturan yang siap produksi dalam 100 contoh. Anda akan mempelajari kubectl dan konteks, Pod, Deployment dan pembaruan bergulir, Service dan Ingress, ConfigMap dan Secret, penyimpanan persisten, Job dan CronJob, StatefulSet dan DaemonSet, autoskala, permintaan sumber daya dan probe, penjadwalan, RBAC dan keamanan Pod, Helm dan Kustomize, observabilitas dan debugging, serta GitOps dan cadangan. Catatan jujur: klaster Kubernetes dan kubectl tidak terpasang di komputer yang dipakai menyiapkan artikel ini, jadi 100 contoh tersebut tidak dijalankan di sini. Manifes ditulis mengikuti API Kubernetes saat ini, tetapi terapkan sendiri setiap manifes ke klaster uji sebelum Anda mengandalkannya.

Yang Anda butuhkan

Docker Desktop dengan Kubernetes bawaan, atau kind atau minikube untuk klaster latihan lokal, serta kubectl dan Helm. Pengetahuan dasar tentang kontainer akan membantu; artikel Docker dalam seri ini adalah awal yang baik. Beberapa contoh memakai penyedia cloud seperti Azure Kubernetes Service dan pengontrol ingress. Gunakan host contoh seperti shop.example.com dan kata sandi contoh seperti <strong-password>, dan jangan pernah menempelkan kredensial asli ke dalam manifes atau perintah.

Cara memakai contoh

Contoh bash memakai kubectl, Helm, dan Kustomize. Contoh YAML disimpan dalam berkas .yaml lalu diterapkan dengan kubectl apply -f memakai nama berkas yang disebut dalam teks. Contoh Python memakai klien Python Kubernetes resmi.

Topik 1: Memulai dengan Kubernetes

Kubernetes adalah loop kontrol. Anda mendeskripsikan keadaan yang diinginkan dalam YAML, lalu klaster terus bekerja sampai kenyataan sesuai dengan deskripsi itu. Pelajari bagian-bagian klaster, klien kubectl, konteks, dan namespace.

Control plane dan node

Control plane menyimpan keadaan yang diinginkan dan membuat keputusan, sedangkan node pekerja menjalankan kontainer Anda. Anda berkomunikasi dengan klaster lewat API server, dan kubectl adalah klien standar yang mengirim permintaan Anda.

Konteks dan namespace

Konteks menyimpan klaster, pengguna, dan namespace yang dipakai perintah Anda. Periksa dengan kubectl config current-context sebelum mengubah apa pun, agar Anda tidak pernah menghapus sumber daya di klaster yang salah.

Manifes dan perubahan deklaratif

Manifes memiliki apiVersion, kind, metadata, dan spec. kubectl apply membandingkan berkas Anda dengan klaster dan hanya mengubah bagian yang berbeda, sehingga perubahan dapat diulang dan mudah ditinjau di Git.

Ilustrasi

Cara permintaan mencapai aplikasi di Kubernetes: pengguna mencapai Ingress, Ingress meneruskan ke Service, dan Service mengirim lalu lintas ke Pod yang sehat yang dijaga tetap berjalan oleh Deployment
Cara permintaan mencapai aplikasi di Kubernetes: pengguna mencapai Ingress, Ingress meneruskan ke Service, dan Service mengirim lalu lintas ke Pod yang sehat yang dijaga tetap berjalan oleh Deployment

Contoh 1: Periksa klien dan klaster

Pastikan kubectl dapat berkomunikasi dengan klaster.

kubectl version --client
kubectl cluster-info
kubectl get nodes -o wide

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 2: Buat klaster latihan dengan kind

Klaster lokal di komputer Anda untuk belajar.

kind create cluster --name learn
kubectl config current-context
kubectl get nodes

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 3: Pindah antarkonteks

Pilih klaster yang dituju perintah Anda.

kubectl config get-contexts
kubectl config use-context kind-learn
kubectl config view --minify --output "jsonpath={.current-context}"

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 4: Buat namespace

Pisahkan tim dan aplikasi dalam satu klaster.

kubectl create namespace shop
kubectl config set-context --current --namespace=shop
kubectl get pods

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 5: Baca manifes

Empat kolom tingkat atas yang dimiliki setiap objek.

apiVersion: v1
kind: Namespace
metadata:
  name: shop
  labels:
    team: platform

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 6: Terapkan manifes

Buat perubahan deklaratif dengan kubectl apply.

kubectl apply -f namespace.yaml
kubectl get namespace shop --show-labels
kubectl describe namespace shop

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 2: Pod: unit terkecil

Pod adalah satu atau lebih kontainer yang berbagi alamat jaringan dan penyimpanan. Sebagian besar Pod menjalankan satu kontainer, tetapi Pod juga dapat memuat pembantu yang harus berjalan berdampingan dengan aplikasi utama.

Apa itu Pod

Semua kontainer dalam satu Pod berbagi alamat IP yang sama dan dapat saling mengakses lewat localhost. Pod bersifat sementara: saat satu mati, klaster membuat yang baru dengan nama dan alamat baru, jadi jangan bergantung pada alamat Pod.

Kontainer init dan sidecar

Kontainer init berjalan sampai selesai sebelum kontainer utama dimulai, cocok untuk menunggu basis data. Kontainer sidecar berjalan di samping kontainer utama untuk pencatatan log, proksi, atau sinkronisasi berkas, dan berbagi volumenya.

Log, event, dan exec

kubectl logs menampilkan keluaran, kubectl describe menampilkan event seperti galat pengambilan image dan kegagalan penjadwalan, dan kubectl exec membuka shell. Baca describe lebih dulu, karena penjelasannya mencakup sebagian besar kegagalan saat mulai.

Contoh 7: Jalankan Pod dengan cepat

Perintah imperatif, hanya untuk uji cepat.

kubectl run hello --image=nginx:1.27 --port=80
kubectl get pod hello -o wide

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 8: Pod deklaratif

Unit terkecil yang Anda terapkan.

apiVersion: v1
kind: Pod
metadata:
  name: web
  labels:
    app: web
spec:
  containers:
    - name: web
      image: nginx:1.27
      ports:
        - containerPort: 80

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 9: Baca log dan event

Cari tahu apa yang terjadi pada Pod.

kubectl logs web
kubectl logs web --previous
kubectl get events --sort-by=.lastTimestamp

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 10: Jalankan perintah di dalam Pod

Debug dari dalam.

kubectl exec -it web -- sh
kubectl exec web -- nginx -v

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 11: Port-forward ke Pod

Akses Pod dari komputer Anda untuk pengujian.

kubectl port-forward pod/web 8080:80
curl http://localhost:8080

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 12: Dua kontainer berbagi volume

Pola sidecar.

apiVersion: v1
kind: Pod
metadata:
  name: sidecar-demo
spec:
  volumes:
    - name: logs
      emptyDir: {}
  containers:
    - name: app
      image: busybox:1.36
      command: ["sh", "-c", "while true; do date >> /logs/app.log; sleep 5; done"]
      volumeMounts:
        - name: logs
          mountPath: /logs
    - name: log-reader
      image: busybox:1.36
      command: ["sh", "-c", "tail -F /logs/app.log"]
      volumeMounts:
        - name: logs
          mountPath: /logs

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 13: Kontainer init menunggu

Jalankan langkah persiapan sebelum aplikasi mulai.

apiVersion: v1
kind: Pod
metadata:
  name: init-demo
spec:
  initContainers:
    - name: wait-for-db
      image: busybox:1.36
      command: ["sh", "-c", "until nslookup db; do sleep 2; done"]
  containers:
    - name: app
      image: nginx:1.27

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 14: Hapus Pod uji

Bersihkan objek yang tidak lagi dibutuhkan.

kubectl delete pod hello web sidecar-demo init-demo --ignore-not-found
kubectl get pods

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 3: Deployment dan pembaruan bergulir

Anda jarang membuat Pod secara langsung. Deployment mengelola ReplicaSet, yang menjaga jumlah Pod yang diminta tetap berjalan, dan melakukan pembaruan bergulir sehingga versi baru menggantikan versi lama secara bertahap.

Replika dan selector

Kolom replicas menetapkan berapa Pod yang Anda inginkan. Selector harus cocok dengan label Pod, sehingga Deployment tahu Pod mana yang dimilikinya. Ketidakcocokan ditolak saat pembuatan.

Strategi pembaruan bergulir

maxSurge menetapkan berapa Pod tambahan yang boleh ada selama pembaruan, dan maxUnavailable menetapkan berapa Pod yang boleh hilang. Menetapkan maxUnavailable ke 0 menjaga kapasitas penuh selama rilis.

Riwayat rollout dan rollback

Setiap perubahan membuat ReplicaSet baru dan nomor revisi. kubectl rollout undo kembali ke versi sebelumnya, dan kubectl rollout history mendaftar revisi sehingga Anda dapat memilih satu yang spesifik.

Contoh 15: Deployment menjaga replika tetap berjalan

Pembaruan bergulir yang dikelola untuk Anda.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: nginx:1.27
          ports:
            - containerPort: 80

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 16: Buat dan pantau Deployment

Periksa status rollout.

kubectl apply -f deployment.yaml
kubectl rollout status deployment/web
kubectl get deploy,rs,pods -l app=web

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 17: Skala secara manual

Ubah jumlah replika.

kubectl scale deployment web --replicas=5
kubectl get pods -l app=web -o wide

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 18: Rilis image baru

Perbarui versi aplikasi.

kubectl set image deployment/web web=nginx:1.27.2
kubectl rollout status deployment/web
kubectl rollout history deployment/web

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 19: Kembalikan rilis yang bermasalah

Batalkan rollout yang gagal.

kubectl rollout undo deployment/web
kubectl rollout undo deployment/web --to-revision=1

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 20: Kendalikan pembaruan bergulir

maxSurge dan maxUnavailable.

spec:
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 21: Jeda dan lanjutkan rollout

Gabungkan beberapa perubahan sekaligus.

kubectl rollout pause deployment/web
kubectl set resources deployment/web -c web --limits=memory=256Mi
kubectl rollout resume deployment/web

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 22: Readiness probe

Lalu lintas menunggu sampai aplikasi siap.

containers:
  - name: web
    image: nginx:1.27
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 5

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 4: Service dan jaringan

Pod datang dan pergi, jadi klien memerlukan nama dan alamat yang stabil. Service memilih Pod berdasarkan label dan memberi mereka satu IP virtual serta nama DNS yang tetap sama.

Jenis Service

ClusterIP hanya dapat dijangkau dari dalam klaster. NodePort membuka port di setiap node. LoadBalancer meminta penyeimbang beban eksternal dari penyedia cloud. Pilih jenis terkecil yang memenuhi kebutuhan.

DNS dan endpoint

Setiap Service mendapat nama DNS seperti web-svc.shop.svc.cluster.local, dan dalam namespace yang sama nama pendek juga berfungsi. kubectl get endpoints menampilkan alamat Pod di balik Service, dan ini adalah hal pertama yang diperiksa saat Service tidak merespons.

Service headless

Dengan clusterIP diatur ke None, DNS mengembalikan alamat setiap Pod, bukan satu IP virtual. Basis data dan sistem berklaster memakai ini agar klien dapat berkomunikasi dengan anggota tertentu.

Contoh 23: Service ClusterIP

Alamat tetap di dalam klaster.

apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  type: ClusterIP
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 80

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 24: Ekspos dengan kubectl

Cara cepat membuat Service.

kubectl expose deployment web --port=80 --target-port=80 --name=web-svc
kubectl get svc web-svc
kubectl get endpoints web-svc

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 25: Panggil Service dari Pod sementara

Uji DNS di dalam klaster.

kubectl run tmp-client --rm -it --image=busybox:1.36 --restart=Never -- wget -qO- http://web-svc

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 26: Service NodePort

Buka port di setiap node.

apiVersion: v1
kind: Service
metadata:
  name: web-nodeport
spec:
  type: NodePort
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 27: Service LoadBalancer

Penyeimbang beban cloud untuk akses publik.

apiVersion: v1
kind: Service
metadata:
  name: web-public
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "false"
spec:
  type: LoadBalancer
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 80

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 28: Temukan alamat eksternal

Baca alamat yang diberikan cloud.

kubectl get svc web-public -o jsonpath="{.status.loadBalancer.ingress[0].ip}"
kubectl get svc web-public -w

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 29: Port bernama

Gunakan nama port agar nomornya aman diubah.

apiVersion: v1
kind: Service
metadata:
  name: api
spec:
  selector:
    app: api
  ports:
    - name: http
      port: 8000
      targetPort: http

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 30: Service headless

Dapatkan alamat tiap Pod.

apiVersion: v1
kind: Service
metadata:
  name: db-headless
spec:
  clusterIP: None
  selector:
    app: db
  ports:
    - port: 5432

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 5: Konfigurasi dengan ConfigMap dan Secret

Simpan konfigurasi di luar image. ConfigMap menyimpan pengaturan biasa, dan Secret menyimpan nilai sensitif. Keduanya dapat menjadi variabel lingkungan atau berkas di dalam Pod, sehingga Anda dapat mengubah pengaturan tanpa membangun ulang image.

ConfigMap

ConfigMap menyimpan pasangan kunci-nilai atau seluruh berkas. Gunakan envFrom untuk memuat setiap kunci sebagai variabel lingkungan, atau pasang ConfigMap sebagai direktori saat aplikasi membaca berkas.

Secret

Secret menyimpan nilai yang dikodekan base64. Base64 adalah pengodean, bukan enkripsi, jadi aktifkan enkripsi saat diam di klaster, batasi siapa yang dapat membaca Secret dengan RBAC, dan pasang sebagai berkas bila memungkinkan.

Memuat ulang perubahan

Variabel lingkungan hanya dibaca saat start, sehingga ConfigMap yang berubah memerlukan rollout baru. Berkas yang dipasang diperbarui setelah jeda, tetapi aplikasi harus membacanya ulang. Rencanakan pemuatan ulang setiap kali Anda mengubah konfigurasi.

Contoh 31: ConfigMap dari nilai literal

Simpan pengaturan yang tidak rahasia.

kubectl create configmap app-config --from-literal=LOG_LEVEL=info --from-literal=FEATURE_X=on
kubectl get configmap app-config -o yaml

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 32: Manifes ConfigMap

Pengaturan ditulis dalam YAML.

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  LOG_LEVEL: info
  FEATURE_X: "on"

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 33: ConfigMap sebagai variabel lingkungan

Muat semua kunci dengan envFrom.

containers:
  - name: api
    image: sample-api:1.4.2
    envFrom:
      - configMapRef:
          name: app-config

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 34: Pasang ConfigMap sebagai berkas

Berkas konfigurasi di dalam kontainer.

containers:
  - name: web
    image: nginx:1.27
    volumeMounts:
      - name: site-config
        mountPath: /etc/nginx/conf.d
        readOnly: true
volumes:
  - name: site-config
    configMap:
      name: nginx-conf

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 35: Buat Secret

Simpan kata sandi tanpa menuliskannya ke berkas.

kubectl create secret generic db-secret --from-literal=DB_PASSWORD='<strong-password>'
kubectl get secret db-secret -o jsonpath="{.type}"

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 36: Manifes Secret

stringData memungkinkan teks biasa.

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
stringData:
  DB_PASSWORD: <strong-password>

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 37: Baca nilai Secret

Periksa nilai yang sudah didekode dan jaga kerahasiaannya.

kubectl get secret db-secret -o jsonpath="{.data.DB_PASSWORD}" | base64 --decode; echo
# Do not print secrets in shared logs or screenshots.

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 38: Pasang Secret sebagai berkas

Berkas kredensial hanya-baca.

containers:
  - name: api
    image: sample-api:1.4.2
    volumeMounts:
      - name: db-creds
        mountPath: /var/run/secrets/db
        readOnly: true
volumes:
  - name: db-creds
    secret:
      secretName: db-secret

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 6: Penyimpanan persisten

Kontainer kehilangan berkasnya saat restart. PersistentVolumeClaim meminta penyimpanan yang bertahan lebih lama daripada umur Pod, dan StorageClass memberi tahu klaster cara membuat penyimpanan tersebut.

PV, PVC, dan StorageClass

PersistentVolume adalah penyimpanan yang sebenarnya, PersistentVolumeClaim adalah permintaan untuk itu, dan StorageClass menentukan cara volume dibuat sesuai permintaan. Sebagian besar klaster menyediakan StorageClass bawaan, sehingga claim sering hanya memerlukan ukuran.

Mode akses

ReadWriteOnce memasang volume di satu node dalam satu waktu, cocok untuk sebagian besar basis data. ReadWriteMany memungkinkan banyak node menulis, tetapi hanya sebagian jenis penyimpanan yang mendukungnya. Pilih mode yang didukung penyimpanan Anda.

Kebijakan reclaim

Delete menghapus penyimpanan saat claim dihapus, sedangkan Retain menyimpan data untuk pemulihan manual. Gunakan Retain untuk data yang harus selamat dari penghapusan tidak sengaja, dan cadangkan data penting dalam kedua kasus.

Contoh 39: PersistentVolumeClaim

Minta penyimpanan dari klaster.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  accessModes: ["ReadWriteOnce"]
  resources:
    requests:
      storage: 1Gi

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 40: Pod yang memakai claim

Data tetap ada walau Pod di-restart.

apiVersion: v1
kind: Pod
metadata:
  name: writer
spec:
  containers:
    - name: writer
      image: busybox:1.36
      command: ["sh", "-c", "echo hello >> /data/out.txt; sleep 3600"]
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: data-pvc

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 41: Periksa penyimpanan yang terikat

Baca status claim dan volume.

kubectl get pvc data-pvc
kubectl get pv
kubectl describe pvc data-pvc

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 42: Pilih StorageClass

Pilih jenis disk.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: fast-pvc
spec:
  storageClassName: managed-premium
  accessModes: ["ReadWriteOnce"]
  resources:
    requests:
      storage: 10Gi

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 43: Daftar StorageClass

Temukan kelas bawaan.

kubectl get storageclass
kubectl get storageclass -o custom-columns=NAME:.metadata.name,DEFAULT:.metadata.annotations."storageclass\.kubernetes\.io/is-default-class"

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 44: Perbesar claim

Tambah kapasitas jika kelasnya mendukung.

kubectl patch pvc data-pvc -p '{"spec":{"resources":{"requests":{"storage":"2Gi"}}}}'
kubectl get pvc data-pvc

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 45: Kebijakan reclaim

Simpan data setelah claim dihapus.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: archive-pv
spec:
  capacity:
    storage: 5Gi
  accessModes: ["ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /srv/archive

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 46: Batasi penyimpanan sementara

Hentikan berkas sementara yang terus membesar.

containers:
  - name: worker
    image: busybox:1.36
    resources:
      limits:
        ephemeral-storage: 1Gi

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 7: Ingress dan perutean lalu lintas

Ingress mengekspos rute HTTP dan HTTPS dari luar klaster ke Service. Ia merutekan berdasarkan nama host dan path, serta mengakhiri TLS, sehingga satu alamat publik dapat melayani banyak aplikasi.

Ingress dan pengontrol

Resource Ingress tidak melakukan apa pun sendirian. Pengontrol ingress, seperti ingress-nginx, membaca objek Ingress dan mengonfigurasi proksi. Pasang satu pengontrol per klaster dan atur ingressClassName di setiap Ingress.

Sertifikat TLS

Bagian tls menunjuk ke Secret yang berisi sertifikat dan kunci. cert-manager dapat meminta dan memperbarui sertifikat secara otomatis, sehingga Anda tidak perlu menangani masa berlaku secara manual.

Perutean berdasarkan path dan host

Aturan mencocokkan nama host dan awalan path. Path yang paling spesifik menang, sehingga /api dapat menuju API sementara / menuju situs web. Jaga rute tetap sederhana agar tabel perutean mudah ditinjau.

Contoh 47: Ingress berdasarkan nama host

Perutean HTTP ke Service.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  ingressClassName: nginx
  rules:
    - host: shop.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 80

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 48: Ingress dengan TLS

HTTPS memakai sertifikat yang disimpan di Secret.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-tls
spec:
  ingressClassName: nginx
  tls:
    - hosts: [shop.example.com]
      secretName: shop-tls
  rules:
    - host: shop.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 80

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 49: Pasang ingress controller

Pasang pengontrol dengan Helm.

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress ingress-nginx/ingress-nginx --namespace ingress --create-namespace

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 50: Perutean berdasarkan path

Kirim /api dan / ke Service yang berbeda.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: shop-routes
spec:
  ingressClassName: nginx
  rules:
    - host: shop.example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api
                port:
                  number: 8000
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 80

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 51: Anotasi Ingress untuk unggahan

Naikkan batas ukuran unggahan dan timeout untuk satu situs.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: upload-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "20m"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
spec:
  ingressClassName: nginx
  rules:
    - host: upload.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: uploader
                port:
                  number: 80

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 52: ClusterIssuer cert-manager

Minta sertifikat dari Let's Encrypt secara otomatis.

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: letsencrypt-prod-key
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 53: Minta sertifikat dari Ingress

Gunakan anotasi agar TLS dikelola untuk Anda.

metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts: [shop.example.com]
      secretName: shop-tls

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 54: NetworkPolicy untuk API

Hanya lapisan web yang boleh menjangkau API.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-allow-web
spec:
  podSelector:
    matchLabels:
      app: api
  policyTypes: [Ingress]
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: web
      ports:
        - port: 8000

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 8: Job dan CronJob

Tidak semua beban kerja berjalan selamanya. Job menjalankan tugas sampai berhasil, dan CronJob memulai Job sesuai jadwal, seperti tabel cron yang berjalan di dalam klaster.

Job dan jumlah penyelesaian

Job membuat Pod sampai jumlah completions yang diminta berhasil. backoffLimit membatasi percobaan ulang. Gunakan restartPolicy Never atau OnFailure, karena Always tidak diizinkan untuk Job.

Pekerjaan paralel

parallelism menetapkan berapa Pod yang berjalan bersamaan, dan completions menetapkan berapa eksekusi berhasil yang dibutuhkan. Pola ini memproses sekumpulan item dengan beberapa pekerja.

CronJob dan riwayat

CronJob memakai sintaks cron pada jadwalnya. concurrencyPolicy Forbid mencegah eksekusi yang tumpang-tindih, dan batas riwayat menghapus Job lama sehingga klaster tetap rapi.

Contoh 55: Job berjalan sampai selesai

Tugas sekali jalan seperti migrasi basis data.

apiVersion: batch/v1
kind: Job
metadata:
  name: db-migrate
spec:
  backoffLimit: 2
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: migrate
          image: sample-api:1.4.2
          command: ["python", "manage.py", "migrate"]

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 56: Jalankan Job dan tunggu

Tunggu sampai tugas selesai, lalu baca log.

kubectl apply -f job.yaml
kubectl wait --for=condition=complete job/db-migrate --timeout=120s
kubectl logs job/db-migrate

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 57: Job paralel

Proses banyak item dengan beberapa worker.

apiVersion: batch/v1
kind: Job
metadata:
  name: thumbnails
spec:
  completions: 10
  parallelism: 3
  template:
    spec:
      restartPolicy: OnFailure
      containers:
        - name: worker
          image: thumbnailer:2.0

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 58: CronJob terjadwal

Jalankan laporan setiap malam pukul 02.00.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: nightly-report
spec:
  schedule: "0 2 * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: report
              image: reporter:1.1

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 59: Periksa dan picu CronJob

Lihat eksekusi sebelumnya dan jalankan satu secara manual.

kubectl get cronjob nightly-report
kubectl get jobs --sort-by=.metadata.creationTimestamp
kubectl create job --from=cronjob/nightly-report manual-report-1

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 60: Batas riwayat Job

Cegah Job yang selesai menumpuk.

spec:
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 5
  startingDeadlineSeconds: 300

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 9: StatefulSet dan DaemonSet

Beberapa beban kerja memerlukan identitas yang stabil atau satu Pod per node. StatefulSet memberi Pod nama yang berurutan dan penyimpanan sendiri, sedangkan DaemonSet menjalankan satu salinan Pod di setiap node yang cocok.

Identitas StatefulSet

Pod diberi nama name-0, name-1, dan seterusnya, dan masing-masing menyimpan claim-nya sendiri dari volumeClaimTemplates. Nama tetap bersama Pod saat restart, cocok untuk basis data dan broker pesan.

Operasi berurutan

Secara bawaan StatefulSet memulai dan menghentikan Pod secara berurutan. Pembaruan dengan partition memungkinkan Anda mengubah Pod bernomor tertinggi lebih dulu, yang memberi kanari terkendali untuk sistem stateful.

DaemonSet

DaemonSet menjaga satu Pod di setiap node, cocok untuk pengumpul log, agen pemantauan, dan plugin jaringan. nodeSelector atau tolerations membatasinya ke node tertentu.

Contoh 61: StatefulSet

Nama dan penyimpanan yang stabil untuk basis data.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: redis:7-alpine
          volumeMounts:
            - name: data
              mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 62: Periksa StatefulSet

Nama berurutan dan satu claim per Pod.

kubectl get statefulset redis
kubectl get pods -l app=redis
kubectl get pvc

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 63: DaemonSet

Satu Pod di setiap node, untuk agen.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-agent
spec:
  selector:
    matchLabels:
      app: node-agent
  template:
    metadata:
      labels:
        app: node-agent
    spec:
      containers:
        - name: agent
          image: busybox:1.36
          command: ["sh", "-c", "sleep 3600"]

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 64: DaemonSet pada node berlabel

Gunakan nodeSelector untuk memilih node.

spec:
  template:
    spec:
      nodeSelector:
        workload: edge

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 65: Partition StatefulSet

Perbarui sebagian Pod lebih dulu.

spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 2

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 66: Skala StatefulSet dengan hati-hati

Periksa claim setelah pengecilan.

kubectl get statefulset redis -o jsonpath="{.spec.replicas}"; echo
kubectl scale statefulset redis --replicas=2
kubectl get pvc -l app=redis

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 10: Autoskala

Beban berubah sepanjang hari. Autoskala menambah Pod saat permintaan tinggi dan menguranginya saat turun, sehingga Anda membayar sesuai pemakaian dan pengguna tetap mendapat respons yang cepat.

Horizontal Pod Autoscaler

HPA membandingkan metrik, seperti rata-rata pemakaian CPU, dengan target dan mengubah jumlah replika. Ia memerlukan metrics server dan permintaan CPU pada Pod, karena pemakaian diukur terhadap permintaan.

Perilaku penskalaan

Kolom behavior mengendalikan seberapa cepat HPA menaik dan menurunkan skala. Jendela stabilisasi saat penurunan skala mencegah naik-turun yang cepat setelah lonjakan singkat.

Penskalaan berbasis peristiwa

KEDA menskalakan berdasarkan sinyal eksternal, seperti panjang antrean atau keterlambatan pesan, dan dapat diskalakan ke nol saat tidak ada pekerjaan. Gunakan untuk pekerja yang mengonsumsi antrean.

Contoh 67: Pemakaian sumber daya langsung

kubectl top membutuhkan metrics server.

kubectl top nodes
kubectl top pods -l app=web

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 68: Autoskala berdasarkan CPU

Tambah Pod saat beban rata-rata tinggi.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 69: Buat HPA dari baris perintah

Autoskala dan amati reaksinya.

kubectl autoscale deployment web --min=2 --max=10 --cpu-percent=70
kubectl get hpa web -w

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 70: Autoskala berdasarkan memori

Gunakan lebih dari satu metrik.

spec:
  metrics:
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 75

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 71: Batasi kecepatan penurunan HPA

Hindari naik-turun dengan jendela stabilisasi.

spec:
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
        - type: Pods
          value: 1
          periodSeconds: 60

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 72: Penskalaan berbasis peristiwa

Skalakan worker menurut panjang antrean dengan KEDA.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: worker-scaler
spec:
  scaleTargetRef:
    name: worker
  minReplicaCount: 0
  maxReplicaCount: 20
  triggers:
    - type: rabbitmq
      metadata:
        queueName: orders
        mode: QueueLength
        value: "50"

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 11: Sumber daya, probe, dan penjadwalan

Beri tahu Kubernetes berapa CPU dan memori yang dibutuhkan setiap kontainer, serta cara mengetahui apakah kontainer itu sehat. Penjadwal menggunakan requests untuk menempatkan Pod, dan probe memutuskan kapan harus memulai ulang atau mengirim lalu lintas.

Requests dan limits

Request adalah jumlah yang dicadangkan penjadwal untuk kontainer. Limit adalah jumlah maksimum yang boleh dipakai. Memori melebihi limit membuat kontainer dihentikan, sedangkan CPU melebihi limit dibatasi. Tetapkan keduanya berdasarkan pemakaian yang diukur.

Probe

Liveness probe memulai ulang kontainer yang macet. Readiness probe mengeluarkan kontainer dari endpoint Service selama belum siap. Startup probe menunda probe lain untuk aplikasi yang lambat dimulai.

Penyebaran dan gangguan

Constraint penyebaran topologi menempatkan replika di node atau zona yang berbeda. PodDisruptionBudget membatasi berapa Pod yang dapat dihapus sekaligus oleh tindakan sukarela seperti drain.

Contoh 73: requests dan limits

Cara penjadwal dan kernel menggunakannya.

containers:
  - name: api
    image: sample-api:1.4.2
    resources:
      requests:
        cpu: 250m
        memory: 256Mi
      limits:
        cpu: "1"
        memory: 512Mi

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 74: Liveness probe

Restart kontainer yang macet.

livenessProbe:
  httpGet:
    path: /healthz
    port: 8000
  initialDelaySeconds: 10
  periodSeconds: 15
  failureThreshold: 3

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 75: Startup probe

Beri waktu bagi aplikasi yang lambat untuk mulai.

startupProbe:
  httpGet:
    path: /healthz
    port: 8000
  failureThreshold: 30
  periodSeconds: 10

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 76: PodDisruptionBudget

Pertahankan replika yang cukup saat pemeliharaan.

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: web

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 77: Sebar replika ke beberapa node

Jangan letakkan semua replika di satu mesin.

spec:
  topologySpreadConstraints:
    - maxSkew: 1
      topologyKey: kubernetes.io/hostname
      whenUnsatisfiable: ScheduleAnyway
      labelSelector:
        matchLabels:
          app: web

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 78: PriorityClass

Tetap jadwalkan Pod penting saat klaster penuh.

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: business-critical
value: 100000
globalDefault: false
description: "Keep these Pods running when the cluster is full."

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 12: Keamanan: RBAC dan keamanan Pod

Hak akses minimum berlaku untuk orang dan juga aplikasi. RBAC memutuskan siapa boleh melakukan apa, dan pengaturan keamanan Pod membatasi apa yang dapat dilakukan kontainer di node.

ServiceAccount, Role, dan binding

ServiceAccount adalah identitas Pod. Role mendaftar kata kerja yang diizinkan pada resource dalam satu namespace, dan RoleBinding menghubungkannya. Berikan hanya kata kerja yang dibutuhkan aplikasi, dan hindari cluster-admin untuk aplikasi.

Memeriksa akses

kubectl auth can-i menguji suatu izin, dan dapat dijalankan sebagai pengguna atau ServiceAccount lain. Jalankan pada langkah tinjauan agar kesalahan muncul sebelum penerapan, bukan setelah insiden.

Keamanan Pod

Label namespace menerapkan Pod Security Standards, seperti restricted, yang memblokir kontainer root dan eskalasi hak akses. Kombinasikan dengan securityContext yang membuang capability dan membuat sistem berkas root hanya-baca.

Contoh 79: ServiceAccount

Identitas untuk Pod, dengan token dinonaktifkan.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: api-sa
automountServiceAccountToken: false

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 80: Role dengan hak minimum

Hanya membaca ConfigMap di satu namespace.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: read-config
  namespace: shop
rules:
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get", "list"]

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 81: RoleBinding

Kaitkan role dengan ServiceAccount.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: api-read-config
  namespace: shop
subjects:
  - kind: ServiceAccount
    name: api-sa
    namespace: shop
roleRef:
  kind: Role
  name: read-config
  apiGroup: rbac.authorization.k8s.io

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 82: Periksa izin dengan auth can-i

Verifikasi RBAC sebelum menerapkan.

kubectl auth can-i list configmaps --as=system:serviceaccount:shop:api-sa -n shop
kubectl auth can-i delete pods --as=system:serviceaccount:shop:api-sa -n shop

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 83: Standar keamanan Pod

Terapkan profil restricted pada namespace.

kubectl label namespace shop pod-security.kubernetes.io/enforce=restricted
kubectl label namespace shop pod-security.kubernetes.io/warn=restricted

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 84: Konteks keamanan yang diperkeras

Non-root, hanya-baca, tanpa capability tambahan.

securityContext:
  runAsNonRoot: true
  runAsUser: 10001
  allowPrivilegeEscalation: false
  readOnlyRootFilesystem: true
  capabilities:
    drop: ["ALL"]
  seccompProfile:
    type: RuntimeDefault

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 13: Helm dan Kustomize

Aplikasi nyata memiliki banyak manifes dan beberapa lingkungan. Helm mengemasnya sebagai chart dengan values, sedangkan Kustomize menyimpan satu base dan menerapkan overlay kecil untuk setiap lingkungan.

Chart dan release Helm

Chart adalah paket templat dengan nilai bawaan. Release adalah satu salinan yang terpasang. Pasang, perbarui, dan kembalikan dengan helm, dan gunakan --atomic agar pembaruan yang gagal kembali otomatis.

Values per lingkungan

Simpan satu berkas values per lingkungan dan berikan dengan -f. Periksa hasil render dengan helm template sebelum memasang, sehingga Anda tahu persis apa yang akan sampai ke klaster.

Overlay Kustomize

Kustomize menggabungkan base dengan overlay yang mengubah replika, image, atau label tanpa templat. kubectl apply -k menerapkan hasilnya, dan kubectl diff menampilkan perubahan lebih dulu.

Contoh 85: Pasang aplikasi dengan Helm

Gunakan chart dari repositori.

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install shop-cache bitnami/redis --namespace shop --set architecture=standalone

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 86: Render dan periksa chart

Pratinjau YAML dan validasi di server.

helm template shop-web ./chart --values values-prod.yaml > rendered.yaml
kubectl apply --dry-run=server -f rendered.yaml

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 87: Berkas values Helm

Pengaturan untuk satu lingkungan.

replicaCount: 3
image:
  repository: registry.example.com/team/web
  tag: "1.4.2"
resources:
  limits:
    memory: 512Mi
ingress:
  enabled: true
  host: shop.example.com

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 88: Upgrade dan rollback dengan Helm

Upgrade atomik yang membatalkan diri saat gagal.

helm upgrade shop-web ./chart -n shop -f values-prod.yaml --atomic --wait
helm history shop-web -n shop
helm rollback shop-web 1 -n shop

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 89: Overlay Kustomize

Perubahan lingkungan tanpa templat.

# overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../base
replicas:
  - name: web
    count: 5
images:
  - name: web
    newTag: "1.4.2"

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 90: Terapkan overlay Kustomize

Lihat diff dulu, lalu terapkan.

kubectl kustomize overlays/prod | kubectl diff -f -
kubectl apply -k overlays/prod

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 14: Observabilitas dan debugging

Saat Pod berperilaku tidak semestinya, jawabannya ada di status, event, log, dan metriknya. Rutinitas yang tenang dan berurutan menemukan sebagian besar gangguan dengan cepat, dan sinyal yang sama juga menjadi bahan dasbor dan peringatan.

Status, event, dan describe

kubectl get pod menampilkan fase dan jumlah restart. kubectl describe mendaftar event seperti ImagePullBackOff, CrashLoopBackOff, atau FailedScheduling, dan menjelaskan mengapa Pod macet.

Log lintas Pod

Pilih Pod berdasarkan label dengan kubectl logs -l dan gunakan --prefix untuk melihat Pod mana yang menulis setiap baris. Gunakan --previous untuk membaca log kontainer yang crash lalu di-restart.

Kontainer debug sementara

kubectl debug melampirkan kontainer sementara ke Pod yang sedang berjalan, sehingga Anda dapat memakai alat yang tidak ada di image aplikasi, tanpa memulai ulang aplikasi.

Contoh 91: Log dari beberapa Pod

Pilih Pod dengan label.

kubectl logs -l app=web --all-containers --prefix --tail=20
kubectl logs -l app=web -f --max-log-requests=10

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 92: Mengapa Pod tidak mulai

Baca keluaran describe dan status kontainer.

kubectl describe pod web-6d4cf56db6-abcde
kubectl get pod web-6d4cf56db6-abcde -o jsonpath="{.status.containerStatuses[0].state}"

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 93: Kontainer debug sementara

Debug Pod yang berjalan tanpa restart.

kubectl debug -it web-6d4cf56db6-abcde --image=busybox:1.36 --target=web -- sh

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 94: Event dan tekanan node

Temukan masalah kapasitas dan eviksi.

kubectl get events -A --sort-by=.lastTimestamp | tail -20
kubectl describe node worker-1 | grep -A5 "Conditions"

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Topik 15: Operasi produksi dan GitOps

Produksi berarti rilis yang dapat diulang, pemeliharaan yang aman, dan pemulihan. GitOps menjaga klaster tetap sesuai dengan repositori Git, dan cadangan melindungi objek serta data yang tidak dapat dibangun ulang.

GitOps

Alat GitOps seperti Argo CD memantau repositori dan menerapkan manifesnya ke klaster. Setiap perubahan melewati pull request, dan selfHeal membatalkan perubahan manual yang menyimpang dari Git.

Pemeliharaan tanpa downtime

kubectl drain memindahkan Pod dari node sebelum Anda meningkatkannya, dan PodDisruptionBudget menjaga cukup replika tetap berjalan. Jalankan kubectl uncordon saat node siap lagi.

Cadangan dan pemulihan

Velero mencadangkan objek klaster dan volume persisten ke penyimpanan objek. Uji pemulihan di klaster terpisah, karena cadangan yang belum pernah dipulihkan belum terbukti.

Contoh 95: GitOps dengan Argo CD

Jaga klaster tetap sinkron dengan repositori Git.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: shop
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/shop-deploy
    targetRevision: main
    path: overlays/prod
  destination:
    server: https://kubernetes.default.svc
    namespace: shop
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 96: Deployment untuk produksi

Probe, batas, dan rollout aman digabung.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
  labels:
    app: api
spec:
  replicas: 3
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: api
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
        - name: api
          image: registry.example.com/team/api:1.4.2
          ports:
            - containerPort: 8000
          resources:
            requests: {cpu: 250m, memory: 256Mi}
            limits: {memory: 512Mi}
          readinessProbe:
            httpGet: {path: /ready, port: 8000}
          livenessProbe:
            httpGet: {path: /healthz, port: 8000}

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 97: Cadangkan dengan Velero

Simpan objek dan volume klaster ke penyimpanan.

velero install --provider azure --plugins velero/velero-plugin-for-microsoft-azure:v1.10.0 --bucket k8s-backups
velero backup create shop-daily --include-namespaces shop
velero backup describe shop-daily

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 98: Drain dan uncordon node

Pemeliharaan tanpa mematikan Pod.

kubectl cordon worker-1
kubectl drain worker-1 --ignore-daemonsets --delete-emptydir-data
kubectl uncordon worker-1

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 99: Periksa replika dari Python

Gunakan klien Kubernetes resmi.

from kubernetes import client, config

config.load_kube_config()
apps = client.AppsV1Api()
for d in apps.list_namespaced_deployment("shop").items:
    ready = d.status.ready_replicas or 0
    print(d.metadata.name, f"{ready}/{d.spec.replicas}")

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Contoh 100: Skrip daftar periksa rilis

Hentikan rilis jika ada pemeriksaan yang gagal.

#!/usr/bin/env bash
set -euo pipefail
NS="$1"
kubectl -n "$NS" rollout status deployment --timeout=180s
kubectl -n "$NS" get pdb
kubectl -n "$NS" auth can-i --list --as=system:serviceaccount:"$NS":default | grep -q "\*" && { echo "default account has wildcard rights"; exit 1; }
kubectl -n "$NS" get pods -o jsonpath="{range .items[*]}{.metadata.name}{' runAsRoot='}{.spec.securityContext.runAsNonRoot}{'\n'}{end}"
echo "release checks passed for namespace $NS"

*Contoh ini tidak dijalankan di sini karena klaster Kubernetes atau kubectl tidak terpasang di komputer yang menyiapkan artikel ini.*

Lab: Terapkan, Ekspos, dan Rilis Aplikasi Web Kecil

Satukan artikel ini dalam satu klaster latihan: Deployment dengan probe dan limit, Service, Ingress, ConfigMap dan Secret, pembaruan bergulir dengan rollback, dan pemeriksaan rilis.

1. Buat klaster latihan dengan kind, lalu buat namespace shop dan jadikan sebagai default.

2. Terapkan Deployment dengan tiga replika, requests dan limits sumber daya, readiness probe, dan liveness probe.

3. Tambahkan Service ClusterIP dan periksa endpoint-nya, lalu panggil dari Pod sementara.

4. Buat ConfigMap untuk pengaturan dan Secret untuk kata sandi contoh, lalu pasang keduanya ke Pod.

5. Rilis versi image baru, pantau rollout, lalu batalkan dengan kubectl rollout undo.

6. Tambahkan Ingress untuk shop.example.com, lalu batasi API dengan NetworkPolicy.

7. Jalankan daftar periksa rilis dari contoh 100 terhadap namespace, dan hentikan jika ada pemeriksaan yang gagal.

Langkah berikutnya

Setelah lab, berlatih di klaster terkelola dalam langganan sandbox, pelajari chart Helm untuk aplikasi Anda sendiri, dan siapkan GitOps agar setiap perubahan ditinjau di Git. Simpan contoh di repositori dan jalankan ulang saat Anda meningkatkan klaster, karena API Kubernetes berubah antarversi.

Ringkasan

Kubernetes menjaga kontainer Anda tetap berjalan, menyebarkannya ke seluruh node, memperbaruinya tanpa downtime, dan menskalakannya sesuai permintaan. Anda telah mempelajari kubectl dan konteks, Pod, Deployment dan rollback, Service dan Ingress, konfigurasi dan secret, penyimpanan, Job dan CronJob, StatefulSet dan DaemonSet, autoskala, permintaan sumber daya dan probe, RBAC dan keamanan Pod, Helm dan Kustomize, debugging, serta GitOps dengan cadangan untuk produksi.