Kubernetes 漫遊:理解 ConfigMap

安裝說明

通過 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 狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章