适合 Kubernetes 初学者的一些实战练习 (五)
本實戰練習系列的前四篇文章:
-
適合 Kubernetes 初學者的一些實戰練習 (一)
-
適合 Kubernetes 初學者的一些實戰練習 (二)
-
適合 Kubernetes 初學者的一些實戰練習 (三)
-
適合 Kubernetes 初學者的一些實戰練習 (四)
本文繼續我們的 Kubernetes 實戰練習之旅。
練習1 - 將 configmap 通過環境變量注入到 pod 里
在 Kubernetes 官網里,曾經提到 Kubernetes 里的一個最佳實踐(Best Practice)就是把應用代碼同配置信息分開,一種方式就是使用 Kubernetes 1.2 里引入的 configmap 概念。
configmap 實際上就是一系列鍵值對,存儲于 etcd 里。etcd 的官網有這樣一句話:
etcd is a distributed key-value store designed to reliably and quickly preserve and provide access to critical data.
etcd 是一個高性能的分布式鍵值對存儲庫,用于存儲和訪問關鍵數據。
使用下面的命令行創建一個 Kubernetes config map:
kubectl create configmap test-config --from-literal=test.type=unit --from-literal=test.exec=always
創建一個名為 test-config的鍵值對,key 為 test.type,值為 unit,key 為test.exec, 值為 always.
下面我打算創建一個 pod,消費這個名為 test-config 的 configmap.
創建一個內容如下的 yaml 文件:
apiVersion: v1kind: Podmetadata:name: test-configmapspec:containers:- name: test-containerimage: alpine:3.8command: [ "/bin/sh", "-c", "env" ]env:- name: TEST_TYPEvalueFrom:configMapKeyRef:name: test-configkey: test.type- name: TEST_EXECvalueFrom:configMapKeyRef:name: test-configkey: test.execrestartPolicy: Never這個 yaml 文件定義的 pod 基于 docker 鏡像 alpine,執行 shell 命令 /bin/sh -c env 查看環境變量。
在 env 區域,我給該 pod 注入一個名為 TEST_TYPE 的環境變量,值從 configMap 鍵值對的鍵名稱為 test.type 的值中取。
kubectl create -f 創建這個 pod:
使用命令 kubectl logs test-configmap 查看這個 pod 運行生成的日志,發現輸出的環境變量列表中,出現了 TEST_TYPE=unit,這個 TEST_TYPE 是我在 yaml 文件里注入的環境變量名稱,而 unit 就來自 configmap 里 test-config 的值 unit.
練習2 - 通過一個基于 PostgreSQL 的具體例子學習 Kubernetes Stateful Set
Stateful Set 是 Kubernetes 1.9 版本新引入的一個概念,用于管理有狀態的應用。
Kubernetes StatefulSet 由以下幾個部分組成:
下面是一個實際應用中的 StatefulSet 的 yaml 文件:
apiVersion: apps/v1kind: StatefulSetmetadata:name: ads-db-statefulsetlabels:component: adsmodule: dbspec:serviceName: ads-db-servicereplicas: 1selector:matchLabels:component: adsmodule: dbtemplate:metadata:labels:component: adsmodule: dbspec:volumes:- name: initsecret:secretName: ads-db-secretitems:- key: initdb.sqlpath: initdb.sqlcontainers:- name: ads-db-podimage: postgres:9.6ports:- containerPort: 5432name: ads-db-portvolumeMounts:- name: ads-db-volumemountPath: /var/lib/postgresql/data/- name: initmountPath: /docker-entrypoint-initdb.d/env:- name: PGDATAvalueFrom:configMapKeyRef:name: ads-db-configmapkey: pgdata_value- name: POSTGRES_PASSWORDvalueFrom:secretKeyRef:name: ads-db-secretkey: postgres_password_valuevolumeClaimTemplates:- metadata:name: ads-db-volumelabels:component: adsmodule: dbspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1Gi
使用 kubectl get statefulset 查看生成的 statefulset:
生成的 headless service:
生成的 pod:
當我把 statefulset yaml 文件里的 replicas 從 1 改成 3 之后,果然觀察到有兩個新的 pod 正在啟動,并且名稱滿足命名規范<stateful set name >-X.
使用 kubectl describe 查看創建的 statefulset 明細:
statefulSet 自動創建的 persistentVolumeClaim:
使用下面的命令登錄到 statefulset 提供的 PostgreSQL 服務器上:
kubectl run tester -it --rm --image=postgres:9.6 --env=“PGCONNECT_TIMEOUT=5” --command – bash
看到 root$ 之后,說明我們已經連接上 pod 了。
使用如下命令行連接 PostgreSQL 服務器:
psql -h ads-db-statefulset-0.ads-db-service -p 5432 -U adsuser -W ads
當然如果不用命令行,也可以使用 pgadmin,以圖形化界面連接 statefulSet 里的 postgreSQL 服務器:
sudo apt install pgadmin3
進行端口轉發,這樣我們可以使用 localhost:5432 進行連接:
kubectl port-forward ads-db-statefulset-0 5432:5432
也能成功連接:
總結
本文介紹了如何將 ConfigMap 通過環境變量的方式注入到 Kubernetes Pod 之中,這也是 Kubernetes 官方推薦的應用代碼同配置信息分離的最佳實踐思路,在實際項目中的體現。本文第二部分通過將 PostgreSQL 服務器實例運行在 Stateful Set 上的例子,介紹了 Kubernetes Stateful Set 在實際項目中的一個應用場景。
本系列前四篇文章可以通過下面的鏈接獲得:
本實戰練習系列的前四篇文章:
-
適合 Kubernetes 初學者的一些實戰練習 (一)
-
適合 Kubernetes 初學者的一些實戰練習 (二)
-
適合 Kubernetes 初學者的一些實戰練習 (三)
-
適合 Kubernetes 初學者的一些實戰練習 (四)
總結
以上是生活随笔為你收集整理的适合 Kubernetes 初学者的一些实战练习 (五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马斯克向推特僵尸帐户发最后通牒 30天内
- 下一篇: 基于 A15 Bionic,古尔曼称苹果