配置資源管理
ConfigMap資源(簡稱給cm)
用於儲存配置檔案,環境變數等不需要加密的資訊。它可以實現將配置資訊與應用程式解耦
kubectl run pod-demo --image=soscscs/myapp --port=80 --dry-run=client -o yaml > pod-demo.yaml
kubectl create cm cm-demo1 --from-file=./hanbao.txt --from-file=./index.html --from-literal=myname=hanbao
apiVersion: v1 kind: Pod metadata: labels: run: pod-demo1 name: pod-demo1 spec: volumes: - name: vol-cm configMap: name: cm-demo1 containers: - image: soscscs/myapp:v1 name: pod-demo ports: - containerPort: 80 volumeMounts: - name: vol-cm mountPath: /var/www/html resources: {} dnsPolicy: ClusterFirst restartPolicy: Always status: {}
#實現動態更新(熱更新)
Pod 中使用 ConfigMap
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
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
透過資料卷外掛使用ConfigMap
在資料卷裡面使用 ConfigMap,就是將檔案填入資料卷,在這個檔案中,鍵就是檔名,鍵值就是檔案內容
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
Secret
Secret 是用來儲存密碼、token、金鑰等敏感資料的 k8s 資源,這類資料雖然也可以存放在 Pod 或者映象中,但是放在 Secret 中是為了更方便的控制如何使用資料,並減少暴露的風險。 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 證書和私鑰資訊。 Pod 需要先引用才能使用某個 secret,Pod 有 3 種方式來使用 secret: ●作為掛載到一個或多個容器上的卷 中的檔案。 ●作為容器的環境變數。 ●由 kubelet 在為 Pod 拉取映象時使用。 應用場景:憑據 https://kubernetes.io/docs/concepts/configuration/secret/
kubectl create secret generic mysecret --from-file=username.txt --from-file=password.txt
kubectl describe secret mysecret
內容用 base64 編碼,建立Secret
echo -n zhangsan | base64
echo -n abc1234 | base64
apiVersion: v1 kind: Secret metadata: name: mysecret1 type: Opaque data: username: emhhbmdzYW4= password: YWJjMTIzNA==
使用方式
將 Secret 掛載到 Volume 中,以 Volume 的形式掛載到 Pod 的某個目錄下
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
將 Secret 匯出到環境變數中
apiVersion: v1 kind: Pod metadata: name: mypod1 spec: containers: - name: nginx image: nginx env: - name: TEST_USER valueFrom: secretKeyRef: name: mysecret1 key: username - name: TEST_PASSWORD valueFrom: secretKeyRef: name: mysecret1 key: password envFrom: - secretRef: name: mysecret1
總結
ConfigMap資源(簡稱給cm): #用於儲存配置檔案,環境變數等不需要加密的資訊。它可以實現將配置資訊與應用程式解耦 #建立cm資源 kubectl create cm <資源名稱> --from-file=檔案|目錄 --from-literal=<鍵名>=<鍵值> #檢視cm資源資料 kubectl get -n <名稱空間> cm <cm資源名稱> -o yaml kubectl describe -n <名稱空間> cm <cm資源名稱> #使用cm資源 作為儲存卷掛載的方式: 在Pod資源配置中spec.volumes欄位設定configMap型別的卷 在容器配置中用volumeMounts將卷掛載到容器的指定的目錄,cm資源資料的鍵名會作為檔名,cm資源資料的鍵值會作為檔案內容(支援熱更新) 在容器中用volumeMounts.subFath欄位指定檔名,實現將卷掛載到容器中指定的檔案上(不支援熱更新) --以檔案形式掛載 作為容器環境變數方式(不支援熱更新) 在容器配置中用env.name欄位自定義容器的環境變數名,用env.valueFrom.configMapKeyRef.key/name欄位指定環境變數的值從哪個cm資源的鍵獲取 在容器配置中用envFrom.configMapRef.name欄位指定cm資源的名稱,使得cm資源資料的鍵名和鍵值直接作為容器的環境變數名和值 -------------------------------------- Secret資源 #用於儲存密碼檔案、ssl證書/私鑰檔案、token令牌字串、映象私有倉庫認證資訊等需要加密的敏感資訊 Secret的主要目的是將民昂資料與應用程式程式碼分離,提供一種安全的方式來儲存和傳遞這些敏感資料給容器化的應用程式。它們已加密的形式儲存,並且只能在需要時才能被解密和使用 #Secret的4種型別: kubernetes.io/service-account-token: 當建立serviceaccount賬戶資源後K8S會自動建立同名的secert資源,用於Pod訪問apiserver時會使用此Secret卷中的token做認證 Opaque: 預設的Secret資源型別,可以透過選項引用檔案、目錄、鍵值隊的方式建立Secret資源,並且資源資料的鍵值會被自動轉換為base64編碼格式加密 kubernetes.io/dockerconfigjson: 使用者儲存K8S從Harbor等映象私有倉庫拉取映象時做認證的資訊 #建立Secret資源 kubectl create secret generic <資源名稱> --from-file=檔案|目錄 --from-literal=<鍵名>=<鍵值> kubectl create secret docker-registry secret-harbor -dockear-server=<私有倉庫URL路徑> --docker-username=<倉庫使用者名稱> --docker-pasword-<使用者密碼> --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欄位設定secret型別的卷 在容器配置中用volumeMounts將卷掛載到容器的指定的目錄,secret資源資料的鍵名會作為檔名,secret資源資料的鍵值會作為檔案內容 #作為容器環境變數的方式: 在容器配置中用env.name欄位自定義容器的環境變數名,用env.volueFrom.secretKeyRef.key/name欄位指定環境變數的值從哪個Secret資源的鍵獲取 在容器配置中用envFrom.secretRef.name欄位指定secret資源的名稱,使得secret資源資料的鍵名和鍵值直接作為容器的環境變數名和值 #Pod配置從私有倉庫拉取映象: 在Pod資源配置中用spec,imagePullsecrets.name欄位指定kubernetes.io/dockerconfigjson型別的secret資源名稱