Kubernetes 漫遊:理解 ConfigMap

小二十七發表於2023-11-16

安裝說明

透過 docker desktop 可以安裝適用於單機和開發環境單機版的 K8S,如果 docker desktop 無法啟動 Kubernates 透過以下方式解決:

一:新增國內映象源

為 Docker 的 daemon.json 新增配置:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"
  ]
}

二:透過指令碼下載 Kubernetrs 所需要的映象

在 GitHub 中的 k8s-for-docker-desktop 專案中下載 Kubernetes 版本對應的分支,然後執行指令碼即可,啟動完成後,驗證 K8S 叢集狀態:

$ kubectl cluster-info
$ kubectl get nodes
$ kubectl describe node

理解 Pod

先透過一個簡單的示例理解 Pod,Pod 是 Kubernetes 中的基本部署單元,這裡看看如何用 Pod 建立一個 nginx 服務。

使用 kubectl 命令部署一個 nginx 的服務:

$ kubectl create deployment nginx-arm --image=nginx

建立部署後,您可以使用以下命令檢查 Pod 的狀態:

$ kubectl get pods

這將列出所有 Pod,您可以檢視 nginx-arm 部署建立的 Pod 的狀態。

如果 Pod 狀態不是 Running,您可以使用以下命令檢視日誌,以幫助診斷問題:

$ kubectl logs [POD_NAME]

[POD_NAME] 替換為您的 Pod 名稱。

如果您想讓 nginx 服務可以從叢集外部訪問,您可以建立一個服務來暴露它:

$ kubectl expose deployment nginx-arm --port=80 --type=LoadBalancer

這將建立一個負載均衡器,將流量轉發到 nginx Pod 的 80 埠。

最後請求服務,進行驗證:

$ curl 127.0.0.1:80

響應 Welcome to nginx! 代表服務訪問完成。

理解 ConfigMap

ConfigMap 是 Kubernetes 中的一個 API 物件,主要用於儲存非機密性的鍵值對資料。因為 Kubernetes 的理念是推崇應用程式和配置分離,所以你可以使用 ConfigMap 將配置資訊從應用程式程式碼中分離出來,使得容器化應用程式的配置更加靈活和可管理。

建立

你可以透過一下命令從指定的 *.yaml 檔案裡面建立一個 ConfigMap,示例:

$ kubectl create configmap envoy-config --from-file=envoy.yaml

以上命令建立一個名稱為 envoy-config 的 ConfigMap 物件,建立後,它可以用於配置 Kubernetes 中的容器化應用,可以將這個 ConfigMap 掛載到 Pod 中,使得 Pod 內的應用能夠讀取並使用 envoy.yaml 檔案中定義的配置。

檢視

在當前名稱空間中列出所有 ConfigMap,您可以使用:

$ kubectl get configmap

這將顯示所有 ConfigMap 的基本資訊:

NAME               DATA   AGE
envoy-config       1      47h

要獲取特定 ConfigMap 的詳細資訊,可以使用:

$ kubectl describe configmap [CONFIGMAP_NAME]

使用

啟動一個 Envoy Deployment 並且使用剛才建立的 ConfigMap 物件:

$ kubectl create -f envoy-deploy.yaml
$ kubectl expose deploy envoy --selector run=envoy --port=10000 --type=NodePort

envoy-deploy.yamlspec 中是這樣引用外部的配置檔案的

spec:
  containers:
  - image: envoyproxy/envoy-dev
    name: envoy
    volumeMounts:
    - name: envoy-config
      mountPath: "/etc/envoy"
      readOnly: true
  volumes:
  - name: envoy-config
    configMap:
      name: envoy-config

以上配置在 volumeMounts 中定義了卷的掛載名稱和掛載目錄,並且設定為只讀。在 volumes 中可以看到卷的來源是名稱為 envoy-config 的 ConfigMap ,就是我們剛才建立的物件。

然後,可以使用以下命令,調整剛才建立 Pod 的數量:

kubectl scale deploy envoy --replicas=3

透過 kubectl get pods 可以確認:

NAME                     READY   STATUS    RESTARTS   AGE
envoy-747c876c74-lss78   1/1     Running   1          13h
envoy-747c876c74-tmklv   1/1     Running   0          8h
envoy-747c876c74-vdh99   1/1     Running   0          8h

