- ConfigMap
- 創建ConfigMap物件
- 基于字面值創建
- 基于檔案創建
- 基于目錄創建
- 使用配置清單創建
- 通過環境變數傳遞ConfigMap資料
- envFrom
- 通過ConfigMap存盤卷傳遞資料
- 掛載整個存盤卷
- 掛載存盤卷中的部分鍵值
- 創建ConfigMap物件
- Secret
- 創建Secret資源
- 命令式創建
- 基于配置清單創建
- Secret存盤卷
- imagePullSecret資源物件
- 創建Secret資源
ConfigMap和Secret是Kubernetes系統上兩種特殊型別的存盤卷,ConfigMap物件用于為容器中的應用提供配置資料,Secret物件則用于提供密鑰、證書等敏感的配置資訊,它們將相應的配置資訊保存于物件中,而后在Pod資源上以存盤卷的形式將其掛載并獲取相關的配置,以實作配置與鏡像檔案的解耦,
ConfigMap
配置本身源于代碼,是為了提高代碼的靈活性而提取出來的一些經常變化的或需要定制的內容,已有一些開源的分布式系統配置管理系統如Apollo、Diamond、Disconf等,ConfigMap則是Kubernetes提供的統一配置管理方案,一個ConfigMap物件就是一系列配置資料的集合,這些資料可“注入”到Pod物件中,并為容器應用所使用,注入方式有兩種
- 掛載為存盤卷
- 傳遞為環境變數
創建ConfigMap物件
ConfigMap物件將配置資料以鍵值對的形式進行存盤,可以使用kubectl create命令創建
kubectl create configmap <map-name> <data-source>
map-name為ConfigMap物件的名稱,而data-source是資料源,它可以通過這幾種方式來獲取
- 字面值
- 檔案
- 目錄
- 配置清單
無論采用哪一種方式,都要被轉換為ConfigMap物件中的Key-Value資料,
基于字面值創建
使用--from-literal選項可在命令列直接提供鍵值對:
kubectl create configmap literal-config --from-literal=key1=value1
創建后可以使用kubectl get configmaps dir-config -o yaml命令查看,
基于檔案創建
基于檔案創建時要使用--from-file選項:
kubectl create configmap file-config --from-file=8_config_file.txt
這種方式創建的ConfigMap物件,其資料存盤的鍵為檔案名,值為檔案內容
apiVersion: v1
data:
8_config_file.txt: |-
test
config
from
file
kind: ConfigMap
自定義鍵名的方式:
kubectl create configmap file-config --from-file=file-key1=8_config_file.txt
基于目錄創建
使用--from-file選項時,如果指定的是檔案目錄,kubectl會將目錄下的檔案分別創建為鍵值資料,
kubectl create configmap dir-config --from-file=.
使用配置清單創建
配置清單需要指定apiVersion、kind、metadata、data欄位,data欄位用于存盤鍵值資料:
apiVersion: v1
kind: ConfigMap
metadata:
name: yaml-config
data:
key1: value1
key2: value2
通過環境變數傳遞ConfigMap資料
ConfigMap是名稱空間級別的資源,它必須與參考它的Pod資源在同一空間中;
通過環境變數傳遞ConfigMap的格式為:
env:
- name: <env-name>
valueFrom:
configMapKeyRef:
name: <configmap-name>
key: <key-name>
optional: <bool>
如果optional指定為false,則創建參考了ConfigMap資源的Pod物件時,被參考的資源必須事先存在,否則將無法啟動容器,直到被依賴的資源創建完成為止,
示例:
apiVersion: v1
kind: Pod
metadata:
name: env-test-pod
labels:
app: label-env-test-pod
spec:
containers:
- name: env-test-container
image: busybox
command: ["/bin/sh", "-c", "env"]
env:
- name: MY_KEY1
valueFrom:
configMapKeyRef:
name: yaml-config
key: key3
optional: true
- name: MY_KEY2
valueFrom:
configMapKeyRef:
name: yaml-config
key: key4
optional: true
envFrom
有時容器需要參考很多ConfigMap資源中的鍵值資料,這種情況下如果為容器逐一配置環境變數會非常繁瑣,而且不好維護,使用envFrom欄位可以直接將ConfigMap資源中的所有鍵值一次性匯入,格式為:
envFrom:
- prefix: <prefix>
configMapRef:
name: <configmap-name>
optional: <bool>
通過ConfigMap存盤卷傳遞資料
如果在ConfigMap中的值體積較大,比如存放的是給容器應用提供的組態檔,那么使用環境變數將其匯入會使得變數值占據過多的記憶體空間而且不易處理,這時建議通過ConfigMap存盤卷的方式可以將內容直接作為檔案進行參考,
掛載整個存盤卷
關聯為Pod資源的存盤卷時,ConfigMap物件中的每個鍵都對應地表現為一個檔案,鍵名為檔案名
apiVersion: v1
kind: Pod
metadata:
name: configmap-vol
labels:
app: configmap-vol
spec:
containers:
- name: configmap-vol
image: busybox
command: ["/bin/sh", "-c", "sleep 3600"]
volumeMounts:
- name: config-vol
mountPath: /etc/test
readOnly: true
volumes:
- name: config-vol
configMap:
name: file-config
掛載后可以將鍵名作為檔案名來查看內容:
kubectl exec configmap-vol -- cat /etc/test/file-key1
掛載存盤卷中的部分鍵值
有時并不希望掛載ConfigMap中的所有內容,可以只掛載存盤卷中的部分鍵值,
格式為:
volumes:
- name: config-vol
configMap:
name: file-config
items:
- key: file-key1
path: file-key1
Secret
Secret資源的功能類似于ConfigMap,但它專用于存放敏感資料,例如密碼、數字證書、私鑰、令牌和SSH key等,
與ConfigMap類似,Secret以鍵值方式存盤資料,在Pod資源中通過環境變數或存盤卷進行資料訪問,
Secret物件的資料的存盤及列印格式為Base64編碼的字串,在容器中以環境變數或存盤卷的方式訪問時,它們會被自動解碼為明文格式,
Secret物件主要有兩種用途:
- 作為存盤卷注入到Pod上由容器應用程式所使用
- 用于kubelet為Pod里的容器拉取鏡像時向私有倉庫提供認證資訊
Secret資源分為四種型別:
- Opaque:自定義資料內容;base64編碼,用來存盤密碼、密鑰、資訊、證書等資料,型別識別符號為generic,?
- kubernetes.io/service-account-token:Service Account的認證資訊,可在創建Service Accout時由Kubernetes自動創建,?
- kubernetes.io/dockerconfigjson:用來存盤Docker鏡像倉庫的認證資訊,型別標識為docker-registry,?
- kubernetes.io/tls:用于為SSL通信模式存盤證書和私鑰檔案,命令式創建時型別標識為tls,
創建Secret資源
命令式創建
直接使用字面值創建:
kubectl create secret generic mysql-auth --from-literal=username=root --from-literal=password=password1
查看base64編碼后的內容:
? kubectl get secret mysql-auth -o yaml
apiVersion: v1
data:
password: cGFzc3dvcmQx
username: cm9vdA==
使用generic標識創建的Secret為Opaque型別,下面的示例使用了tls標識來創建tls型別的Secret:
kubectl create secret tls nginx-ssl --key=./nginx.key --cert=./nginx.crt
創建成功后名稱固定為tls.key和tls.crt,不受證書和私鑰檔案的名稱的影響,
基于配置清單創建
基于配置清單創建的示例:
apiVersion: v1
kind: Secret
metadata:
name: yaml-secret
stringData:
username: redis
password: password1
type: Opaqu
這里使用了stringData,可以用明文的形式設定secret資料,然后在創建為Secret物件時會自動進行Base64編碼并保存于data欄位中;stringData欄位中的明文不會被API Server輸出,但如果使用“kubectl apply”命令進行的創建,那么注解資訊中還是可以看到明文資訊的,如果用data欄位,則必須直接提供Base64編碼后的資料,
Secret存盤卷
雖然Secret資料也可以痛毆環境變數注入,但并不推薦這樣做,因為容器應用通常會在發生錯誤時將所有環境變數保存于日志資訊中,甚至有些應用在啟動時即會將運行環境列印到日志中;另外,容器應用呼叫第三方程式為子行程時,這些子行程能夠繼承并使用父行程的所有環境變數,
所以建議使用Secret存盤卷來傳遞資料,使用方式與configMap基本相同,但欄位為secret和secretName:
volumes:
- name: secret-vol
secret:
secretName: yaml-secret
items:
- key: username
path: username
- key: password
path: password
imagePullSecret資源物件
imagePullSecret資源可用于將Secret提供的密碼傳遞給kubelet從而在拉取鏡像前完成認證,
創建imagePullSecret的標識為docker-registry,有兩種使用方式:
- 在定義Pod資源時通過“imagePullSecrets”欄位指定
- 將其添加到某特定的ServiceAccount物件中
采用第一張方式,創建docker-registry:
kubectl create secret docker-registry local-registry --docker-username=user1 --docker-password=password1
然后在創建Pod的配置清單中,通過spec.imagePullSecrets欄位為kubelet提供Secret資訊:
spec:
imagePullSecrets:
- name: local-registry
但這種方式需要為每個Pod資源顯式定義imagePullSecrets,基于ServiceAccount的的方式可以避免這個問題,后續再做詳細了解,
學習資料
《Kubernetes實戰進階》 馬永亮著
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/286875.html
標籤:其他
上一篇:工程師應該如何對待自己的錯誤
下一篇:Centos7安裝Jenkins
