configmap

Kubernetes’de, uygulama yapılandırması gibi çeşitli konfigürasyon bilgileri için ConfigMap adında bir yapı kullanılır. ConfigMap, uygulama konfigürasyonlarını, ortam değişkenlerini, dosya içeriklerini ve diğer konfigürasyonlarını içerebilir.

ConfigMap, YAML dosyaları aracılığıyla yapılandırılır ve bir veya daha fazla anahtar-değer çifti içerir. Bu anahtar-değer çiftleri, uygulamanın ihtiyacı olan konfigürasyon bilgilerini temsil eder. Uygulama içinde bu konfigürasyon bilgilerine erişmek için ConfigMap adına göre çağrı yapılabilir.

ConfigMap’ler, Deployment, Pod veya diğer Kubernetes yapıları tarafından referans edilebilir. Bu yapılar, ConfigMap’leri, pod’ların çalıştığı konteynerlerde kullanılan ortam değişkenleri veya ConfigMap dosyaları yoluyla uygulama konfigürasyonlarına dahil edebilir.

ConfigMap’ler, uygulama konfigürasyonlarının yönetimini kolaylaştırır ve uygulama sürümleri arasında hızlı bir şekilde geçiş yapılmasına olanak tanır. Bu sayede, uygulama geliştirme süreci daha hızlı ve güvenli hale getirilebilir. Ayrıca, ConfigMap’ler, uygulamanın çevreler arası geçişini de kolaylaştırır.

  • https://12factor.net/config

Uygulamayı ve servisi kuralım

kubectl apply -f https://raw.githubusercontent.com/redhat-scholars/kubernetes-tutorial/master/apps/kubefiles/myboot-deployment.yml

kubectl apply -f https://raw.githubusercontent.com/redhat-scholars/kubernetes-tutorial/master/apps/kubefiles/myboot-service.yml

configure tanımına bakalım

curl $IP:$PORT/configure

çevresel değişkenleri elle girelim (amele yöntem)

kubectl set env deployment/myboot GREETING="namaste"
kubectl set env deployment/myboot LOVE="Aloha"
kubectl set env deployment/myboot DBCONN="jdbc:sqlserver://45.91.12.123:1443;user=MyUserName;password=*****;"

# podlar yeni çdleri almak için yeniden oluşacaklardır.

NAME                      READY   STATUS        RESTARTS   AGE
myboot-66d7d57687-jsbz7   1/1     Terminating   0          5m
myboot-785ff6bddc-ghwpc   1/1     Running       0          13s

yeni çdleri görebiliriz.

kubectl describe deployment myboot

...
  Containers:
   myboot:
    Image:      quay.io/burrsutter/myboot:v1
    Port:       8080/TCP
    Host Port:  0/TCP
    Environment:
      GREETING:  namaste
      LOVE:      Aloha
      DBCONN:    jdbc:sqlserver://45.91.12.123:1443;user=MyUserName;password=*****;
    Mounts:      <none>
  Volumes:       <none>
...

çdleri kaldıralım


kubectl set env deployment/myboot GREETING-
kubectl set env deployment/myboot LOVE-
kubectl set env deployment/myboot DBCONN-

curl ile bakalım

curl $IP:$PORT/configure

Configuration for : myboot-66d7d57687-xkgw6
databaseConn=Default
msgBroker=Default
greeting=Default
love=Default

ConfigMap

https://github.com/redhat-scholars/kubernetes-tutorial/blob/master/apps/config/some.properties

kubectl create cm my-config --from-env-file=apps/config/some.properties

kubectl get cm
kubectl get cm my-config
kubectl get cm my-config -o json

...
    "data": {
        "GREETING": "jambo",
        "LOVE": "Amour"
    },
    "kind": "ConfigMap",
...

kubectl describe cm my-config

Name:         my-config
Namespace:    myspace
Labels:       <none>
Annotations:  <none>

Data
====
GREETING:
====
jambo
LOVE:
====
Amour
Events:  <none>

Bu configmap’i kullanan uygulamayı kuralım

kubectl apply -f https://raw.githubusercontent.com/redhat-scholars/kubernetes-tutorial/master/apps/kubefiles/myboot-deployment-configuration.yml

İşe yaramış mı?

curl $IP:$PORT/configure

Configuration for : myboot-84bfcff474-x6xnt
databaseConn=Default
msgBroker=Default
greeting=jambo
love=Amour

Başka bir configmap oluşturup ona geçiyoruz


kubectl delete cm my-config
kubectl create cm my-config --from-env-file=apps/config/other.properties
kubectl delete pod -l app=myboot

curl $IP:$PORT/configure


Configuration for : myboot-694954fc6d-nzdvx
databaseConn=jdbc:sqlserver://123.123.123.123:1443;user=MyUserName;password=*****;
msgBroker=tcp://localhost:61616?jms.useAsyncSend=true
hello=Default
love=Default

config map

apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # özellik tipi anahtarlar; her anahtar bir değeri adresler
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"
  #
  # dosya tipi anahtarlar
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true

deployment


apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  containers:
    - name: demo
      image: quay.io/rhdevelopers/myboot:v2
      env:
        # Bir ortam değişkeni tanımla
        - name: PLAYER_INITIAL_LIVES # burada isimlendirme büyük harf diğerinden farklı
          valueFrom:
            configMapKeyRef:
              name: game-demo           # configmap adı 
              key: player_initial_lives # değeri alacağı anahtar
        - name: UI_PROPERTIES_FILE_NAME
          valueFrom:
            configMapKeyRef:
              name: game-demo
              key: ui_properties_file_name
      volumeMounts:
      - name: config
        mountPath: "/config"
        readOnly: true
  volumes:
    # Önce pod seviyesinde dizini tanımlıyoruz ve yukarda container'ın içine bağlıyoruz. 
    - name: config
      configMap:
        # Bağlayacağınız configMap'in adı
        name: game-demo
        # Dosya olarak oluşturacağımız ConfigMapteki anahtarlar dizini. 
        items:
        - key: "game.properties"
          path: "game.properties"
        - key: "user-interface.properties"
          path: "user-interface.properties"

Configmapten script çalıştırma


#!/bin/sh
echo "Hello from the script baked into the container"
echo "Sleeping for eternity!"
sleep infinity

kubectl create configmap cf-echoscript from-file run.sh

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoscript
  labels:
    app: echoscript
spec:
  replicas: 1
  selector:
    matchLabels:
      app: echoscript
  template:
    metadata:
      labels:
        app: echoscript
    spec:
      containers:
      - name: echoscript
        image: busybox
        command: ["/bin/sh"]
        args: ["/scripts-dir/run.sh"]
        volumeMounts:
        - name: scripts-vol
          mountPath: /scripts-dir
      volumes:
      - name: scripts-vol
        configMap:
          name: cf-echoscript
kubectl apply -f echoscript-deployment.yaml

Referans https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

Temizlik

kubectl delete deployment myboot
kubectl delete cm my-config
kubectl delete service myboot