ConfigMap 補充 和 Secret
對于上一篇文章我們分享了為什么要使用 ConfigMap ,我們創(chuàng)建 ConfigMap 的時候可以傳入單個或者多個鍵值對,也可以傳入文件,還分享了如何簡單的傳入 ConfigMap 里面的數(shù)據(jù)作為環(huán)境變量
我們補充一下使用 ConfigMap 一次性傳遞多個條目吧
一次性傳遞 ConfigMap 的所有條目
若 ConfigMap 里面有多個鍵值對,如果按照我們上一次分享的做法來操作的話,肯定是會覺得非常的麻煩的,而且數(shù)量多了之后就會容易出錯,搞的整個人都不好了
那么我們看看 ConfigMap 如何一次性的傳遞多個條目吧
創(chuàng)建一個多條目的 ConfigMap
kubectl create configmap my-config --from-literal=XMTNAME=xiaozhu --from-literal=AGE=15 --from-literal=CITY=sz
創(chuàng)建有 3 個條目的 ConfigMap 來做個試驗
查看 my-config 詳情
正確創(chuàng)建了包含 3 個鍵值對的 ConfigMap

查看 cm 對應(yīng)的 yaml 信息

創(chuàng)建一個應(yīng)用多個環(huán)境變量的鏡像
**寫一個小腳本 newinfo.sh **
!/bin/bash
while?:
do
??echo?"new??--?xmtname?=?"?$XMTNAME??"?---?age?=?"?$AGE?"??---?city?=?"?$CITY?"
??sleep?2
done
寫 Dockerfile
FROM?ubuntu:latest
ADD?newinfo.sh?/bin/newinfo.sh
ENTRYPOINT?["/bin/newinfo.sh"]
構(gòu)建鏡像并推送
docker?build?-t?xiaomotong888/newinfo?.
docker?push?xiaomotong888/newinfo
寫 yaml 清單 newinfo.yaml,配置好 ConfigMap 多條目,創(chuàng)建 pod ,查看效果
apiVersion:?v1
kind:?Pod
metadata:
??name:?newinfo
spec:
??containers:
??-?image:?xiaomotong888/newinfo
????name:?newinfo
????envFrom:
????-?configMapRef:
????????name:?my-config
此處使用的是 envFrom
?和 configMapRef
來配置一個 configmap 的多個條目
kubectl create -f newinfo.yaml
查看對應(yīng) pod 的日志:

沒毛病老鐵,正確使用到了 my-config 里面的鍵值對,這樣我們使用單個 ConfigMap 條目或者多個 ConfigMap 的時候,都是可以方便的使用了
將 ConfigMap 中的數(shù)據(jù)作為命令行參數(shù)傳入
根據(jù)上述案例,我們可以看到的,做法都是以環(huán)境變量的方式配置的,那么可不可以也像我們之前不使用環(huán)境變量而使用命令行傳入?yún)?shù)的方式來傳入我們需要的參數(shù)的呢?
k8s 對你說,必須可以啊,安排上
我們也來做一個實驗,分為如下幾步走,步驟與上述類似,下面我使用圖的方式來呈現(xiàn):
寫腳本 env_configmap.sh ,帶有傳入?yún)?shù)

制作鏡像

docker hub 上生成的鏡像是 xiaomotong888/envconfigmap
寫 yaml ?env_configmap.yaml,創(chuàng)建 pod ,查看效果
apiVersion:?v1
kind:?Pod
metadata:
??name:?newinfo-env-configmap
spec:
??containers:
??-?image:?xiaomotong888/envconfigmap
????name:?newinfo-env-configmap
????env:
????-?name:?XMTCITY
??????valueFrom:
????????configMapKeyRef:
??????????name:?my-config
??????????key:?CITY
????args:?["$(XMTCITY)"]
我們可以看到,我們的做法其實和直接使用 ConfigMap 作為環(huán)境變量的做法是類似的,只不過是我們這里是先將 ConfigMap 里面的鍵值對轉(zhuǎn)成環(huán)境變量,然后我們在 yaml 清單中將該環(huán)境變量用 args 參數(shù)當(dāng)中

通過 kubectl create -f env_configmap.yaml ?
之后,我們來查看一下效果

