Portal/Notes πŸ“
Cka

ConfigMap

Versi Bahasa Indonesia. Baca dalam Bahasa Inggris

ConfigMap adalah objek API yang digunakan untuk menyimpan data non-rahasia dalam pasangan key-value. Pod dapat menggunakan ConfigMap sebagai environment variable, argumen baris perintah, atau sebagai file konfigurasi dalam volume.

ConfigMap memungkinkan Anda memisahkan konfigurasi khusus lingkungan dari image container, sehingga aplikasi Anda mudah dipindahkan (portable).

Aplikasi: Mengambil Konfigurasi dari ENV

Kita sudah memiliki aplikasi yang akan mengembalikan respons JSON {"message":"Success"}. Mari kita buat aplikasi tersebut dapat dikonfigurasi sehingga aplikasi kita akan memeriksa environment variable DEFAULT_MESSAGE dan menggunakan nilainya sebagai pesan dalam respons kita.

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "os"
)

type Response struct {
    Message string `json:"message,omitempty"`
}

func main() {
    // get default message from env
    message := os.Getenv("DEFAULT_MESSAGE")
    if message == "" {
        // fallback message
        message = "Success"
    }

    srv := http.NewServeMux()
    srv.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        res := Response{
            Message: message,
        }

        err := json.NewEncoder(w).Encode(res)
        if err != nil {
            log.Fatal(err)
        }
    })

    fmt.Println("Server is running on port 8080...")
    err := http.ListenAndServe(":8080", srv)
    if err != nil {
        log.Fatal(err)
    }
}

Coba jalankan dengan environment variable tambahan seperti ini DEFAULT_MESSAGE="k8s" go run main.go dan akan mengembalikan k8s sebagai pesan ketika kita mengaksesnya.

➜ curl http://127.0.0.1:8080
{"message":"k8s"}

Bangun aplikasi kita lagi menggunakan perintah docker build --tag simple-go . sehingga image baru tersedia di image docker Kubernetes.

Mendefinisikan ConfigMap

Mari kita buat file baru bernama configmap.yaml dan definisikan objek ConfigMap di dalamnya.

apiVersion: v1
kind: ConfigMap
metadata:
  name: simple-go-config
data:
  DEFAULT_MESSAGE: "Everything is fine!"

Ini akan membuat objek ConfigMap dengan nama simple-go-config. Bagian data adalah pasangan key-value untuk konfigurasi kita. Di sini kita memiliki data konfigurasi dengan key DEFAULT_MESSAGE dan value "Everything is fine!".

Mari kita terapkan menggunakan perintah kubectl apply -f configmap.yaml. Dan periksa menggunakan kubectl get configmaps. Kita akan melihat simple-go-config dalam daftar.

➜ kubectl get configmaps 
NAME               DATA   AGE
kube-root-ca.crt   1      20d
simple-go-config   1      3s

Kita juga dapat melihat detailnya menggunakan perintah kubectl describe configmaps simple-go-config.

➜ kubectl describe configmaps simple-go-config 
Name:         simple-go-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
DEFAULT_MESSAGE:
----
Everything is fine!


BinaryData
====

Events:  <none>

Mengikat ConfigMap di Deployment

Sekarang kita sudah menyiapkan ConfigMap, kita perlu memperbarui konfigurasi deployment untuk mengatur environment variable dengan nama DEFAULT_MESSAGE dan mengambil nilainya dari ConfigMap bernama simple-go-config dengan key DEFAULT_MESSAGE.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-go
  labels:
    app: simple-go
spec:
  replicas: 3
  selector:
    matchLabels:
      app: simple-go
  template:
    metadata:
      labels:
        app: simple-go
    spec:
      containers:
      - name: server
        image: simple-go:latest
        imagePullPolicy: Never
        ports:
        - containerPort: 8080
        env:
        - name: DEFAULT_MESSAGE
          valueFrom:
            configMapKeyRef:
              name: simple-go-config
              key: DEFAULT_MESSAGE

Terapkan deployment dan kita akan melihat kumpulan pod baru dibuat menggantikan pod lama.

➜ kubectl apply -f deployment.yaml 
deployment.apps/simple-go configured
➜ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
simple-go-77b89f5cf8-6ldx9   1/1     Running   0          8s
simple-go-77b89f5cf8-bpsgq   1/1     Running   0          9s
simple-go-77b89f5cf8-jcfc7   1/1     Running   0          7s

Sekarang mari kita lakukan port-forward ke salah satu pod dan akses aplikasi kita dengan curl.

➜ kubectl port-forward simple-go-77b89f5cf8-6ldx9 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

Aplikasi kita sekarang akan mengembalikan pesan respons "Everything is fine!" seperti ini.

➜ curl http://127.0.0.1:8080
{"message":"Everything is fine!"}

Setiap kali kita memperbarui ConfigMap, kita juga perlu me-restart pod agar mendapatkan konfigurasi terbaru.

Referensi


Edit on GitHub

Last updated on

ConfigMap | Faisal Affan