一.Secret
1.Secret概念
(1)Secret 是用來保存密碼、token、密鑰等敏感數(shù)據(jù)的 k8s 資源,這類數(shù)據(jù)雖然也可以存放在 Pod 或者鏡像中,但是放在 secret 中是為了更方便的控制如何使用數(shù)據(jù),并減少暴露的風(fēng)險(xiǎn)
(2)類似掛載的方式,使用的時(shí)候調(diào)用即可
2.Secret的類型
①kubernetes.io/service-account-token
由Kubernetes自動(dòng)創(chuàng)建,用來訪問APIServer 的 Secret, Pod會(huì)默認(rèn)使用這個(gè) Secret 與 APIServer 通信,并且會(huì)自動(dòng)掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中
②opaque
base64 編碼格式的 Secret,用來存儲(chǔ)用戶自定義的密碼、密鑰等,默認(rèn)的Secret 類型
③kubernetes.io/dockerconfigjson
用來存儲(chǔ)私有 docker registry 的認(rèn)證信息
④kubernetes.io/tls
用于為ssl通信模式存儲(chǔ)證書和私鑰文件,是命令式創(chuàng)建的類型標(biāo)識(shí)符為tls
3.secret的三種參數(shù)
①tls
僅用于存儲(chǔ)私鑰和證書
②docker-registry
若要保存docker倉庫的認(rèn)證信息的話,就必須使用此種類型來創(chuàng)建
③generic
通常用于存儲(chǔ)密碼數(shù)據(jù)——通用類型
4.Pod 的3種方式來使用secret
(1)作為掛載到一個(gè)或多個(gè)容器上的卷 中的文件
(2)作為容器的環(huán)境變量
(3)由 kubelet 在為 Pod 拉取鏡像時(shí)使用
應(yīng)用場(chǎng)景:憑據(jù)
https://kubernetes.io/docs/concepts/configuration/secret/
5.Secret創(chuàng)建及案例
(1)創(chuàng)建Secret
①用kubectl create secret命令創(chuàng)建Secret
echo -n 'zhangsan' > username.txt
echo -n 'abc1234' > password.txt
kubectl create secret generic mysecret --from-file=username.txt --from-file=password.txt
kubectl get secrets
NAME TYPE DATA AGE
default-token-59n24 kubernetes.io/service-account-token 3 19d
mysecret Opaque 2 5s
kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 7 bytes
username.txt: 8 bytes
#get或describe指令都不會(huì)展示secret的實(shí)際內(nèi)容,這是出于對(duì)數(shù)據(jù)的保護(hù)的考慮
②內(nèi)容用 base64 編碼,創(chuàng)建Secret
echo -n zhangsan | base64
emhhbmdzYW4=
echo -n abc1234 | base64
YWJjMTIzNA==
vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret1
type: Opaque
data:
username: emhhbmdzYW4=
password: YWJjMTIzNA==
kubectl create -f secret.yaml
kubectl get secrets
NAME TYPE DATA AGE
default-token-59n24 kubernetes.io/service-account-token 3 19d
mysecret Opaque 2 11m
mysecret1 Opaque 2 2m39s
kubectl get secret mysecret1 -o yaml
(2)使用Secret方式
①將Secret 掛載到 Volume 中,以 Volume 的形式掛載到 Pod 的某個(gè)目錄下
不止一個(gè)pod可以掛
vim secret-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
kubectl create -f secret-test.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 32s
kubectl exec -it mypod bash
# cd /etc/secrets/
# ls
password.txt username.txt
# cat username.txt
# cat password.txt
②將 Secret 導(dǎo)出到環(huán)境變量中調(diào)用
vim secret-test1.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod1
spec:
containers:
- name: nginx
image: nginx
env:
- name: TEST_USER
valueFrom:
secretKeyRef: #調(diào)用,此處調(diào)用的是kubectl get secret創(chuàng)建出來的mysecret1
name: mysecret1
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret1
key: password
kubectl apply -f secret-test1.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod1 1/1 Running 0 77s
kubectl exec -it mypod1 bash
# echo $TEST_USER
zhangsan
# echo $TEST_PASSWORD
abc1234
二.ConfigMap
1.ConfigMap概念
與Secret類似,區(qū)別在于configMap保存的是不需要加密配置的信息。
2.ConfigMap功能及應(yīng)用場(chǎng)景
(1)ConfigMap 功能在 Kubernetes1.2 版本中引入,許多應(yīng)用程序會(huì)從配置文件、命令行參數(shù)或環(huán)境變量中讀取配置信息。
ConfigMap API給我們提供了向容器中注入配置信息的機(jī)制,ConfigMap 可以被用來保存單個(gè)屬性,也可以用來保存整個(gè)配置文件或者JSON二進(jìn)制大對(duì)象。
(2)應(yīng)用場(chǎng)景: 應(yīng)用配置
配置文件可用這種形式(例如nginx.conf\apache等配置文件)
3.ConfigMap創(chuàng)建及案例
(1)創(chuàng)建ConfigMap
導(dǎo)入配置文件方式
#導(dǎo)入nginx.conf配置文件
kubectl create configmap nginx-config -h(不會(huì)后面的參數(shù)可以使用h)查看
kubectl create configmap nginx-config --from-file=nginx.conf
kubectl get cm
#可查看詳細(xì)數(shù)據(jù)
kubectl describe cm nginx-config
①使用目錄創(chuàng)建
mkdir /opt/configmap/
vim /opt/configmap/game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
vim /opt/configmap/ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
ls /opt/configmap/
game.properties
ui.properties
#--from-file 指定在目錄下的所有文件都會(huì)被用在 Con?gMap 里面創(chuàng)建一個(gè)鍵值對(duì),鍵的名字就是文件名,值就是文件的內(nèi)容
kubectl create configmap game-config --from-file=/opt/configmap/
kubectl get cm
NAME DATA AGE
game-config 2 10s
kubectl get cm game-config -o yaml
apiVersion: v1
data:
game.properties: |
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
kind: ConfigMap
metadata:
creationTimestamp: 2021-05-25T06:49:18Z
name: game-config
namespace: default
resourceVersion: "87803"
selfLink: /api/v1/namespaces/default/configmaps/game-config
uid: 541b5302-bd25-11eb-acba-000c29d88bba
②使用文件創(chuàng)建
只要指定為一個(gè)文件就可以從單個(gè)文件中創(chuàng)建 Con?gMap
–from-file 這個(gè)參數(shù)可以使用多次,即可以使用兩次分別指定上個(gè)實(shí)例中的那兩個(gè)配置文件,效果就跟指定整個(gè)目錄是一樣的
kubectl create configmap game-config-2 --from-file=/opt/configmap/game.properties --from-file=/opt/configmap/ui.properties
kubectl get configmaps game-config-2 -o yaml
kubectl describe cm game-config-2
③使用字面值創(chuàng)建
使用文字值創(chuàng)建,利用 --from-literal 參數(shù)傳遞配置信息,該參數(shù)可以使用多次,格式如下
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=good
kubectl get configmaps special-config -o yaml
apiVersion: v1
data:
special.how: very #key-value 結(jié)構(gòu)
special.type: good
kind: ConfigMap
metadata:
creationTimestamp: 2021-05-25T06:59:37Z
name: special-config
namespace: default
resourceVersion: "88610"
selfLink: /api/v1/namespaces/default/configmaps/special-config
uid: c4f45936-bd26-11eb-acba-000c29d88bba
kubectl delete cm --all
kubectl delete pod --all
- 例子:
vim index.html
<h1>this is blue</h1>
kubectl create cm web-blue --from-file=index.html
kubectl get cm
kubectl describe cm web-blue
調(diào)用方式
vim web-blue.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod-cm-web
labels:
run: myapp-cm-web
spec:
volumes:
- name: web-cm
configMap:
name: web-blue
containers:
- name: myapp-cm-web
image: soscscs/myapp:v1
ports:
- containerPort: 80
volumeMounts:
- name: web-cm
mountPath: /usr/share/nginx/html
kubectl apply -f web-blue.yaml
kubectl get pod
kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READI
mypod-cm-web 1/1 Running 0 99s 10.244.2.179 node01 <none> <none>
curl 10.244.2.179
<h1>this is blue</h1>
- 配置nginx文件持久化,(解決了重啟容器之后或者刪除再新建),配置文件持久化(可以做redis等服務(wù)都可做)
(2)Pod 中使用 ConfigMap
①使用 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
kubectl get cm
NAME DATA AGE
env-config 1 6s
special-config 2 6s
#Pod的創(chuàng)建
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
kubectl create -f test-pod.yaml
kubectl get pods
kubectl logs test-pod
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.0.0.1:443
HOSTNAME=pod-test
SHLVL=1
SPECIAL_HOW_KEY=very #賦值變量 SPECIAL_HOW_KEY 的值為 special-config 的 special.how: very
HOME=/root
SPECIAL_TYPE_KEY=good #賦值變量 SPECIAL_TYPE_KEY 的值為 special-config 的 special.type: good
KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
log_level=INFO #引入 env-config 的變量 log_level: INFO
KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.0.0.1
PWD=/
②用 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
kubectl get pods
NAME READY STATUS RESTARTS AGE
test-pod2 0/1 Completed 0 34s
kubectl logs test-pod2
very good
③通過數(shù)據(jù)卷插件使用Con?gMap
在數(shù)據(jù)卷里面使用 Con?gMap,就是將文件填入數(shù)據(jù)卷,在這個(gè)文件中,鍵就是文件名,鍵值就是文件內(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
kubectl create -f test-pod3.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
test-pod3 1/1 Running 0 5s
kubectl exec -it test-pod3 sh
# cd /etc/config/
# ls
special.how special.type
# cat special.how
# cat special.type
④Con?gMap 的熱更新
相關(guān)標(biāo)簽查看可用命令
kubectl api-resources
#Con?gMap 的熱更新(如果少加參數(shù)可以在外面直接熱更新)
vim test-pod4.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: log-config
namespace: default
data:
log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 1
selector:
matchLabels:
app: my-nginx
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: log-config
kubectl apply -f test-pod4.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-c6df7db54-2nxlq 1/1 Running 0 19s
kubectl exec -it my-nginx-c6df7db54-2nxlq -- cat /etc/config/log_level
#輸出結(jié)果為以下
INFO
kubectl edit configmap log-config
apiVersion: v1
data:
log_level: DEBUG #INFO 修改成 DEBUG
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"log_level":"DEBUG"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"log-config","namespace":"default"}} #INFO 修改成 DEBUG
creationTimestamp: "2023-09-26T13:44:58Z"
name: log-config
namespace: default
resourceVersion: "104437"
selfLink: /api/v1/namespaces/default/configmaps/log-config
uid: 56a3b170-eb69-428b-81cd-c54dd561cbee
#等大概10秒左右,使用該 ConfigMap 掛載的 Volume 中的數(shù)據(jù)同步更新
kubectl exec -it my-nginx-c6df7db54-2nxlq -- cat /etc/config/log_level
#輸出結(jié)果為以下
DEBUG
⑤ConfigMap 更新后滾動(dòng)更新 Pod
更新 ConfigMap 目前并不會(huì)觸發(fā)相關(guān) Pod 的滾動(dòng)更新,可以通過在 .spec.template.metadata.annotations 中添加 version/config ,每次通過修改 version/config 來觸發(fā)滾動(dòng)更新
#少加參數(shù)在外面直接熱更新
kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210525" }}}}}'
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-699bf56d57-9krp7 1/1 Running 0 8s
my-nginx-c6df7db54-2nxlq 0/1 Terminating 0 6m7s
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-699bf56d57-9krp7 1/1 Running 0 55s
PS:更新 ConfigMap 后:
●使用該 ConfigMap 掛載的 Env 不會(huì)同步更新。
●使用該 ConfigMap 掛載的 Volume 中的數(shù)據(jù)需要一段時(shí)間(實(shí)測(cè)大概10秒)才能同步更新。
總
1.secret三種類型
(1)Opaque:通用類型(通過文件、目錄、變量創(chuàng)建)——默認(rèn)的類型
(2)kubernetes.io/service-account-token:k8s自動(dòng)創(chuàng)建的,給serviceaccount服務(wù)賬戶(pod在K8S集群內(nèi)部的專屬服務(wù)用戶)訪問挨批server使用
(3)kubernetes.io/dockerconfigjson(docker-registry):給K8S從harbor私有鏡像倉儲(chǔ)拉取鏡像認(rèn)證使用
2.創(chuàng)建secret資源
(1)kubectl create secret generic --from-file=文件——指定文件,還可以多次使用指定多個(gè)文件目錄,應(yīng)用目錄中的所有文件
——from-literal-鍵值對(duì)(key-value)引用一個(gè)鍵值對(duì),也可以引用多次
(2)kubectl create secret tls --cert=證書文件
–key=私有文件
(3)kubectl create secret docker-registry
3.secret資源使用
(1)掛載的方式
volumes:定義類型為secret的存儲(chǔ)卷
volumeMounts:把存儲(chǔ)卷掛載到容器目錄,secret資源數(shù)據(jù)中的,鍵將以文件名的形式顯示,值為文件內(nèi)容
(2)容器的環(huán)境量的方式
env:定義容器的環(huán)境變量
使用value From,secretKeyRef,name指定secret資源名稱,valueFrom,secretKeyRef
,key指定secret資源數(shù)據(jù)的鍵名,從而確定引用哪個(gè)鍵的值
(3)K8s從harbor等私有倉庫拉取鏡像時(shí)使用
imagePull secret指定Kubernetes.io/dockerconfigjson類型的secret來作為連接私有倉庫的認(rèn)證信息
4.configMap cm
(1)創(chuàng)建 cm 資源
kubectl create cm --from-flie=文件/目錄
--from-literal=KEY=VALUE
#查看資源中的數(shù)據(jù)都是以明文的格式顯示key的值
kubectl describe cm 或者kubectl get cm -o yaml
(2)cm資源使用
容器環(huán)境變量的方式
env:需要另外自定義環(huán)境變量名,通過指定的cm資源名稱和key,名稱來給這個(gè)變量來賦值
envFrom:不需要另外自定義環(huán)境變量名,直接是要cm資源的key作為容器中的環(huán)境變量名,value作為這個(gè)環(huán)境變量的值。z
(3)掛載的方式
volume 定義類型,configMap的存儲(chǔ)卷
volumeMounts:把存儲(chǔ)卷掛載到容器目錄,cm資源數(shù)據(jù)中的鍵將以文件名的形式顯示,值為文件內(nèi)容,如果把存儲(chǔ)卷掛載成容器中的文件,subPath指定文件名
(4)cm資源熱更新
更新,資源的數(shù)據(jù),可以同步更新,通過volume掛載的使用cm配置的pod資源中的配置,如果使用env或envFrom方式引用cm資源,則不會(huì)同步更新pod資源中的配置
(5)secret概念
保存密碼,密鑰文件,token字符串之類的敏感數(shù)據(jù)
通過kubectl describe 或者kubectl get -oyaml查看是看不到實(shí)際的內(nèi)容,內(nèi)容是通過bases 64編碼格式
(6)configMap概念文章來源:http://www.zghlxwxcb.cn/news/detail-775519.html
保存配置文件,環(huán)境變量,命令行參數(shù)之類的不需要加密的信息,查看時(shí)是以明文的顯示內(nèi)容,他們的數(shù)據(jù)都是以 鍵值對(duì) 的方式保存。文章來源地址http://www.zghlxwxcb.cn/news/detail-775519.html
到了這里,關(guān)于K8S:配置資源管理 Secret和configMap的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!