一、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 拉取鏡像時使用。
應(yīng)用場景:
Secrets | KubernetesA Secret is an object that contains a small amount of sensitive data such as a password, a token, or a key. Such information might otherwise be put in a Pod specification or in a container image. Using a Secret means that you don't need to include confidential data in your application code.Because Secrets can be created independently of the Pods that use them, there is less risk of the Secret (and its data) being exposed during the workflow of creating, viewing, and editing Pods.https://kubernetes.io/docs/concepts/configuration/secret/
?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即可):
二、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/cm/
//--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/cm/game.config --from-file=/opt/cm/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
kubectl create -f test-pod.yaml
kubectl get pods
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
kubectl create -f test-pod3.yaml
kubectl get pods
?
比如:我想通過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的熱更新?
#創(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秒)才能同步更新。?
總結(jié)?
ConfigMap資源(簡稱cm) ? ?用于保存配置文件、環(huán)境變量等不需要加密的信息。它可以實(shí)現(xiàn)將配置信息與應(yīng)用程序解耦
創(chuàng)建cm資源
kubectl create cm <資源名稱> --from-file=文件|目錄 ?--from-literal=<鍵名>=<鍵值>查看cm資源數(shù)據(jù)
kubectl get -n <命名空間> cm <cm資源名稱> -o yaml
kubectl describe -n <命名空間> cm <cm資源名稱>使用cm資源
作為存儲卷掛載的方式:
在Pod資源配置中用spec.volumes字段設(shè)置configMap類型的卷
在容器配置中用volumeMounts將卷掛載到容器的指定的目錄,cm資源數(shù)據(jù)的鍵名會作為文件名,cm資源數(shù)據(jù)的鍵值會作為文件內(nèi)容(支持熱更新)
在容器配置中用volumeMounts.subPath字段指定文件名,實(shí)現(xiàn)將卷掛載到容器中指定的文件上(不支持熱更新)作為容器環(huán)境變量的方式:(不支持熱更新)
在容器配置中用env.name字段自定義容器的環(huán)境變量名,用env.valueFrom.configMapKeyRef.key/name字段指定環(huán)境變量的值從哪個cm資源的鍵獲取
在容器配置中用envFrom.configMapRef.name字段指定cm資源的名稱,使得cm資源數(shù)據(jù)的鍵名和鍵值直接作為容器的環(huán)境變量名和值
Secret資源 ? ? 用于保存密碼文件、ssl證書/私鑰文件、token令牌字符串、鏡像私有倉庫認(rèn)證信息等需要加密的敏感信息
Secrets的主要目的是將敏感數(shù)據(jù)與應(yīng)用程序代碼分離,并提供一種安全的方式來存儲和傳遞這些敏感數(shù)據(jù)給容器化的應(yīng)用程序。它們以加密的形式保存,并且只能在需要時才能被解密和使用。Secret的4種類型:
Opaque:默認(rèn)的Secret資源類型,可以通過選項(xiàng)引用文件、目錄、鍵值對的方式創(chuàng)建Secret資源,并且資源數(shù)據(jù)的鍵值會被自動轉(zhuǎn)換為base64編碼格式加密
kubernetes.io/service-account-token:當(dāng)創(chuàng)建serviceaccout賬戶資源后K8S會自動創(chuàng)建同名的Secert資源,用于Pod訪問apiserver時會使用此Secret卷中的token做認(rèn)證
kubernetes.io/dockerconfigjson:用于存儲K8S從Harbor等鏡像私有倉庫拉取鏡像時做認(rèn)證的信息
kubernetes.io/tls:用于存儲tls/ssl證書和私鑰文件的信息創(chuàng)建Secret資源
kubectl create secret generic <資源名稱> --from-file=文件|目錄 ?--from-literal=<鍵名>=<鍵值>
kubectl create secret docker-registry <資源名稱> --docker-server=<私有倉庫URL路徑> --docker-username=<倉庫用戶名> --docker-password=<用戶密碼> --docker-email=<郵箱地址>
kubectl create secret tls <資源名稱> --cert=證書文件 --key=私鑰文件查看Secret資源(鍵值會以base64編碼格式加密顯示)
kubectl get -n <命名空間> secret <Secret資源名稱> -o yaml
kubectl describe -n <命名空間> secret <Secret資源名稱>使用Secret資源
作為存儲卷掛載的方式:
在Pod資源配置中用spec.volumes字段設(shè)置secret類型的卷
在容器配置中用volumeMounts將卷掛載到容器的指定的目錄,Secret資源數(shù)據(jù)的鍵名會作為文件名,Secret資源數(shù)據(jù)的鍵值會作為文件內(nèi)容作為容器環(huán)境變量的方式:
在容器配置中用env.name字段自定義容器的環(huán)境變量名,用env.valueFrom.secretKeyRef.key/name字段指定環(huán)境變量的值從哪個Secret資源的鍵獲取
在容器配置中用envFrom.secretRef.name字段指定Secret資源的名稱,使得Secret資源數(shù)據(jù)的鍵名和鍵值直接作為容器的環(huán)境變量名和值文章來源:http://www.zghlxwxcb.cn/news/detail-839224.htmlPod配置從私有倉庫拉取鏡像:
在Pod資源配置中用spec.imagePullSecrets.name字段指定kubernetes.io/dockerconfigjson類型的Secret資源名稱文章來源地址http://www.zghlxwxcb.cn/news/detail-839224.html
到了這里,關(guān)于[云原生] k8s配置資源管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!