1.Secret的資源配置?
1.1 Secret配置的相關(guān)說明?
Secret 是用來保存密碼、token、密鑰等敏感數(shù)據(jù)的 k8s 資源,這類數(shù)據(jù)雖然也可以存放在 Pod 或者鏡像中,但是放在 Secret 中是為了更方便的控制如何使用數(shù)據(jù),并減少暴露的風(fēng)險
Secret 有三種類型:?
●kubernetes.io/service-account-token:由 Kubernetes 自動創(chuàng)建,用來訪問 APIServer 的 Secret,Pod 會默認(rèn)使用這個 Secret 與 APIServer 通信, 并且會自動掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中;
●Opaque :base64 編碼格式的 Secret,用來存儲用戶自定義的密碼、密鑰等,默認(rèn)的 Secret 類型;
●kubernetes.io/dockerconfigjson :用來存儲私有 docker registry 的認(rèn)證信息。
Pod 需要先引用才能使用某個 secret,Pod 有 3 種方式來使用 secret:
●作為掛載到一個或多個容器上的卷 中的文件。
●作為容器的環(huán)境變量。
●由 kubelet 在為 Pod 拉取鏡像時使用
?
?1.2 陳述式創(chuàng)建Secret配置
?Secret 的創(chuàng)建是根據(jù)文件中保存到相應(yīng)信息,進(jìn)行。例如我們要通過一個用戶名文件和密碼文件來創(chuàng)建具體的Secret資源配置。
#首先準(zhǔn)備好相對應(yīng)的用戶和密碼文件
#echo 中 “-n” 選項(xiàng)為不換行
echo -n 'zhangsan'>username.txt
echo -n 'abc1234'>passwd.txt
?
?
#進(jìn)行陳述創(chuàng)建secret配置
?
kubectl create secret generic mysecret --from-file=username.txt --from-file=password.txt
?
kubectl describe secrets mysecret?
?
1.3 聲明式+base64編碼創(chuàng)建Secret?
echo zhangsan|base64
echo abc1234|base64
?#對已存在的secret資源進(jìn)行模板導(dǎo)入yaml文件
kubectl get secrets mysecret -o yaml >secrets-demo.yaml
#對模板進(jìn)行修改編輯
vim secrets-demo.yaml?
?
apiVersion: v1
kind: Secret
metadata:
? name: mysecret1
? namespace: default
type: Opaque
data:
? username: emhhbmdzYW4K
? passwd: YWJjMTIzNAo=
?
kubectl apply -f secrets-demo.yaml?
?
?
?1.4 將secret以volume形式掛載到pod中
#創(chuàng)建一個pod模板,對其進(jìn)行修改編輯
kubectl run nginx --image=nginx:1.14 --dry-run=client -o yaml > secret-test.yaml
?
vim scret-test.yaml
?
apiVersion: v1
kind: Pod
metadata:
? name: mypod
spec:
? containers:
? - image: nginx:1.14
? ? name: nginx
? ? volumeMounts:
? ? - name: secrets
? ? ? mountPath: "/opt/secrets"
? ? ? readOnly: true
? volumes:
? - name: secrets
? ? secret:
? ? ? secretName: mysecret1
?
?
?
kubectl creat -f scret-test.yaml
?
?
1.5? 將Secret導(dǎo)入到pod中,充當(dāng)環(huán)境變量
#復(fù)制上一個模板,進(jìn)行修改編輯
cp secret-test.yaml secret-env.yaml
?
#進(jìn)行編輯修改
vim secret-env.yaml
?
apiVersion: v1
kind: Pod
metadata:
? name: mypod
spec:
? containers:
? - image: nginx:1.14
? ? name: nginx
? ? env:
? ? - name: TEST_USER
? ? ? valueFrom:
? ? ? ? secretKeyRef:
? ? ? ? ? name: mysecret1
? ? ? ? ? key: username
? ? - name: TEST_PASSWD
? ? ? valueFrom:
? ? ? ? secretKeyRef:
? ? ? ? ? name: mysecret1
? ? ? ? ? key: passwd
? ? envFrom:
? ? - secretRef:
? ? ? ? name: mysecret1
?
kubectl create -f secret-env.yaml ? ? ? ? ? ? ? ? ? ? ??
?
?1.6 實(shí)戰(zhàn)運(yùn)用:使用secret配置免密交互拉取habor私有倉庫鏡像?
?我們在搭建好docker的私有倉庫后,在使用私有倉庫時需要通過docker login指令來登錄到私有倉庫中。但同時在使用的過程中也會把habor倉庫的用戶名和密碼暴露在命令行中,存在一定的安全隱患。k8s中的secret配置的運(yùn)用能夠?qū)崿F(xiàn)并且規(guī)避這一問題的存在
?
?進(jìn)行私有倉庫的secret資源創(chuàng)建
#私有倉庫的secret配置
kubectl create secret docker-registry myharbor --docker-server=192.168.73.108 --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@qq.com
?引用secret資源拉取私有倉庫鏡像創(chuàng)建pod?
vim harbor-test.yaml
?
apiVersion: v1
kind: Pod
metadata:
? name: harbor-pod
spec:
? nodeName: node02
? imagePullSecrets:
? - name: myharbor
? containers:
? - image: 192.168.73.108/test/nginx-test:v1
? ? name: harbor-pod
? dnsPolicy: ClusterFirst
? restartPolicy: Always ? ? ??
?
?
?
?
注意:登錄harbor倉庫的默認(rèn)配置為https,所以我們要在配置上修改(所有node節(jié)點(diǎn),如果只是測試,可以在pod中指定node節(jié)點(diǎn),修改一個node即可):
?
?2.ConfigMap資源配置
與Secret類似,區(qū)別在于ConfigMap保存的是不需要加密配置的信息。
ConfigMap 功能在 Kubernetes1.2 版本中引入,許多應(yīng)用程序會從配置文件、命令行參數(shù)或環(huán)境變量中讀取配置信息。ConfigMap API 給我們提供了向容器中注入配置信息的機(jī)制,ConfigMap 可以被用來保存單個屬性,也可以用來保存整個配置文件或者JSON二進(jìn)制大對象。
應(yīng)用場景:應(yīng)用配置
?
?2.1 使用目錄來創(chuàng)建configMap資源
?創(chuàng)建一個目錄并且在一個目錄中填寫兩個文件:
mkdir /opt/configmap/
?
vim /opt/configmap/game.config
enemy.types=aliens,monsters
player.maximum-lives=5?
?
vim /opt/configmap/ui.config
color.good=purple
color.bad=yellow
allow.textmode=true
?
ls /opt/configmap/
?
kubectl create configmap game-config --from-file=/opt/configmap/
//--from-file 指定在目錄下的所有文件都會被用在 Con?gMap 里面創(chuàng)建一個鍵值對,鍵的名字就是文件名,值就是文件的內(nèi)容
?
2.2 使用文件創(chuàng)建configMap資源?
#只要指定為一個文件就可以從單個文件中創(chuàng)建 Con?gMap
--from-file 這個參數(shù)可以使用多次,即可以使用兩次分別指定上個實(shí)例中的那兩個配置文件,效果就跟指定整個目錄是一樣的
kubectl create configmap game-config2 --from-file=/opt/configmap/game.config --from-file=/opt/configmap/ui.config?
?
2.3 直接使用參數(shù)創(chuàng)建confidenceMap資源
#使用文字值創(chuàng)建,利用 --from-literal 參數(shù)傳遞配置信息,該參數(shù)可以使用多次
?
kubectl create configmap special-config --from-literal=name=zhangsan --from-literal=sex=man
?
2.4 pod利用configMap資源
(1)使用 ConfigMap 來替代環(huán)境變量
vim env.yaml
apiVersion: v1
kind: ConfigMap
metadata:
? name: special-config
? namespace: default
data:
? special.how: very
? special.type: good
---
apiVersion: v1
kind: ConfigMap
metadata:
? name: env-config
? namespace: default
data:
? log_level: INFO
?
?
kubectl create -f env.yaml?
?
?
?(2)創(chuàng)建pod,并且引用configMap資源
vim test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
? name: test-pod
spec:
? containers:
? - name: busybox
? ? image: busybox:1.28.4
? ? command: [ "/bin/sh", "-c", "env" ]
? ? env:
? ? ? - name: SPECIAL_HOW_KEY
? ? ? ? valueFrom:
? ? ? ? ? configMapKeyRef:
? ? ? ? ? ? name: special-config
? ? ? ? ? ? key: special.how
? ? ? - name: SPECIAL_TYPE_KEY
? ? ? ? valueFrom:
? ? ? ? ? configMapKeyRef:
? ? ? ? ? ? name: special-config
? ? ? ? ? ? key: special.type
? ? envFrom:
? ? ? - configMapRef:
? ? ? ? ? name: env-config
? restartPolicy: Never
?
2.5 使用 ConfigMap 設(shè)置命令行參數(shù)??
?vim test-pod2.yaml
apiVersion: v1
kind: Pod
metadata:
? name: test-pod2
spec:
? containers:
? - name: busybox
? ? image: busybox:1.28.4
? ? command:?
?? ?- /bin/sh
?? ?- -c
?? ?- echo "$(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)"
? ? env:
? ? ? - name: SPECIAL_HOW_KEY
? ? ? ? valueFrom:
? ? ? ? ? configMapKeyRef:
? ? ? ? ? ? name: special-config
? ? ? ? ? ? key: special.how
? ? ? - name: SPECIAL_TYPE_KEY
? ? ? ? valueFrom:
? ? ? ? ? configMapKeyRef:
? ? ? ? ? ? name: special-config
? ? ? ? ? ? key: special.type
? ? envFrom:
? ? ? - configMapRef:
? ? ? ? ? name: env-config
? restartPolicy: Never
?
?
kubectl create -f test-pod2.yaml
?
?
2.6?通過數(shù)據(jù)卷插件使用Con?gMap??
?在數(shù)據(jù)卷里面使用 Con?gMap,就是將文件填入數(shù)據(jù)卷,在這個文件中,鍵就是文件名,鍵值就是文件內(nèi)容
vim test-pod3.yaml
apiVersion: v1
kind: Pod
metadata:
? name: test-pod3
spec:
? containers:
? - name: busybox
? ? image: busybox:1.28.4
? ? command: [ "/bin/sh", "-c", "sleep 36000" ]
? ? volumeMounts:
? ? - name: config-volume
? ? ? mountPath: /etc/config
? volumes:
? ? - name: config-volume
? ? ? configMap:
? ? ? ? name: special-config
? restartPolicy: Never
?
?
##volumes字段中如果configMap中我們只想指定其中的一部分配置
可以通過:
items:
- key: xx
? path: xxx/xxxx
- key: xxx
? path: xxxx/xxxx
?
?比如:我想通過configMap實(shí)現(xiàn)單獨(dú)掛載pod中的nginx.conf配置?
#首先獲取nginx.conf 下載或則之前保存都可以
#nginx.conf 在/opt/conf/ 下
kubectl create cm mycm-nginx --from-file=/opt/conf
?
?
vim pod-demo1.yaml?
apiVersion: v1
kind: Pod
metadata:
? name: mypod
spec:
? volumes:
? - name: nginx
? ? configMap:
? ? ? name: mycm-nginx
? containers:
? - image: nginx:1.14
? ? name: nginx
? ? volumeMounts:
? ? - name: nginx
? ? ? mountPath: /etc/nginx/nginx.conf
? ? ? subPath: nginx.conf ? ? #subPath ?可以實(shí)現(xiàn)只覆蓋修改該文件,而不影響目錄
?
kubectl apply -f pod-demo1.yaml
2.7 configMap的熱更新
?volume掛載的configMap的熱更新:
#創(chuàng)建一個cm資源
kubectl create configmap name-config --from-literal=name=zhangsan
?
#創(chuàng)建一個pod,并且通過volume的方式掛載configMap中的name-config
vim ?pod-demo1.yaml
apiVersion: v1
kind: Pod
metadata:
? name: namepod
spec:
? volumes:
? - name: update-test
? ? configMap:
? ? ? name: name-config
? containers:
? - image: nginx:1.14
? ? name: mypod
? ? volumeMounts:
? ? - name: update-test
? ? ? mountPath: /opt/name.txt
進(jìn)行實(shí)時更新修改(開啟另一個終端):
kubectl ?edit cm name-config?
?
?
?PS:更新 ConfigMap 后:
●使用該 ConfigMap 掛載的 Env 不會同步更新。
●使用該 ConfigMap 掛載的 Volume 中的數(shù)據(jù)需要一段時間(實(shí)測大概10秒)才能同步更新。文章來源:http://www.zghlxwxcb.cn/news/detail-544242.html
??總結(jié)
使用 Secret 資源
掛載的方式
在 pod.spec.volumes 字段中定義卷類型為 secret?
在 pod.spec.containers.volumeMounts 字段中把存儲卷掛載到指定的容器目錄,secret資源數(shù)據(jù)的key將以文件名的形式存在,value為文件內(nèi)容
?
容器環(huán)境變量引用的方式
在 pod.spec.containers.env.name 字段中自定義容器的環(huán)境變量名
在.containers.env.valueFrom.secretKeyRef.name字段中指定secret資源的名稱,.containers.env.valueFrom.secretKeyRef.key字段中指定這個secret資源數(shù)據(jù)的key, 從而確定引用那個secret資源的key的value作為這個環(huán)境變量的值
在 .containers.envFrom.secretRef.name 字段中指定secret資源的名稱,可實(shí)現(xiàn)使用secret資源數(shù)據(jù)的key作為容器環(huán)境變量名,value作為這個環(huán)境變量的值
?
K8S從私有倉庫拉取鏡像時使用
在 pod.spec.imagePullSecrets 字段中指定 kubernetes.io/dockerconfigjson 類型的 secret 資源來作為連接私有倉庫的認(rèn)證信息
?
?
ConfigMap ?簡稱 ?cm ,保存配置文件 ?環(huán)境變量 命令行參數(shù) 之類的不需要加密的信息
創(chuàng)建 cm 資源
kubectl create ?cm ?XXX --from-file=文件/目錄 ? ?--from-literal=變量的鍵值對(key=value)
?
查看cm資源的數(shù)據(jù),數(shù)據(jù)以明文格式顯示key的value
kubectl describe cm ?XXX ? 或 ? ?kubectl get cm XXX -o yaml
?
使用 cm 資源
容器環(huán)境變量引用的方式
env 指定自定義的環(huán)境變量名,通過指定的cm資源名稱和key來給這個變量賦值
envFrom ?直接使用cm資源的key作為容器的環(huán)境變量名,key的value作為這個變量的值
?
掛載的方式
volumes 定義卷類型為 configMap ,使用 items 字段可以自定義掛載的文件的子目錄和文件名
volumeMounts ?把卷掛載到容器目錄。cm資源數(shù)據(jù)中的key以文件名的形式存在,value為文件內(nèi)容 ??
?? ??? ??? ? ?使用 subPath 指定文件名,實(shí)現(xiàn)只把卷掛載到指定的文件名上
?
cm資源熱更新
更新cm資源的數(shù)據(jù)可以同步更新通過掛載的方式使用cm資源數(shù)據(jù)的Pod中的配置(注:使用subPath掛載的文件不會更新)
如果使用env或envFrom引用環(huán)境變量的方式,是不會同步更新Pod中的配置
?文章來源地址http://www.zghlxwxcb.cn/news/detail-544242.html
到了這里,關(guān)于【云原生】k8s配置資源管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!