适合 Kubernetes 初学者的一些实战练习 (五)
本實(shí)戰(zhàn)練習(xí)系列的前四篇文章:
-
適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (一)
-
適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (二)
-
適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (三)
-
適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (四)
本文繼續(xù)我們的 Kubernetes 實(shí)戰(zhàn)練習(xí)之旅。
練習(xí)1 - 將 configmap 通過環(huán)境變量注入到 pod 里
在 Kubernetes 官網(wǎng)里,曾經(jīng)提到 Kubernetes 里的一個(gè)最佳實(shí)踐(Best Practice)就是把應(yīng)用代碼同配置信息分開,一種方式就是使用 Kubernetes 1.2 里引入的 configmap 概念。
configmap 實(shí)際上就是一系列鍵值對,存儲(chǔ)于 etcd 里。etcd 的官網(wǎng)有這樣一句話:
etcd is a distributed key-value store designed to reliably and quickly preserve and provide access to critical data.
etcd 是一個(gè)高性能的分布式鍵值對存儲(chǔ)庫,用于存儲(chǔ)和訪問關(guān)鍵數(shù)據(jù)。
使用下面的命令行創(chuàng)建一個(gè) Kubernetes config map:
kubectl create configmap test-config --from-literal=test.type=unit --from-literal=test.exec=always
創(chuàng)建一個(gè)名為 test-config的鍵值對,key 為 test.type,值為 unit,key 為test.exec, 值為 always.
下面我打算創(chuàng)建一個(gè) pod,消費(fèi)這個(gè)名為 test-config 的 configmap.
創(chuàng)建一個(gè)內(nèi)容如下的 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這個(gè) yaml 文件定義的 pod 基于 docker 鏡像 alpine,執(zhí)行 shell 命令 /bin/sh -c env 查看環(huán)境變量。
在 env 區(qū)域,我給該 pod 注入一個(gè)名為 TEST_TYPE 的環(huán)境變量,值從 configMap 鍵值對的鍵名稱為 test.type 的值中取。
kubectl create -f 創(chuàng)建這個(gè) pod:
使用命令 kubectl logs test-configmap 查看這個(gè) pod 運(yùn)行生成的日志,發(fā)現(xiàn)輸出的環(huán)境變量列表中,出現(xiàn)了 TEST_TYPE=unit,這個(gè) TEST_TYPE 是我在 yaml 文件里注入的環(huán)境變量名稱,而 unit 就來自 configmap 里 test-config 的值 unit.
練習(xí)2 - 通過一個(gè)基于 PostgreSQL 的具體例子學(xué)習(xí) Kubernetes Stateful Set
Stateful Set 是 Kubernetes 1.9 版本新引入的一個(gè)概念,用于管理有狀態(tài)的應(yīng)用。
Kubernetes StatefulSet 由以下幾個(gè)部分組成:
下面是一個(gè)實(shí)際應(yīng)用中的 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:
當(dāng)我把 statefulset yaml 文件里的 replicas 從 1 改成 3 之后,果然觀察到有兩個(gè)新的 pod 正在啟動(dòng),并且名稱滿足命名規(guī)范<stateful set name >-X.
使用 kubectl describe 查看創(chuàng)建的 statefulset 明細(xì):
statefulSet 自動(dòng)創(chuàng)建的 persistentVolumeClaim:
使用下面的命令登錄到 statefulset 提供的 PostgreSQL 服務(wù)器上:
kubectl run tester -it --rm --image=postgres:9.6 --env=“PGCONNECT_TIMEOUT=5” --command – bash
看到 root$ 之后,說明我們已經(jīng)連接上 pod 了。
使用如下命令行連接 PostgreSQL 服務(wù)器:
psql -h ads-db-statefulset-0.ads-db-service -p 5432 -U adsuser -W ads
當(dāng)然如果不用命令行,也可以使用 pgadmin,以圖形化界面連接 statefulSet 里的 postgreSQL 服務(wù)器:
sudo apt install pgadmin3
進(jìn)行端口轉(zhuǎn)發(fā),這樣我們可以使用 localhost:5432 進(jìn)行連接:
kubectl port-forward ads-db-statefulset-0 5432:5432
也能成功連接:
總結(jié)
本文介紹了如何將 ConfigMap 通過環(huán)境變量的方式注入到 Kubernetes Pod 之中,這也是 Kubernetes 官方推薦的應(yīng)用代碼同配置信息分離的最佳實(shí)踐思路,在實(shí)際項(xiàng)目中的體現(xiàn)。本文第二部分通過將 PostgreSQL 服務(wù)器實(shí)例運(yùn)行在 Stateful Set 上的例子,介紹了 Kubernetes Stateful Set 在實(shí)際項(xiàng)目中的一個(gè)應(yīng)用場景。
本系列前四篇文章可以通過下面的鏈接獲得:
本實(shí)戰(zhàn)練習(xí)系列的前四篇文章:
-
適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (一)
-
適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (二)
-
適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (三)
-
適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (四)
總結(jié)
以上是生活随笔為你收集整理的适合 Kubernetes 初学者的一些实战练习 (五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马斯克向推特僵尸帐户发最后通牒 30天内
- 下一篇: SAP CAP 项目 cds watch