環境變數

使用 --from-env-file 選項引數,可以建立特別用於環境變數配置示例:

$ kubectl create configmap game-env-config --from-env-file=game.properties

使用 -o yaml 引數可以指定 configMap 物件輸出格式為 YAML 示例:

$ kubectl get configmap -oyaml [CONFIGMAP_NAME]

命令列鍵值對

使用 --from-literal 引數可以直接在命令列中定義鍵值對的 ConfigMap:

$ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm

這裡的 ConfigMap 建立了兩個鍵值對:special.how=veryspecial.type=charm。你可以用上面的命令列印它。

引用配置

和其他 ConfigMap 物件一樣,可以在部署物件引用賦值 Pod 的環境變數,Deploymen 配置:

# ......
spec:
  containers:
    - name: test-container
      image: nginx
      #command: [ "/bin/sh", "-c", "env" ]
      env:
        # Define the environment variable
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              # The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
              name: special-config
              # Specify the key associated with the value
              key: special.how

說明:以上 Pod 透過 configMapKeyRef 引用 special-config 中鍵為 special.how 的值,並將其賦給了名為 SPECIAL_LEVEL_KEY 的環境變數。

驗證:可以先建立部署,然後透過 env 命令列印環境變數檢視 Pod 的載入情況:

# create  deployment
$ kubectl create -f downward-api-pod.yaml
# check pod
$ kubectl exec downward-api-pod -- env | grep "SPECIAL_LEVEL_KEY"

輸出結果:

# output
SPECIAL_LEVEL_KEY=very

掛載

在 Deploymen 配置中也可以宣告 volume 以掛載的方式訪問 ConfigMap 物件,示例:

apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        # Provide the name of the ConfigMap containing the files you want
        # to add to the container
        name: special-config

說明:

  • volumeMounts 定義容器內的卷掛載點,引用的卷名稱是 config-volume,指定路徑是 /etc/confg
  • volumes 定義卷的名稱。指明這個捲來源 ConfigMap,透過 name 指定 special-config 的 ConfigMap 內容會將被對映到卷中

驗證:參考上面的方式,在建立部署後,透過 env 命令檢視 Pod 環境變數即可。

就緒探針

Readiness Probe(就緒探針)是用來檢測容器是否已經啟動並且準備好被使用的機制。主要用於提高系統的可靠性和穩定性。

基本定義探針配置示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: centos
  name: centos
spec:
  replicas: 1
  selector:
    matchLabels:
      run: centos
  template:
    metadata:
      labels:
        run: centos
    spec:
      containers:
      - command:
        - tail
        - -f
        - /dev/null
        image: centos
        name: centos
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 5
          periodSeconds: 5

說明:這個 Deployment 配置了一個就緒探針,這個探針是執行的命令是 cat /tmp/healthy。如果該命令成功執行(返回狀態碼 0),則認為容器就緒。

  • readinessProbe:定義了就緒探針(Readiness Probe)
  • exec:定義透過指定執行命令來檢查就緒狀態,command 是具體執行的命令。
  • initialDelaySeconds:容器啟動後 5 秒開始執行就緒探針。
  • periodSeconds:每 5 秒執行一次就緒探針。

啟動 Pod 驗證:

$ kubectl create -f centos-readiness.yaml

啟動後發現該 Pod 遲遲無法 READY

NAME                      READY   STATUS             RESTARTS   AGE
centos-54bc4f8766-m54hd   0/1     Running            0          4m21s

原因在於就緒探針的作用,想要 Pod 進入就緒狀態,可以進入容器進行操作:

# Enter Pod
$ kubectl exec -it [POD_NAME] -- /bin/bash
# Create a file
$ echo "0" > /tmp/healthy
$ cat /tmp/healthy		# # output 0

新增探針檢查的檔案,返回正常的狀態碼,然後再檢視 Pod:

$ kubectl get po

輸出:

NAME                      READY   STATUS             RESTARTS   AGE
centos-54bc4f8766-m54hd   1/1     Running            0          5m24s

可以看到剛才的 Pod 已經進入 READY 狀態。

相關文章