kubernetes ConfigMap和Secret
1 啟動時直接向命令傳遞參數
docker 容器可用來運行單個應用程序,在制作docker鏡像時,Dockerfile中的ENTRYPOINT 和 CMD 指令可用於指定容器啟動時要運行的程序及相關的參數,CMD 指令以列表的形式指定要運行的程序及相關的參數,但若同時存在ENTRYPOINT指令,則CMD指令列表中的所有元素都被視為是ENTRYPOINT中程序的命令行參數,另外,在基於某鏡像使用Docker 命令創建容器時,可在命令行向ENTRYPOINT中的程序傳遞額外的自定義參數,甚至可以修改要運行的應用程序本身。
Docker run [COMMAND] [ARG]為自定義運行程序,[ARG]則是要傳遞給程序的參數,若定義相關鏡像文件時使用了ENTRYPOINT 指令,則[COMMAND]和[ARG]都被當做命令行參數傳遞給ENTRYPOINT指令中指定的程序,除非docker run明文指定額外使用--entrypoint 選項覆蓋
補充
如果 ENTRYPOINT 使用了 shell 模式,CMD 指令會被忽略。
如果 ENTRYPOINT 使用了 exec 模式,CMD 指定的內容被追加為 ENTRYPOINT 指定命令的參數。
如果 ENTRYPOINT 使用了 exec 模式,CMD 也應該使用 exec 模式。
2 將定義好的配置文件硬編碼到鏡像文件中
在Dockerfile中使用COPY指令將定義好的配置文件復制到鏡像文件系統上的目標位置,或使用RUN指令調用sed或echo修改配置文件從而達到目的
3 通過環境變量傳遞配置數據
用戶為docker run 命令通過-e 選項向環境指令變量傳值即能實現應用配置,命令格式為docker run -e NAME=tomcat -e PORT=80 ,啟動時,容器的ENTRYPOINT腳本應該為這些環境變量提供默認值,以方便用戶在未定義環境變量時也能基於此類需要環境變量的鏡像啟動容器,使用環境變量這種配置方式的優勢在於能夠將配置信息的動態化,。
另外,也可通過容器的ENTPYPOINT啟動腳本通過網絡中的K/V 存儲獲取配置參數,常用的此類存儲有Consul 或 etcd等。
4 基於Docker卷傳送配置文件
docker 存儲卷 可將宿主機上的任何文件或目錄映射到容器文件系統中,使用-v 參數可掛載
5 借助 docker config 進行容器配置
docker 自17.06 版本其為swarm service 引入了允許用戶於容器之外存儲非敏感信息的組件 service config,從而支持用戶創建通用的景象文件,並且不再需要通過掛載存儲卷或使用環境變量為容器提供配置文件。
docker swarm service secret 和 config 為容器化應用的配置提供了極大的靈活性,其缺點是只能應用於docker swarm service環境中,不能單獨運行與容器之上。
2 通過命令行參數配置容器應用
1 總述
創建POD資源時,可以在容器中定義要運行的命令以及其傳遞的參數和選項,在容器的配置上下文中,可使用command字段指定運行的程序,而args字段可以用於指定傳遞程序的選項及參數,在配置文件中定義command和args 會覆蓋鏡像文件中相關的默認設定,這類程序會被直接運行,而不會由shell 解釋器運行,因此與shell相關的特性均不被支持,如 {} 、重定向等操作。
2 實例
1 查看默認鏡像命令
busvbox 中默認運行的命令是/bin/sh
2 配置實例
#[[email protected] all]# cat demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
spec:
containers:
- name: busybox
image: busybox
command: ["httpd"] # 默認此鏡像對應的COMMAND 是"/bin/sh" "-c"
args: ["-f"]
ports:
- containerPort: 80
restartPolicy: OnFailure
3 部署
kubectl apply -f demo.yaml
4 查看
用戶也可以在容器配置的下上文中提供args字段,以實現向默認運行的程序提供額外的參數,如果默認的命令為shell 解釋器或entrypoint啟動腳本,那麽這些參數本身還需要時運行的命令和參數。
註: kubernetes 中的command 命令對應容器中的ENTRYPOINT,而args則對應容器中的CMD,kubernetes只給出args字段,其會覆蓋CMD,若同時給出command和args,則會覆蓋ENTRYPOINT和CMD。容器創建完成後,修改command和args字段並不會直接生效,除非重建POD對象
2 利用環境變量配置容器應用
1 總述
在kubernetes使用鏡像啟動容器時,也可以在Pod資源或Pod模板資源的定義中,為容器配置段使用env參數來定義所使用的環境變量列表。事實上,不指定環境變量的容器其自身還會傳遞環境變量,不過其不會被使用罷了。
2 核心字段概述
pods.spec.containers.env
pods.spec.containers.env.name: 環境變量名稱,必選字段
pods.spec.containers.env.value: 環境變量的值,默認為空
pods.spec.containers.env.valueFrom: 環境變量引用源
pods.spec.containers.env.valueFrom.fieldRef: 當前POD資源的指定字段,目前支持的字段有 metadata.name,metadata.namespace、metadata.labels、metadata.annotations、spec.nodeName、spec.serviceAccountName、status.hostIP 和 status.podIP。
pods.spec.containers.env.valueFrom.configMapKeyRef: ConfigMap 對象中的特定的key
pods.spec.containers.env.valueFrom.resourceFieldRef : 當前容器的特定資源的最小值或最大值,目前支持的對象包括limits.cpu、limits.memory、limits.ephermeral-storage、requests.cpu、requests.memory和requests.ephemeral-storage。
pods.spec.containers.env.valueFrom.secretKeyRef: Secret 對象中的特定Key。
3 實戰
1 實例
#[[email protected] all]# cat demo1.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx1
namespace: default
spec:
containers:
- name: busybox1
image: busybox
command: ["httpd"] # 默認此鏡像對應的COMMAND 是"/bin/sh" "-c"
args: ["-f"]
ports:
- containerPort: 80
env:
- name: HOSTNAME #key-value 格式
value: nginx1
- name: DEFAULT_NAMESPACE #指定當前kubernetes相關參數作為環境變量
valueFrom:
fieldRef:
fieldPath: metadata.namespace
restartPolicy: OnFailure
2部署
kubectl apply -f demo1.yaml
3 查看
其環境變量已顯示成功
註: 上述兩種方式的缺點是不能在容器運行過程中進行修改參數完成配置,需要進行重新部署
3 ConfigMap
1 總述
kubernetes 基於ConfigMap對象將配置技術局以鍵值對的形式進行存儲,這些數據可以在Pod對象中使用或者為系統組件提供配置,其是基於名稱空間的,用戶可以在不同環境中創建名稱相同但內容不同的ConfigMap對象, 從而為不同環境中同一功能的Pod資源提供不同的配置信息,從而實現更加靈活的配置。
2 創建ConfigMap對象
1 命令行方式創建
1 創建基於鍵值對的字符value
kubectl create configmap config --from-literal=name=web --from-literal=ip=‘127.0.0.1‘
kubectl create configmap 對象名稱 --from-literal=對應的鍵=對應的值
查看
查看詳細信息
2 基於文件傳遞的方式創建/創建掛載配置文件至指定目錄
創建配置文件
#[[email protected] all]# cat nginx-www.conf
server {
server_name www.zhangbing.com;
listen 80;
location / {
root /usr/share/nginx/html1;
}
}
server {
server_name _;
listen 80 default_server;
location / {
root /usr/share/nginx/html;
}
}
創建服務
kubectl create configmap nginx-www --from-file=./nginx-www.conf
kubectl create configmap 對象名稱 --from-file=對象文件(可包含目錄)
此時的key值為對象文件名稱,其可重新定義為如下
kubectl create configmap 對象名稱 --from-file=對象key值=對象文件(可包含目錄) value
查看
3 基於目錄方式創建configmap
1 創建目錄配置文件
2 生成configmap
kubectl create configmap nginx-con --from-file=/conf/
其可使用相對目錄
查看
2 配置文件方式創建
1 創建簡單的key-value 鍵值對
#[[email protected] all]# cat demo2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config1
namespace: default
data: #配置環境變量為字符串
name: web1
ip: 192.168.100.100
部署
kubectl apply -f demo2.yaml
查看
2 創建文件形式的value 數據
#[[email protected] all]# cat demo3.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config2
namespace: default
data: #配置環境變量為文件內容,及字符串集合
nginx-www1.conf: |
server {
server_name www.bbb.com;
listen 80;
location / {
root /usr/share/nginx/html1;
}
}
server {
server_name _;
listen 80 default_server;
location / {
root /usr/share/nginx/html;
}
}
部署
kubectl apply -f demo3.yaml
查看
3 修改
kubectl edit configmap config1
修改的內容如下:
查看
4 configmap環境變量傳入
1 向POD環境變量中傳遞鍵值數據
當以環境變量方式註入的configmap中的鍵不存在時會被忽略,POD 可以正常啟動,但錯誤引用的信息會以"InvalidVariableNames"事件記錄於日誌中。
1 創建實例
#[[email protected] all]# cat nginx.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config1
namespace: default
data: #配置環境變量為字符串
name: web1
ip: 192.168.100.100
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
namespace: default
labels:
app: nginx-configm
spec:
containers:
- name: nginx-demo
image: nginx:1.14
ports:
- name: http
containerPort: 80
env:
- name: NGINX_NAME # 設置容器中環境變量名稱
valueFrom:
configMapKeyRef:
name: config1 #配置configmap中對象名稱
key: name #配置configmap中對象的key名稱
- name: NGINX_IP
valueFrom:
configMapKeyRef:
name: config1
key: ip
2 部署實例
kubectl apply -f nginx.yaml
3 查看實例
4 修改實例並查看
kubectl edit configmap config1
查看,其未發生變化,因其是環境變量,需要重新部署後才能生效
2 多個key-value一同引入
當存在多個環境變量同時需要引入該POD時,其可使用envFrom來通過prefix定義前綴的方式引入服務。
#[[email protected] all]# cat nginx1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config1
namespace: default
data: #配置環境變量為字符串
name: web1
ip: 192.168.100.100
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
namespace: default
labels:
app: nginx-configm
spec:
containers:
- name: nginx-demo
image: nginx:1.14
ports:
- name: http
containerPort: 80
envFrom:
- prefix: NGINX_ #設置環境變量前綴,用於匹配上述配置的環境變量列表
configMapRef:
name: config1 #設置configmaP中資源名稱
optional: false
部署
kubectl apply -f nginx1.yaml
查看
其前綴為上述定義的NGINX_,其key為NGINX_後綴,值為其值
5 ConfigMap 存儲卷
1 總述
若configmap 對象中的鍵值來源於較長的文件內容,則使用環境變量將其導入將變得不易處理,此時將其以配置文件的形式掛載是較為理想的方式。
2 相關字段說明
pods.spec.volumes.configMap
pods.spec.volumes.configMap.name : 用於定義configmap中存在的資源卷的名稱。
pods.spec.volumes.configMap.optional: 用於定義是否允許未存在的configmap掛載至POD,默認為false,若設置為true,則其可以允許不存在的configmap存在於POD掛載之上。
pods.spec.volumes.configMap.items : 用於定義子configmap中資源情況 。
pods.spec.volumes.configMap.items.key: 用於引用configmap中資源的key值,必選字段。
pods.spec.volumes.configMap.items.path: 定義引用資源在目標宿主機中的相對路徑,必選字段。
pods.spec.volumes.configMap.items.mode:定義掛載後其權限,可選範圍是0-0777。
3 掛載整個存儲卷
1 創建html目錄和相關index.html文件
2 創建實例
#[[email protected] all]# cat nginx2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config1
namespace: default
data: #配置環境變量為配置文件集合
nginx-www1.conf: |
server {
server_name www.bbb.com;
listen 80;
location / {
root /usr/share/nginx/html1;
}
}
server {
server_name _;
listen 80 default_server;
location / {
root /usr/share/nginx/html;
}
}
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
namespace: default
labels:
app: nginx-configm
spec:
containers:
- name: nginx-demo
image: nginx:1.14
ports:
- name: http
containerPort: 80
volumeMounts: #配置掛載
- name: config
mountPath: /etc/nginx/conf.d/
readOnly: true
- name: html
mountPath: /usr/share/nginx/html1
readOnly: false
volumes:
- name: config
configMap: #設置配置文件掛載方式
name: config1 #設置configmap中配置文件名稱
- name: html
hostPath:
path: /html
---
apiVersion: v1 #配置service,使其可以通過外部網絡訪問
kind: Service
metadata:
name: nginx-dep
spec:
selector:
app: nginx-configm
type: NodePort
ports:
- targetPort: 80
nodePort: 30888
protocol: TCP
port: 80
部署
#刪除上面的資源,因為其名稱是相同的
kubectl delete -f nginx1.yaml
kubectl apply -f nginx2.yaml
配置主機的域名解析
其默認配置為主頁
修改configmap
kubectl edit configmap config1
查看
重載配置
kubectl exec nginx-demo -- nginx -s reload
查看
4 掛載存儲卷中的部分鍵值
只需要掛載存儲卷中的部分配置文件用於完成對應的功能
1 創建實例
#[[email protected] all]# cat nginx3.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config1
namespace: default
data: #配置存儲為配置文件
nginx-www1.conf: |
server {
server_name www.bbb.com;
listen 80;
location / {
root /usr/share/nginx/html1;
}
}
server {
server_name _;
listen 80 default_server;
location / {
root /usr/share/nginx/html;
}
}
nginx-www2.conf: |
server {
server_name www.ccc.com;
listen 80;
location / {
root /usr/share/nginx/html1;
}
}
server {
server_name _;
listen 80 default_server;
location / {
root /usr/share/nginx/html;
}
}
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
namespace: default
labels:
app: nginx-configm
spec:
containers:
- name: nginx-demo
image: nginx:1.14
ports:
- name: http
containerPort: 80
volumeMounts: #配置掛載
- name: config
mountPath: /etc/nginx/conf.d/
readOnly: true
- name: html
mountPath: /usr/share/nginx/html1
readOnly: false
volumes:
- name: config
configMap: #設置配置文件掛載方式
name: config1 #設置configmap中配置文件名稱
items:
- key: nginx-www2.conf #要引用的鍵名稱,必選字段
path: nginx-www2.conf # 對應的鍵掛載於掛載點中生成的文件相對路徑,可以不同於鍵名稱,必選
mode: 0644 #配置文件的權限模型
- name: html
hostPath:
path: /html
---
apiVersion: v1
kind: Service
metadata:
name: nginx-dep
spec:
selector:
app: nginx-configm
type: NodePort
ports:
- targetPort: 80
nodePort: 30888
protocol: TCP
port: 80
2 部署實例
kubectl delete -f nginx2.yaml
kubectl apply -f nginx3.yaml
3 查看
4 測試
4 secret 資源
1 總述
1 概述:
secret 資源的功能類似於configmap,但其專用於存放敏感數據,如密碼,數字證書,私鑰,令牌和SSH key 等。
其是以鍵值的方式進行數據存儲的,在POD資源中通過環境變量或存儲卷進行數據訪問,不同的是,secret對象僅僅會被分發至調用了此對象的POD資源所在的節點,且只能由節點將其存儲於內存中,其數據存儲及打印格式都是使用base64編碼的字符串,因此用戶在創建secret對象時也要使用此種編碼格式的數據,不過,在容器中以環境變量或存儲卷的方式訪問時,其會被自動解碼為明文格式。
在master上,secret對象以非加密的格式存儲於etcd中,管理員必須確保etcd集群鍵API server的安全通信,etcd服務的授權訪問,還包括用戶訪問API Server時的授權,因為擁有創建POD資源的用戶都可以使用secret資源並能夠通過Pod中的容器訪問其數據。
2 secret 用途:
1 作為存儲卷註入到POD上用於其上的容器
2 用於kubelet 為POD中的容器拉去鏡像時向私有倉庫提供認證信息。
3 secret 的類型
1 opaque: 自定義數據內容;base64編碼,用於存儲密碼、秘鑰、信息、證書等數據,類型標識符為generic
2 kubernetes.io/service-account-token: service account 的認證信息,可在創建serviceaccount時由kubernetes自動創建。
3 kubernetes.io/dockerconfigjson: 用於存儲Docker鏡像倉庫的認證信息,類型標識為docker-registry。
4 kubernetes.io/tls :用於為SSL通信模式存儲證書和私鑰文件,命令式創建時類型標識為tls。
2 創建secret資源
1 通過命令式創建
1 模式
kubectl create secret 類型 名稱 --from-litrteral=key=value
2 實例
1 創建數據庫認證
1 創建
kubectl create secret generic mysql-auth --from-literal=user=root --from-literal=password=passwd
2 查看
3 解碼
2 創建存儲ssh公鑰和私鑰信息
1 創建ssh公鑰和私鑰
ssh-keygen -C "[email protected]"
2 查看其路徑和情況
3 導入
kubectl create secret generic ssh-key --from-file=ssh-privatekey=/root/.ssh/id_rsa --from-file=ssh-publickey=/root/.ssh/id_rsa.pub
4 查看
3 創建基於SSL/TLS通信的secret對象
1 創建秘鑰
(umask 077;openssl genrsa -out nginx.key 2048)
2 創建crt
openssl req -new -x509 -key nginx.key -out nginx.crt -subj /C=CN/ST=shaanxi/L=xi\‘an/O=linux/CN=www.zhangbing.com
其CN 中的值必須和需要訪問的URL相同,否則將不能被訪問
3 創建 secret資源
kubectl create secret tls nginx-ssl --key=./nginx.key --cert=./nginx.crt
4 查看
2 配置文件式創建資源
1 核心字段
secret.data: 鍵值對數據類型,數據格式是base64格式編碼的字符串,用戶需事先進行編碼
secret.stringData:以明文格式定義key和value數據,無需進行編碼
secret.type: 為了便於編程方式處理secret數據而提供的類型標識
2 創建資源
#[[email protected] all]# cat demose.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-a
data:
user: cm9vdAo=
password: cGFzc3dkCg==
---
apiVersion: v1
kind: Secret
metadata:
name: mysql-b
stringData:
user: root
password: passwd
部署
kubectl apply -f demose.yaml
查看
3 secret 存儲卷
secret對象可註入為環境變量,也可以以存儲卷的方式進行掛載,但其在出現錯誤時會將環境變量保存在日誌中,其不利於信息的保存,再者,其容器若調用第三方程序為子進程時,這些子進程能夠繼承並使用父進程的所有環境變量,因此,使用secret註入環境變量是不明智的。
pods.spec.volumes.secret 其配置方式與configmap完全相同
4 實例
1 創建資源
#[[email protected] all]# cat nginx2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config1
namespace: default
data: #配置環境變量為字符串
nginx-www1.conf: |
server {
server_name www.zhangbing.com;
listen 443;
ssl on;
ssl_certificate /etc/nginx/ssl/tls.crt;
ssl_certificate_key /etc/nginx/ssl/tls.key;
location / {
root /usr/share/nginx/html1;
}
}
server {
server_name _;
listen 80 default_server;
location / {
root /usr/share/nginx/html;
}
}
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
namespace: default
labels:
app: nginx-configm
spec:
containers:
- name: nginx-demo
image: nginx:1.14
ports:
- name: http
containerPort: 80
volumeMounts: #配置掛載
- name: config
mountPath: /etc/nginx/conf.d/
readOnly: true
- name: html
mountPath: /usr/share/nginx/html1
readOnly: false
- name: ssl
mountPath: /etc/nginx/ssl
volumes:
- name: config
configMap: #設置配置文件掛載方式
name: config1 #設置configmap中配置文件名稱
- name: html
hostPath:
path: /html
- name: ssl
secret: #配置掛載secret
secretName: nginx-ssl #之前上述使用命令行方式創建的服務
---
apiVersion: v1
kind: Service
metadata:
name: nginx-dep
spec:
selector:
app: nginx-configm
type: NodePort
ports:
- targetPort: 443
nodePort: 31443
protocol: TCP
port: 443
2 部署
刪除之前配置
kubectl delete -f nginx2.yaml
kubectl apply -f nginx2.yaml
3 訪問查看
4 查看其證書信息
4 imagepullsecret資源對象
1 總述
imageoullsecret 資源可用於輔助kubelet從需要認證的私有鏡像倉庫獲取鏡像,其通過secret提供的密碼傳遞給kueblet從而在拉取鏡像前完成必要的認證過程。
2 使用imagePullSecret 的方式:
1 創建docker-registry類型的secret對象,並在定義POD資源時明確通過imagePullSecrets字段給出。
2 創建docker-registry 類型的secret對象,將其添加到某特定的ServiceAccount對象中,那些使用該ServiceAccount資源創建的POD對象,以及默認使用該ServiceAccount 的POD對象都將會直接使用imagePullSecrets 中的認證信息。
3 創建實例
kubectl create secret docker-registry local-registry --docker-server=192.168.1.10 --docker-username=admin --docker-password=Admin [email protected]
查看資源
創建POD並指定資源
# [[email protected] all]# cat sec.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-de
namespace: default
spec:
imagePullSecrets: #指定使用的secret
- name: local-registry
containers:
- image: 192.168.1.10/test/nginx:1.14 #指定要訪問的容器鏡像
name: pods
ports:
- name: http
containerPort: 80
此處默認的鏡像倉庫拉去時https服務,若想http拉取,則需要配置
並重啟docker
部署服務
kubectl apply -f /root/all/sec.yaml
查看服務
kubernetes ConfigMap和Secret