Kubernetes Cheat Sheet: Panduan Lengkap untuk Pemula hingga Mahir
Kubernetes, atau K8s, telah menjadi platform orkestrasi kontainer *de facto* yang digunakan oleh bisnis dari semua ukuran. Kompleksitasnya dapat menakutkan, tetapi dengan panduan yang tepat, Anda dapat menguasai seni mengelola aplikasi berbasis kontainer secara efisien. *Cheat sheet* ini bertujuan untuk menyediakan referensi cepat dan komprehensif untuk perintah Kubernetes yang paling umum digunakan, konsep inti, dan praktik terbaik. Baik Anda seorang pemula atau pengguna tingkat lanjut, panduan ini akan membantu Anda menavigasi lanskap Kubernetes dengan mudah.
Daftar Isi
- Pengantar Kubernetes
- Arsitektur Kubernetes
- Instalasi dan Konfigurasi Kubectl
- Perintah Kubectl Esensial
- Pod: Unit Terkecil dalam Kubernetes
- ReplicaSet: Memastikan Ketersediaan
- Deployment: Manajemen Aplikasi yang Mudah
- Service: Mengekspos Aplikasi Anda
- Namespace: Mengatur Sumber Daya Anda
- ConfigMap dan Secret: Mengelola Konfigurasi dan Data Sensitif
- Ingress: Merutekan Lalu Lintas dari Luar Klaster
- Helm: Manajer Paket untuk Kubernetes
- Pemantauan dan Logging
- Debugging Aplikasi Kubernetes
- Praktik Terbaik Kubernetes
- Sumber Daya Tambahan
1. Pengantar Kubernetes
Kubernetes adalah sistem orkestrasi kontainer sumber terbuka yang mengotomatiskan penyebaran, penskalaan, dan pengelolaan aplikasi yang dikontainerisasi. Ini memungkinkan Anda untuk mengelola infrastruktur yang kompleks secara efisien, memastikan aplikasi Anda selalu berjalan dan tersedia.
- Orkestrasi Kontainer: Kubernetes mengelola siklus hidup kontainer, termasuk penyebaran, penskalaan, dan pembaruan.
- Portabilitas: Kubernetes berjalan di berbagai lingkungan, termasuk cloud publik, cloud pribadi, dan lingkungan on-premise.
- Skalabilitas: Kubernetes secara otomatis menskalakan aplikasi Anda berdasarkan permintaan, memastikan kinerja optimal.
- Ketahanan: Kubernetes secara otomatis memulai ulang kontainer yang gagal dan memulihkan aplikasi dari kegagalan.
2. Arsitektur Kubernetes
Memahami arsitektur Kubernetes sangat penting untuk mengelola klaster Anda secara efektif. Arsitektur ini terdiri dari komponen utama berikut:
- Master Node: Mengontrol klaster Kubernetes. Terdiri dari komponen berikut:
- kube-apiserver: Mengekspos API Kubernetes, memungkinkan interaksi dengan klaster.
- etcd: Menyimpan data konfigurasi klaster.
- kube-scheduler: Menjadwalkan pod ke worker node yang tersedia.
- kube-controller-manager: Mengelola berbagai pengontrol, seperti ReplicationController dan DeploymentController.
- cloud-controller-manager: Mengelola integrasi dengan penyedia cloud.
- Worker Nodes: Menjalankan aplikasi yang dikontainerisasi. Terdiri dari komponen berikut:
- kubelet: Berkomunikasi dengan master node dan mengelola kontainer di node.
- kube-proxy: Mengelola jaringan dan load balancing untuk layanan.
- Container Runtime (Docker, containerd, CRI-O): Menjalankan kontainer.
3. Instalasi dan Konfigurasi Kubectl
kubectl
adalah alat baris perintah yang digunakan untuk berinteraksi dengan klaster Kubernetes. Berikut cara menginstal dan mengkonfigurasinya:
- Instal kubectl:
- Linux:
curl -LO "https://dl.k8s.io/release/$(kubectl version --client --output=json | jq -r '.clientVersion.gitVersion')/bin/linux/amd64/kubectl" chmod +x kubectl sudo mv kubectl /usr/local/bin/ kubectl version --client
- macOS:
brew install kubectl kubectl version --client
- Windows:
choco install kubernetes-cli kubectl version --client
- Linux:
- Konfigurasi kubectl:
kubectl
menggunakan filekubeconfig
untuk mengakses informasi klaster. Biasanya terletak di~/.kube/config
.Anda dapat menggunakan
minikube
,kind
, atau layanan cloud (seperti GKE, AKS, atau EKS) untuk membuat klaster Kubernetes dan mengkonfigurasikubectl
.Contoh konfigurasi menggunakan Minikube:
minikube start kubectl config use-context minikube
4. Perintah Kubectl Esensial
Berikut adalah daftar perintah kubectl
yang paling sering digunakan:
- kubectl get: Menampilkan sumber daya Kubernetes.
kubectl get pods
: Menampilkan semua pod.kubectl get deployments
: Menampilkan semua deployment.kubectl get services
: Menampilkan semua service.kubectl get nodes
: Menampilkan semua node.
- kubectl describe: Menampilkan informasi rinci tentang sumber daya.
kubectl describe pod my-pod
: Menampilkan informasi tentang pod bernama “my-pod”.kubectl describe service my-service
: Menampilkan informasi tentang service bernama “my-service”.
- kubectl create: Membuat sumber daya dari file YAML atau JSON.
kubectl create -f my-deployment.yaml
: Membuat deployment dari file “my-deployment.yaml”.
- kubectl apply: Menerapkan perubahan pada sumber daya dari file YAML atau JSON. Membuat atau memperbarui sumber daya.
kubectl apply -f my-deployment.yaml
: Menerapkan perubahan pada deployment dari file “my-deployment.yaml”.
- kubectl delete: Menghapus sumber daya.
kubectl delete pod my-pod
: Menghapus pod bernama “my-pod”.kubectl delete -f my-deployment.yaml
: Menghapus sumber daya yang didefinisikan dalam “my-deployment.yaml”.
- kubectl exec: Menjalankan perintah di dalam kontainer.
kubectl exec -it my-pod -- bash
: Membuka shell bash di dalam kontainer pod “my-pod”.
- kubectl logs: Menampilkan log dari kontainer.
kubectl logs my-pod
: Menampilkan log dari pod “my-pod”.kubectl logs -f my-pod
: Menampilkan log dari pod “my-pod” secara live.
- kubectl edit: Mengedit sumber daya langsung.
kubectl edit deployment my-deployment
: Mengedit deployment “my-deployment”.
- kubectl scale: Menskalakan jumlah replika untuk Deployment, ReplicaSet, atau ReplicationController.
kubectl scale deployment my-deployment --replicas=3
: Menskalakan deployment “my-deployment” menjadi 3 replika.
- kubectl expose: Mengekspos Deployment, ReplicaSet, atau Pod sebagai Service.
kubectl expose deployment my-deployment --type=LoadBalancer --port=80 --target-port=8080
: Mengekspos deployment “my-deployment” sebagai Service dengan tipe LoadBalancer, port 80, dan target port 8080.
- kubectl rollout: Mengelola rollout deployment.
kubectl rollout status deployment my-deployment
: Menampilkan status rollout deployment “my-deployment”.kubectl rollout history deployment my-deployment
: Menampilkan riwayat rollout deployment “my-deployment”.kubectl rollout undo deployment my-deployment
: Membatalkan rollout deployment “my-deployment”.
- kubectl cordon: Menandai node sebagai tidak dapat dijadwalkan (unschedulable).
kubectl cordon my-node
: Menandai node “my-node” sebagai tidak dapat dijadwalkan.
- kubectl uncordon: Menandai node sebagai dapat dijadwalkan.
kubectl uncordon my-node
: Menandai node “my-node” sebagai dapat dijadwalkan.
- kubectl drain: Mengeluarkan semua pod dari sebuah node.
kubectl drain my-node --ignore-daemonsets
: Mengeluarkan semua pod dari node “my-node” kecuali DaemonSet.
- kubectl label: Menambahkan atau memperbarui label pada sumber daya.
kubectl label pod my-pod environment=production
: Menambahkan label `environment=production` pada pod “my-pod”.
- kubectl annotate: Menambahkan atau memperbarui anotasi pada sumber daya.
kubectl annotate pod my-pod description="This is a production pod"
: Menambahkan anotasi `description` pada pod “my-pod”.
5. Pod: Unit Terkecil dalam Kubernetes
Pod adalah unit penyebaran terkecil dalam Kubernetes. Pod dapat berisi satu atau lebih kontainer yang berbagi sumber daya jaringan dan penyimpanan.
- Definisi Pod: Pod didefinisikan dalam file YAML atau JSON.
- Contoh Definisi Pod:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx:latest ports: - containerPort: 80
- Lifecycle Pod:
- Pending: Pod sedang dibuat.
- Running: Semua kontainer dalam Pod telah dibuat dan berjalan.
- Succeeded: Semua kontainer dalam Pod telah selesai dieksekusi dan keluar dengan sukses.
- Failed: Satu atau lebih kontainer dalam Pod gagal dieksekusi.
- Unknown: Status Pod tidak dapat ditentukan.
6. ReplicaSet: Memastikan Ketersediaan
ReplicaSet memastikan bahwa jumlah replika pod yang ditentukan selalu berjalan. Jika sebuah pod gagal, ReplicaSet akan secara otomatis membuat pod baru untuk menggantikannya.
- Definisi ReplicaSet: ReplicaSet didefinisikan dalam file YAML atau JSON.
- Contoh Definisi ReplicaSet:
apiVersion: apps/v1 kind: ReplicaSet metadata: name: my-replicaset spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-container image: nginx:latest ports: - containerPort: 80
- Selector: Digunakan untuk mengidentifikasi pod yang dikelola oleh ReplicaSet.
- Template: Mendefinisikan spesifikasi pod yang akan dibuat oleh ReplicaSet.
7. Deployment: Manajemen Aplikasi yang Mudah
Deployment menyediakan cara deklaratif untuk mengelola aplikasi. Deployment memungkinkan Anda untuk memperbarui aplikasi tanpa downtime, melakukan rollback ke versi sebelumnya, dan menskalakan aplikasi dengan mudah.
- Definisi Deployment: Deployment didefinisikan dalam file YAML atau JSON.
- Contoh Definisi Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-container image: nginx:latest ports: - containerPort: 80
- Strategi Deployment:
- Rolling Update: Memperbarui aplikasi secara bertahap tanpa downtime.
- Recreate: Menghapus semua pod lama sebelum membuat pod baru.
- Rollback: Mengembalikan deployment ke versi sebelumnya.
8. Service: Mengekspos Aplikasi Anda
Service menyediakan cara untuk mengekspos aplikasi yang berjalan di dalam klaster Kubernetes. Service memungkinkan aplikasi lain untuk mengakses aplikasi Anda tanpa perlu mengetahui alamat IP pod individual.
- Definisi Service: Service didefinisikan dalam file YAML atau JSON.
- Contoh Definisi Service:
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer
- Tipe Service:
- ClusterIP: Mengekspos service di dalam klaster.
- NodePort: Mengekspos service di setiap node klaster.
- LoadBalancer: Mengekspos service menggunakan load balancer dari penyedia cloud.
- ExternalName: Memetakan service ke nama domain eksternal.
- Selector: Digunakan untuk mengidentifikasi pod yang merupakan bagian dari service.
9. Namespace: Mengatur Sumber Daya Anda
Namespace menyediakan cara untuk mengisolasi dan mengatur sumber daya di dalam klaster Kubernetes. Namespace memungkinkan Anda untuk membuat lingkungan yang berbeda untuk pengembangan, pengujian, dan produksi.
- Membuat Namespace:
kubectl create namespace my-namespace
- Menggunakan Namespace:
kubectl config set-context --current --namespace=my-namespace
- Menampilkan Sumber Daya di Namespace:
kubectl get pods -n my-namespace
10. ConfigMap dan Secret: Mengelola Konfigurasi dan Data Sensitif
ConfigMap digunakan untuk menyimpan data konfigurasi non-sensitif, sementara Secret digunakan untuk menyimpan data sensitif seperti kata sandi dan kunci API.
- ConfigMap:
- Membuat ConfigMap:
kubectl create configmap my-configmap --from-literal=key1=value1 --from-literal=key2=value2
- Menggunakan ConfigMap di Pod:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx:latest env: - name: MY_VARIABLE valueFrom: configMapKeyRef: name: my-configmap key: key1
- Membuat ConfigMap:
- Secret:
- Membuat Secret:
kubectl create secret generic my-secret --from-literal=username=myuser --from-literal=password=mypassword
- Menggunakan Secret di Pod:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx:latest env: - name: USERNAME valueFrom: secretKeyRef: name: my-secret key: username - name: PASSWORD valueFrom: secretKeyRef: name: my-secret key: password
- Membuat Secret:
11. Ingress: Merutekan Lalu Lintas dari Luar Klaster
Ingress menyediakan cara untuk merutekan lalu lintas HTTP dan HTTPS dari luar klaster ke service di dalam klaster. Ingress memungkinkan Anda untuk menggunakan satu alamat IP untuk mengekspos beberapa service.
- Definisi Ingress: Ingress didefinisikan dalam file YAML atau JSON.
- Contoh Definisi Ingress:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80
- Ingress Controller: Harus diinstal di klaster untuk memproses definisi Ingress. Contoh: Nginx Ingress Controller, Traefik.
12. Helm: Manajer Paket untuk Kubernetes
Helm adalah manajer paket untuk Kubernetes. Helm memungkinkan Anda untuk menyebarkan aplikasi yang kompleks dengan mudah menggunakan *chart*. Chart adalah kumpulan file yang mendeskripsikan sumber daya Kubernetes.
- Instal Helm:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh
- Menambahkan Repositori Helm:
helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update
- Menginstal Chart Helm:
helm install my-release bitnami/nginx
- Melihat Chart Helm:
helm list
- Menghapus Chart Helm:
helm uninstall my-release
13. Pemantauan dan Logging
Pemantauan dan logging sangat penting untuk menjaga kesehatan dan kinerja aplikasi Kubernetes Anda.
- Metrik:
- Heapster: Mengumpulkan metrik klaster. Digantikan oleh Metrics Server.
- Metrics Server: Mengumpulkan metrik penggunaan sumber daya dari node dan pod.
- Prometheus: Sistem pemantauan dan peringatan sumber terbuka.
- Logging:
- ELK Stack (Elasticsearch, Logstash, Kibana): Solusi logging terpusat.
- Fluentd: Kolektor log sumber terbuka.
- Grafana Loki: Sistem logging terinspirasi Prometheus.
- Alerting:
- Alertmanager: Menangani peringatan yang dikirim oleh Prometheus.
14. Debugging Aplikasi Kubernetes
Debugging aplikasi Kubernetes bisa menjadi tantangan, tetapi ada beberapa alat dan teknik yang dapat membantu.
- Memeriksa Log Pod:
kubectl logs my-pod
- Menjalankan Perintah di Dalam Kontainer:
kubectl exec -it my-pod -- bash
- Memeriksa Deskripsi Pod:
kubectl describe pod my-pod
- Memeriksa Event:
kubectl get events
- Menggunakan Debugger Jarak Jauh: Menggunakan debugger seperti Delve untuk aplikasi Go.
15. Praktik Terbaik Kubernetes
Mengikuti praktik terbaik Kubernetes dapat membantu Anda membangun aplikasi yang lebih andal, aman, dan terukur.
- Gunakan Namespace untuk Isolasi: Menggunakan namespace untuk mengisolasi lingkungan pengembangan, pengujian, dan produksi.
- Gunakan Resource Quotas untuk Membatasi Penggunaan Sumber Daya: Menggunakan kuota sumber daya untuk membatasi jumlah sumber daya yang dapat digunakan oleh sebuah namespace.
- Gunakan Liveness dan Readiness Probes: Menggunakan liveness probe untuk mendeteksi ketika aplikasi macet dan readiness probe untuk mendeteksi ketika aplikasi siap untuk menerima lalu lintas.
- Gunakan Pod Disruption Budgets (PDB): Menggunakan PDB untuk memastikan bahwa sejumlah minimum replika aplikasi selalu tersedia selama pemeliharaan klaster.
- Gunakan RBAC untuk Kontrol Akses: Menggunakan Role-Based Access Control (RBAC) untuk mengontrol akses ke sumber daya Kubernetes.
- Gunakan Secrets untuk Data Sensitif: Jangan menyimpan data sensitif dalam kode atau konfigurasi. Gunakan Secrets sebagai gantinya.
- Gunakan Immutable Infrastructure: Jangan memperbarui kontainer secara langsung. Bangun image kontainer baru setiap kali Anda membuat perubahan.
- Automatiskan Penyebaran: Gunakan CI/CD untuk mengotomatiskan penyebaran aplikasi Anda.
- Pantau Aplikasi Anda: Gunakan pemantauan dan logging untuk melacak kesehatan dan kinerja aplikasi Anda.
- Pertimbangkan Keamanan: Terapkan kebijakan keamanan dan pemindaian kerentanan secara teratur.
16. Sumber Daya Tambahan
- Dokumentasi Resmi Kubernetes: kubernetes.io/docs
- Kubernetes Tutorials: kubernetes.io/docs/tutorials
- Minikube: minikube.sigs.k8s.io/docs
- Kind (Kubernetes in Docker): kind.sigs.k8s.io
- Helm Documentation: helm.sh/docs
Dengan cheat sheet ini, Anda siap untuk memulai perjalanan Kubernetes Anda. Ingatlah untuk terus belajar dan bereksperimen untuk menguasai kekuatan penuh platform orkestrasi kontainer ini.
“`