YAML untuk Kubernetes: Pola Manifest Penting
Kubernetes dikonfigurasi sepenuhnya melalui manifest YAML. Setiap pod, deployment, service, dan ingress didefinisikan dalam YAML. Menguasai pola-pola ini sangat penting bagi siapa pun yang bekerja dengan orkestrasi kontainer. Panduan ini membahas tipe resource yang paling penting dengan contoh siap produksi.
Empat Field yang Diperlukan
Setiap manifest Kubernetes membutuhkan:
apiVersion: apps/v1 # API version for this resource type
kind: Deployment # Resource type
metadata: # Resource identification
name: my-app
namespace: production
labels:
app: my-app
spec: # Desired state specification
# ... resource-specific configuration
Deployment
Resource yang paling umum — mengelola sekumpulan pod yang identik:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
labels:
app: api-server
environment: production
spec:
replicas: 3
selector:
matchLabels:
app: api-server
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: api-server
spec:
containers:
- name: api
image: myapp/api:v1.2.3
ports:
- containerPort: 8080
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-credentials
key: url
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
Pola Utama
Selalu tetapkan resource request dan limit: Tanpanya, satu pod dapat menghabiskan semua resource node.
Selalu konfigurasi health probe:
livenessProbe: Restart pod jika menjadi tidak responsifreadinessProbe: Berhenti mengirim traffic sampai pod siap
Gunakan tag image spesifik: Jangan pernah gunakan latest di produksi — ini membuat rollback tidak mungkin dilakukan.
Service
Mengekspos pod ke traffic jaringan:
apiVersion: v1
kind: Service
metadata:
name: api-server
spec:
type: ClusterIP
selector:
app: api-server
ports:
- port: 80
targetPort: 8080
protocol: TCP
Tipe Service:
- ClusterIP (default): Akses internal cluster saja
- NodePort: Mengekspos pada setiap IP node di port statis
- LoadBalancer: Menyediakan load balancer cloud
- ExternalName: Memetakan ke nama DNS
ConfigMap dan Secret
ConfigMap (data non-sensitif)
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: "info"
MAX_CONNECTIONS: "100"
config.yaml: |
server:
port: 8080
timeout: 30s
Secret (data sensitif)
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
stringData:
url: "postgres://user:password@db:5432/myapp"
api-key: "sk-1234567890"
Penggunaan di Pod
# As environment variables
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
# As a mounted file
volumes:
- name: config
configMap:
name: app-config
Ingress
Mengarahkan traffic HTTP eksternal ke service:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- api.example.com
secretName: tls-secret
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-server
port:
number: 80
Horizontal Pod Autoscaler
Menskalakan pod berdasarkan CPU atau metrik kustom:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Kesalahan Umum
1. Kesalahan Indentasi
Indentasi YAML sangat kritis di Kubernetes. Satu spasi yang salah mengubah seluruh struktur. Validasi manifest Anda dengan YAML Validator kami.
2. Ketidakcocokan Label
Selector Service harus sama persis dengan label Pod. Ketidakcocokan berarti Service tidak dapat menemukan pod untuk mengarahkan traffic.
3. Resource Limit yang Hilang
Pod tanpa resource limit dapat menghabiskan resource workload lain. Selalu sertakan request (minimum yang dijamin) dan limit (maksimum yang diizinkan).
4. Tag Image yang Dapat Berubah
Menggunakan latest atau tag yang dapat berubah lainnya membuat rollback tidak mungkin dan deployment menjadi tidak terprediksi. Tetapkan versi spesifik atau gunakan digest yang tidak dapat diubah.
Manifest Multi-Dokumen
Gabungkan resource terkait dalam satu file menggunakan --- sebagai pemisah dokumen:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
# ... deployment spec
---
apiVersion: v1
kind: Service
metadata:
name: api-server
spec:
# ... service spec
Untuk informasi lebih lanjut tentang pola sintaks YAML, lihat tutorial sintaks YAML kami.
FAQ
Haruskah saya menulis YAML Kubernetes secara manual atau menggunakan generator?
Mulailah dengan menulis YAML secara manual untuk memahami strukturnya. Untuk produksi, gunakan alat seperti Helm (manifest bertemplat), Kustomize (kustomisasi berbasis overlay), atau CDK8s (generasi berbasis kode). Alat-alat ini mengurangi pengulangan dan memungkinkan konfigurasi khusus lingkungan tanpa menduplikasi manifest.
Bagaimana cara debugging kesalahan YAML Kubernetes?
Gunakan kubectl apply --dry-run=client -f manifest.yaml untuk memvalidasi tanpa menerapkan. Untuk kesalahan sintaks, kubectl explain deployment.spec.template.spec.containers menunjukkan struktur yang diharapkan. Alat kubeval dan kubeconform memvalidasi terhadap skema API Kubernetes sebelum deployment.
Sumber Terkait
- YAML Validator — Validasi manifest Kubernetes
- YAML untuk Docker Compose — Pola YAML Docker
- Praktik Terbaik Linting YAML — Tangkap kesalahan sebelum deploy