alltools.one
DevOps
2025-06-03
9 min
alltools.one Team
YAMLKubernetesK8sDevOpsContainers

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 responsif
  • readinessProbe: 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

Published on 2025-06-03
YAML for Kubernetes: Essential Manifest Patterns | alltools.one