nice ,沒毛病,老鐵 , 看了這幾個例子之后,是不是覺得很簡單呢,動手來試試吧
當(dāng)然,ConfigMap 也可以使用卷的方式,這個做法我們往下看,一起和 secret 一起分享,他們的用法是類似的
看到這里的兄弟們,明眼人都能看出 ConfigMap 傳遞的都是明文的信息,那么如果我們有一些需要傳遞敏感信息,需要加密的信息,我們可以如何傳遞呢?
那么接下來我們來分享一下如何傳遞 ConfigMap 的所有條目作為環(huán)境變量,以及如何傳遞敏感數(shù)據(jù)呢?
Secret 的方式傳遞敏感數(shù)據(jù)
Secret ?和 ConfigMap 類似,都是用來傳遞數(shù)據(jù),都是鍵值對的形式,解耦配置的,
只不過 ConfigMap 傳遞的是明文信息,Secret 傳遞的是加密的信息,和二進制信息,加密方式是 base64,使用改加密方式的原因是傳遞二進制數(shù)據(jù)的時候,base64 轉(zhuǎn)化之后,可以將二進制轉(zhuǎn)化成字符串的形式
既然 secret 和 ConfigMap 很類似,那么在數(shù)據(jù)傳遞上也是類似的,也有如下幾種方式
secret 暴露為卷中的文件
secret 里面的條目作為環(huán)境變量傳遞
有一點需要注意:
secret 是不會存儲在磁盤中的,只會存儲在節(jié)點的內(nèi)存中
我們會有默認(rèn)的一個 secret
kubectl get secrets


kubectl describe secret default-token-76xjz
查看詳情之后,我們可以看到這個 secret 包含了 3 個條目,分別是
ca.crt
namespace
token
這些信息是用于 pod 內(nèi)部安全訪問 k8s Apiserver 服務(wù)器所需的全部信息
看到這里,我們知道,既然每一個 pod 訪問 Apiserver 都需要這些權(quán)限信息,那么上述的加密信息肯定會存在 pod 的某個目錄咯?

兄弟你很聰明,確實是這樣的,我們來查看任意一個 pod ,看看詳情

我們可以看到 這個目錄/var/run/secrets/kubernetes.io/serviceaccount
是作為 k8s 的secrets 掛載,那么我們看看里面有啥吧

果然猜測沒錯,該目錄下有 3 個文件,是包含權(quán)限信息的
那么我們來創(chuàng)建 secret 并使用他來玩玩吧
如何創(chuàng)建并使用 secret
創(chuàng)建證書
openssl?genrsa?-out?https.key?2048?
?openssl?req?-new?-x509?-key?https.key?-out?https.cert-days?365?-subj?
/CN=www.xmt.com
我們可以看到在我們的當(dāng)前目錄下創(chuàng)建了 2 個文件

創(chuàng)建 secret
上面說到 ConfigMap 和 secret 類似,那么我們也創(chuàng)建一個文件,里面寫上明文的數(shù)據(jù),然后加入到 secret 中看看效果吧
寫 hello 文件
echo?xiaozhu?>?hello
創(chuàng)建 secret
kubectl?create?secret?generic?xmt-https?--from-file=https.key?--from-file=https.cert?--from-file=hello
查看我們創(chuàng)建的 secret
kubectl?get?secrets
?kubectl?describe?secret?xmt-https

使用 secret
我們使用 secret 的方式,最好是用卷的方式暴露文件,而不是使用環(huán)境變量的方式,因為 secret 傳遞的是敏感信息,若直接體現(xiàn)在 yaml 清單中的環(huán)境變量,這樣還是不太可取
寫 yaml 清單,引用 secret ? ? mysecret.yaml
apiVersion:?v1
kind:?Pod
metadata:
??name:?mysecret
spec:
??containers:
??-?image:?xiaomotong888/envconfigmap
????name:?mysecret
????volumeMounts:
????-?name:?mycert
??????mountPath:?/tmp/cert
??volumes:
??-?name:?mycert
????secret:
??????secretName:?xmt-https
我們這里可以隨便用一個鏡像,正確的創(chuàng)建 pod 即可,我們主要是驗證掛載到 pod 里面的文件是明文的且掛進再進去了,pod 里面自己需要如何時候,看自己的需求了

此處記得掛載的名字需要是一樣的,另外是使用 secret.secretName 關(guān)鍵字
如果是 ConfigMap 的掛載,可以是 ?configMap.name ?關(guān)鍵字
查看效果:
kubectl create -f mysecret.yaml 創(chuàng)建 pod 之后,查看效果

kubectl?exec?-it?mysecret?ls?/tmp/cert
kubectl?exec?-it?mysecret?cat?/tmp/cert/hello
kubectl?exec?-it?mysecret?cat?/tmp/cert/https.cert

我們再來看看本地的 http.cert 的信息,是否也是同樣的字符串

沒毛病老鐵,看效果還可以
最后提醒一點:
在 pod 運行過程中,如果修改了引用的 ConfigMap 和 secret,如果 pod 中的服務(wù)不支持熱配置讀取的話,那么請一定記得重啟 pod
今天就到這里,學(xué)習(xí)所得,若有偏差,還請斧正
歡迎點贊,關(guān)注,收藏
朋友們,你的支持和鼓勵,是我堅持分享,提高質(zhì)量的動力

好了,本次就到這里
技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵云原生,歡迎點贊關(guān)注收藏,下次見~