一、Secret的資源配置
1.1?Secret配置的相關說明
????????Secret 是用來保存密碼、token、密鑰等敏感數據的 k8s 資源,這類數據雖然也可以存放在 Pod 或者鏡像中,但是放在 Secret 中是為了更方便的控制如何使用數據,并減少暴露的風險。
有四種類型:
●kubernetes.io/service-account-token:由 Kubernetes 自動創建,用來訪問 APIServer 的 Secret,Pod 會默認使用這個 Secret 與 APIServer 通信, 并且會自動掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中;
●Opaque :base64 編碼格式的 Secret,用來存儲用戶自定義的密碼、密鑰等,默認的 Secret 類型;
●kubernetes.io/dockerconfigjson :用來存儲私有 docker registry 的認證信息。
●kubernetes.io/tls:用于存儲TLS證書和私鑰,通常用于Ingress控制器或其他需要TLS加密通信的服務。
Pod 需要先引用才能使用某個 secret,Pod 有 3 種方式來使用 secret:
●作為掛載到一個或多個容器上的卷 中的文件。
●作為容器的環境變量。
●由 kubelet 在為 Pod 拉取鏡像時使用。
應用場景:憑據??Secret | Kubernetes
1.2?陳述式創建 Secret配置
????????Secret 的創建是根據文件中保存到相應信息 進行。例如我們要通過一個用戶名文件和密碼文件來創建具體的Secret資源配置。
#首先準備好相對應的用戶和密碼文件
#echo 中 “-n” 選項為不換行
echo -n 'limahua' > username.txt
echo -n 'qq666' > passwd.txt
用kubectl create secret命令創建Secret
kubectl create secret generic mysecret --from-file=username.txt --from-file=passwd.txt
kubectl describe secrets mysecret
1.3?聲明式 + base64編碼 創建Secret
echo limahua | base64
echo qq666 | base64
通過管道符base64 將明文進行轉碼
編寫yaml文件
vim secret01.yamlapiVersion: v1
kind: Secret #表明資源的類型為Secret,用于存儲敏感信息
metadata:name: my-secret1
type: Opaque # base64 進行轉碼信息保護
data: #定義secret的配置信息username: bGltYWh1YQo= #Base64編碼后的用戶名password: cXE2NjYK #Base64編碼后的密碼kubectl apply -f secret01.yaml
1.4?將secret 以volume形式掛載到pod中
創建一個pod模板,對其進行修改編輯
kubectl run nginx-secret --image=nginx:1.18 --port=80 --dry-run=client -o yaml > ng-secret.yamlvim ng-secret.yamlapiVersion: v1
kind: Pod
metadata:labels:run: nginx-secretname: nginx-secret
spec:containers:- image: nginx:1.18name: nginx-secretports:- containerPort: 80volumeMounts:- name: secrets #引用一個卷(volume)的名稱,該卷在此容器內掛載mountPath: "/etc/secret" #指定容器內掛載的路徑readOnly: true #只讀volumes:- name: secrets #卷的名稱,與上述容器中引用的卷名對應secret:secretName: mysecret #指定了此卷的數據來源是一個名為mysecret的Secret對象Kubernetes會自動將mysecret Secret中的數據掛載到指定的/etc/secret路徑下,
所有數據都是以文件形式存在且根據Secret的原始內容Base64解碼。kubectl apply -f ng-secret.yaml
1.5?將Secret導入到pod中,充當環境變量
復制上一個模板,進行修改編輯
cp ng-secret.yaml env-secret.yaml進行編輯修改
vim env-secret.yamlapiVersion: v1
kind: Pod
metadata:labels:run: nginx-secret2name: nginx-secret2
spec:containers:- image: nginx:1.18name: nginx-secret2ports:- containerPort: 80env: #定義了環境變量- name: THIS_USER #環境變量從名為my-secret1的Secret中通過鍵username獲取值volumeFrom:secretKeyRef:name: my-secret1key: username- name: THIS_PASSWORD #環境變量同樣從my-secret1 Secret中通過鍵password獲取值volumeFrom:secretKeyRef:name: my-secret1key: passwordkubectl apply -f env-secret.yaml
1.6?實戰運用:使用secret配置免密交互拉取habor私有倉庫鏡像
harbor倉庫的搭建詳見:kubeadm 部署k8s集群-CSDN博客
在pod詳解里有
????????我們在搭建好docker的私有倉庫后,在使用私有倉庫時需要通過docker login指令來登錄到私有倉庫中。
????????但同時在使用的過程中也會把habor倉庫的用戶名和密碼暴露在命令行中,存在一定的安全隱患。k8s中的secret配置的運用能夠實現并且規避這一問題的存在
?進行私有倉庫的secret資源創建
#私有倉庫的secret配置
kubectl create secret docker-registry myharbor --docker-server=hub.benet.com --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@qq.com
引用secret資源拉取私有倉庫鏡像創建pod
vim harbor-nginx.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: myapp-nginx
spec:replicas: 3selector:matchLabels:app: myapp-nginxtemplate:metadata:labels:app: myapp-nginxspec:containers:- name: myapp-containerimage: hub.benet.com/library/nginx:v1
#從私有 Docker registry hub.benet.com 中拉取 library/nginx 鏡像的 v1 版本imagePullSecrets: #定義了用于拉取私有 Docker registry 鏡像所需的 Secret- name: myharbor
#指定了一個 Secret 的名稱,這里為 myharbor,這意味著 Kubernetes 在拉取私有 Docker registry 的
鏡像時,將使用 myharbor Secret 中的認證信息kubectl apply -f harbor-nginx.yaml
以下是實驗沒有結果可能存在的問題:
注意以上配置完成后要重啟docker 加載該配置。
另一種方法:
---------- 部署 harbor 創建私有項目 ----------
//在 Docker harbor 節點(192.168.80.13)上操作
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl start docker.service
systemctl enable docker.service
docker version//上傳 docker-compose 和 harbor-offline-installer-v1.2.2.tgz 到 /opt 目錄中
cd /opt
chmod +x docker-compose
mv docker-compose /usr/local/bin///部署 Harbor 服務
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
vim /usr/local/harbor/harbor.cfg
--5行--修改,設置為Harbor服務器的IP地址或者域名
hostname = 192.168.80.13cd /usr/local/harbor/
./install.sh//在 Harbor 中創建一個新項目
(1)瀏覽器訪問:http://192.168.80.13 登錄 Harbor WEB UI 界面,默認的管理員用戶名和密碼是 admin/Harbor12345
(2)輸入用戶名和密碼登錄界面后可以創建一個新項目。點擊“+項目”按鈕
(3)填寫項目名稱為“kgc-project”,點擊“確定”按鈕,創建新項目//在每個 node 節點配置連接私有倉庫(注意每行后面的逗號要添加)
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"insecure-registries":["192.168.80.13"]
}
EOFsystemctl daemon-reload
systemctl restart docker//在每個 node 節點登錄 harbor 私有倉庫
docker login -u admin -p harbor12345 http://192.168.80.13//在一個 node 節點下載 Tomcat 鏡像進行推送
docker pull tomcat:8.0.52
docker imagesdocker tag tomcat:8.0.52 192.168.80.13/kgc-project/tomcat:v1
docker imagesdocker push 192.168.80.13/kgc-project/tomcat:v1//查看登陸憑據
cat /root/.docker/config.json | base64 -w 0 #base64 -w 0:進行 base64 加密并禁止自動換行
ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5NS44MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy41IChsaW51eCkiCgl9Cn0=//創建 harbor 登錄憑據資源清單,用于 K8S 訪問 Harbor 私服拉取鏡像所需要的密鑰權限憑證 secret 資源
vim harbor-pull-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: harbor-pull-secret
data:.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5NS44MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy41IChsaW51eCkiCgl9Cn0= #復制粘貼上述查看的登陸憑據
type: kubernetes.io/dockerconfigjson//創建 secret 資源
kubectl create -f harbor-pull-secret.yaml//查看 secret 資源
kubectl get secret//創建資源從 harbor 中下載鏡像
cd /opt/demo
vim tomcat-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: my-tomcat
spec:replicas: 2selector:matchLabels:app: my-tomcattemplate:metadata:labels:app: my-tomcatspec:imagePullSecrets: #添加 K8S 訪問 Harbor 私服拉取鏡像所需要的 secret 資源選項- name: harbor-pull-secret #指定 secret 資源名稱containers:- name: my-tomcatimage: 192.168.80.13/kgc-project/tomcat:v1 #指定 harbor 中的鏡像名ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: my-tomcat
spec:type: NodePortports:- port: 8080targetPort: 8080nodePort: 31111selector:app: my-tomcat//刪除之前在 node 節點下載的 Tomcat 鏡像
docker rmi tomcat:8.0.52
docker rmi 192.168.80.13/kgc-project/tomcat:v1
docker images//創建資源
kubectl create -f tomcat-deployment.yamlkubectl get pods
NAME READY STATUS RESTARTS AGE
my-tomcat-d55b94fd-29qk2 1/1 Running 0
my-tomcat-d55b94fd-9j42r 1/1 Running 0 //查看 Pod 的描述信息,可以發現鏡像時從 harbor 下載的
kubectl describe pod my-tomcat-d55b94fd-29qk2//刷新 harbor 頁面,可以看到鏡像的下載次數增加了
二、ConfigMap資源配置
與Secret類似,區別在于ConfigMap保存的是不需要加密配置的信息。
????????ConfigMap 功能在 Kubernetes1.2 版本中引入,許多應用程序會從配置文件、命令行參數或環境變量中讀取配置信息。Con?gMap API 給我們提供了向容器中注入配置信息的機制,Con?gMap 可以被用來保存單個屬性,也可以用來保存整個配置文件或者JSON二進制大對象。
應用場景:應用配置
2.1?使用目錄來創建configMap資源
?創建一個目錄并且在一個目錄中填寫兩個文件:
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=30vim /opt/configmap/ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
kubectl create configmap game-config --from-file=/opt/configmap/
//--from-file 指定在目錄下的所有文件都會被用在 Con?gMap 里面創建一個鍵值對,鍵的名字就是文件名,值就是文件的內容
2.2?使用文件創建configMap資源
只要指定為一個文件就可以從單個文件中創建 Con?gMap
--from-file 這個參數可以使用多次,即可以使用兩次分別指定上個實例中的那兩個配置文件,效果就跟指定整個目錄是一樣的
kubectl create configmap game-config-2 --from-file=/opt/configmap/game.properties --from-file=/opt/configmap/ui.properties
2.3?直接使用參數創建confidenceMap資源
使用字面值創建
使用文字值創建,利用 --from-literal 參數傳遞配置信息,該參數可以使用多次,格式如下
kubectl create configmap special-config --from-literal=name=huhu --from-literal=hobby=play
這里的--from-literal 后跟 key=value
2.4?pod利用configMap資源
(1)?使用 Con?gMap 來替代環境變量
vim env.yamlapiVersion: v1
kind: ConfigMap
metadata:name: special-config1namespace: default
data:special.how: very #這里定義了一些configMap的配置資源special.type: good #這里定義了一些configMap的配置資源
---
apiVersion: v1
kind: ConfigMap
metadata:name: env-config1namespace: default
data:log_level: INFO #這里定義了一些configMap的配置資源kubectl apply -f env.yaml
(2) 創建pod,并且引用configMap資源
vim test-pod.yamlapiVersion: v1
kind: Pod
metadata:name: test-pod
spec:containers:- name: busyboximage: busybox:1.28.4command: [ "/bin/sh", "-c", "env" ]#容器啟動時執行的命令,這里運行env命令來打印環境變量。env:- name: SPECIAL_HOW_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.how#從名為special-config1的ConfigMap中通過鍵special.how獲取值,并設置為環境變量。- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.type#同樣從special-config1 ConfigMap中通過鍵special.type獲取值設置為環境變量。envFrom:- configMapRef:name: env-config1#從名為env-config1的ConfigMap中批量導入所有鍵值對作為環境變量。restartPolicy: Neverkubectl create -f test-pod.yaml
2.5?使用 ConfigMap 設置命令行參數
vim test-pod2.yamlapiVersion: v1
kind: Pod
metadata:name: test-pod2
spec:containers:- name: busyboximage: busybox:1.28.4command: - /bin/sh- -c- echo "$(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)"
#與上一個配置文件相同這里把configMap中配置設置為pod中環境變量 再用echo將其輸出env:- name: SPECIAL_HOW_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.how- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.typeenvFrom:- configMapRef:name: env-config1restartPolicy: Neverkubectl create -f test-pod2.yaml
2.6?通過數據卷插件使用Con?gMap
????????在數據卷里面使用 Con?gMap,就是將文件填入數據卷,在這個文件中,鍵就是文件名,鍵值就是文件內容
vim test-pod3.yamlapiVersion: v1
kind: Pod
metadata:name: test-pod3
spec:containers:- name: busyboximage: busybox:1.28.4command: [ "/bin/sh", "-c", "sleep 36000" ]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: special-config1restartPolicy: Neverkubectl create -f test-pod3.yaml
我想通過configMap實現單獨掛載pod中的nginx.conf配置
#首先獲取nginx.conf 下載或則之前保存都可以
# nginx.conf 配置文件在/opt/benet/目錄 下
kubectl create cm my-nginx --from-file=/opt/benet
vim pod-nginx1.yaml
apiVersion: v1
kind: Pod
metadata:name: mypod1
spec:volumes:- name: nginxconfigMap: #指定卷數據來源于 ConfigMapname: my-nginx #具體指定了 ConfigMap 的名稱containers:- image: nginx:1.18name: nginxvolumeMounts:- name: nginxmountPath: /etc/nginx/nginx.confsubPath: nginx.conf #subPath 可以實現只覆蓋修改該文件,而不影響目錄如果不加subPath,你掛載到容器內的目錄中其它文件將被覆蓋。且如果configMap有其它鍵值也會被一起掛載。kubectl apply -f pod-nginx1.yaml
2.7 configMap 的熱更新
#創建一個cm資源
kubectl create configmap name-hobby --from-literal=hobby=fly#創建一個pod,并且通過volume的方式掛載configMap中的name-config
vim pod-demo5.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: namepod1name: namepod1
spec:replicas: 1selector:matchLabels:app: namepod1template:metadata:labels:app: namepod1spec:volumes:- name: pod-testconfigMap:name: name-hobbycontainers:- image: nginx:1.18name: mypodvolumeMounts:- name: pod-testmountPath: /opt/
開啟另一個終端進行實時修改:
kubectl edit cm name-hobby
等大概一分鐘左右,使用該 ConfigMap 掛載的 Volume 中的數據同步更新
ConfigMap 更新后滾動更新 Pod
????????更新 ConfigMap 目前并不會觸發相關 Pod 的滾動更新,可以通過在 .spec.template.metadata.annotations 中添加 version/config ,每次通過修改 version/config 來觸發滾動更新
kubectl patch deployment namepod1 --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20240603" }}}}}'
PS:更新 ConfigMap 后:
●使用該 ConfigMap 掛載的 Env 不會同步更新。
●使用該 ConfigMap 掛載的 Volume 中的數據需要一段時間(實測大概10秒)才能同步更新。
總結
使用 Secret 資源
掛載的方式
在 pod.spec.volumes 字段中定義卷類型為 secret
在 pod.spec.containers.volumeMounts 字段中把存儲卷掛載到指定的容器目錄,secret資源數據的key將
以文件名的形式存在,value為文件內容容器環境變量引用的方式
在 pod.spec.containers.env.name 字段中自定義容器的環境變量名
在.containers.env.valueFrom.secretKeyRef.name字段中指定secret資源的名
稱,.containers.env.valueFrom.secretKeyRef.key字段中指定這個secret資源數據的key,
從而確定引用那個secret資源的key的value作為這個環境變量的值在 .containers.envFrom.secretRef.name 字段中指定secret資源的名稱,可實現使用secret資源數據的
key作為容器環境變量名,value作為這個環境變量的值K8S從私有倉庫拉取鏡像時使用
在 pod.spec.imagePullSecrets 字段中指定 kubernetes.io/dockerconfigjson 類型的 secret 資源來
作為連接私有倉庫的認證信息ConfigMap 簡稱 cm ,保存配置文件 環境變量 命令行參數 之類的不需要加密的信息
創建 cm 資源
kubectl create cm XXX --from-file=文件/目錄 --from-literal=變量的鍵值對(key=value)查看cm資源的數據,數據以明文格式顯示key的value
kubectl describe cm XXX 或 kubectl get cm XXX -o yaml使用 cm 資源
容器環境變量引用的方式
env 指定自定義的環境變量名,通過指定的cm資源名稱和key來給這個變量賦值
envFrom 直接使用cm資源的key作為容器的環境變量名,key的value作為這個變量的值掛載的方式
volumes 定義卷類型為 configMap ,使用 items 字段可以自定義掛載的文件的子目錄和文件名
volumeMounts 把卷掛載到容器目錄。cm資源數據中的key以文件名的形式存在,value為文件內容 使用 subPath 指定文件名,實現只把卷掛載到指定的文件名上cm資源熱更新
更新cm資源的數據可以同步更新通過掛載的方式使用cm資源數據的Pod中的配置(注:使用subPath掛載的文件
不會更新)
如果使用env或envFrom引用環境變量的方式,是不會同步更新Pod中的配置