Kubernetes K8S之儲存ConfigMap詳解
K8S之儲存ConfigMap概述與說明,並詳解常用ConfigMap示例
主機配置規劃
伺服器名稱(hostname) | 系統版本 | 配置 | 內網IP | 外網IP(模擬) |
---|---|---|---|---|
k8s-master | CentOS7.7 | 2C/4G/20G | 172.16.1.110 | 10.0.0.110 |
k8s-node01 | CentOS7.7 | 2C/4G/20G | 172.16.1.111 | 10.0.0.111 |
k8s-node02 | CentOS7.7 | 2C/4G/20G | 172.16.1.112 | 10.0.0.112 |
ConfigMap概述
ConfigMap 是一種 API 物件,用來將非機密性的資料儲存到健值對中。使用時可以用作環境變數、命令列引數或者儲存卷中的配置檔案。
ConfigMap 將環境配置資訊和容器映象解耦,便於應用配置的修改。當你需要儲存機密資訊時可以使用 Secret 物件。
備註:ConfigMap 並不提供保密或者加密功能。如果你想儲存的資料是機密的,請使用 Secret;或者使用其他第三方工具來保證資料的私密性,而不是用 ConfigMap。
ConfigMap建立方式
通過目錄建立
配置檔案目錄
[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# ll /root/k8s_practice/storage/configmap # 配置檔案存在哪個目錄下
total 8
-rw-r--r-- 1 root root 159 Jun 7 14:52 game.properties
-rw-r--r-- 1 root root 83 Jun 7 14:53 ui.properties
[root@k8s-master storage]#
[root@k8s-master storage]# cat configmap/game.properties # 涉及檔案1
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAs
secret.code.allowed=true
secret.code.lives=30
[root@k8s-master storage]#
[root@k8s-master storage]# cat configmap/ui.properties # 涉及檔案2
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
建立ConfigMap並檢視狀態
[root@k8s-master storage]# kubectl create configmap game-config --from-file=/root/k8s_practice/storage/configmap
configmap/game-config created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get configmap
NAME DATA AGE
game-config 2 14s
檢視ConfigMap有哪些資料
[root@k8s-master storage]# kubectl get configmap -o yaml ##### 檢視方式1
apiVersion: v1
items:
- apiVersion: v1
data:
game.properties: |+ ##### 本段最後有一行空格,+ 表示保留字串行末尾的換行
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAs
secret.code.allowed=true
secret.code.lives=30
ui.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
kind: ConfigMap
metadata:
creationTimestamp: "2020-06-07T06:57:28Z"
name: game-config
namespace: default
resourceVersion: "889177"
selfLink: /api/v1/namespaces/default/configmaps/game-config
uid: 6952ac85-ded0-4c5e-89fd-b0c6f0546ecf
kind: List
metadata:
resourceVersion: ""
selfLink: ""
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl describe configmap game-config ##### 檢視方式2
Name: game-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAs
secret.code.allowed=true
secret.code.lives=30
ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
Events: <none>
通過檔案建立
配置檔案位置
[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat /root/k8s_practice/storage/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=30
建立ConfigMap並檢視狀態
[root@k8s-master storage]# kubectl create configmap game-config-2 --from-file=/root/k8s_practice/storage/configmap/game.properties
configmap/game-config-2 created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get configmap game-config-2
NAME DATA AGE
game-config-2 1 29s
檢視ConfigMap有哪些資料
[root@k8s-master storage]# kubectl get configmap game-config-2 -o yaml ##### 檢視方式1
apiVersion: v1
data:
game.properties: |+ ##### 本段最後有一行空格,+ 表示保留字串行末尾的換行
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAs
secret.code.allowed=true
secret.code.lives=30
kind: ConfigMap
metadata:
creationTimestamp: "2020-06-07T07:05:47Z"
name: game-config-2
namespace: default
resourceVersion: "890437"
selfLink: /api/v1/namespaces/default/configmaps/game-config-2
uid: 02d99802-c23f-45ad-b4e1-dea9bcb166d8
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl describe configmap game-config-2 ##### 檢視方式2
Name: game-config-2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAs
secret.code.allowed=true
secret.code.lives=30
Events: <none>
通過命令列建立
建立ConfigMap並檢視狀態
[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# kubectl create configmap special-config --from-literal=special.how=very --from-literal="special.type=charm"
configmap/special-config created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get configmap special-config
NAME DATA AGE
special-config 2 23s
檢視ConfigMap有哪些資料
[root@k8s-master storage]# kubectl get configmap special-config -o yaml ##### 檢視方式1
apiVersion: v1
data:
special.how: very
special.type: charm
kind: ConfigMap
metadata:
creationTimestamp: "2020-06-07T09:32:04Z"
name: special-config
namespace: default
resourceVersion: "912702"
selfLink: /api/v1/namespaces/default/configmaps/special-config
uid: 76698e78-1380-4826-b5ac-d9c81f746eac
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl describe configmap special-config ##### 檢視方式2
Name: special-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
special.how:
----
very
special.type:
----
charm
Events: <none>
通過yaml檔案建立
yaml檔案
[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-demo
data:
# 類屬性鍵;每一個鍵都對映到一個簡單的值
player_initial_lives: "3"
ui_properties_file_name: 'user-interface.properties'
#
# 類檔案鍵
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
建立ConfigMap並檢視狀態
[root@k8s-master storage]# kubectl apply -f configmap.yaml
configmap/configmap-demo created
[root@k8s-master storage]# kubectl get configmap configmap-demo
NAME DATA AGE
configmap-demo 4 2m59s
檢視ConfigMap有哪些資料
[root@k8s-master storage]# kubectl get configmap configmap-demo -o yaml ##### 檢視方式1
apiVersion: v1
data:
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
player_initial_lives: "3"
ui_properties_file_name: user-interface.properties
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"game.properties":"enemy.types=aliens,monsters\nplayer.maximum-lives=5\n","player_initial_lives":"3","ui_properties_file_name":"user-interface.properties","user-interface.properties":"color.good=purple\ncolor.bad=yellow\nallow.textmode=true\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"configmap-demo","namespace":"default"}}
creationTimestamp: "2020-06-07T11:36:46Z"
name: configmap-demo
namespace: default
resourceVersion: "931685"
selfLink: /api/v1/namespaces/default/configmaps/configmap-demo
uid: fdad7000-87bd-4b72-be98-40dd8fe6400a
[root@k8s-master storage]#
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl describe configmap configmap-demo ##### 檢視方式2
Name: configmap-demo
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","data":{"game.properties":"enemy.types=aliens,monsters\nplayer.maximum-lives=5\n","player_initial_lives":"3","ui_proper...
Data
====
game.properties:
----
enemy.types=aliens,monsters
player.maximum-lives=5
player_initial_lives:
----
3
ui_properties_file_name:
----
user-interface.properties
user-interface.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
Events: <none>
Pod中使用ConfigMap
如何在Pod中使用上述的ConfigMap資訊。
當前存在的ConfigMap
[root@k8s-master storage]# kubectl get configmap
NAME DATA AGE
configmap-demo 4 30m
game-config 2 5h9m
game-config-2 1 5h1m
special-config 2 5m48s
使用ConfigMap來替代環境變數
yaml檔案
[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat pod_configmap_env.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-configmap-env
spec:
containers:
- name: myapp
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
command: ["/bin/sh", "-c", "env"]
### 引用方式1
env:
- name: SPECAIL_HOW_KEY
valueFrom:
configMapKeyRef:
name: special-config ### 這個name的值來自 ConfigMap
key: special.how ### 這個key的值為需要取值的鍵
- name: SPECAIL_TPYE_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.type
### 引用方式2
envFrom:
- configMapRef:
name: game-config-2 ### 這個name的值來自 ConfigMap
restartPolicy: Never
啟動pod並檢視狀態
[root@k8s-master storage]# kubectl apply -f pod_configmap_env.yaml
pod/pod-configmap-env created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-configmap-env 0/1 Completed 0 6s 10.244.2.147 k8s-node02 <none> <none>
檢視列印日誌
[root@k8s-master storage]# kubectl logs pod-configmap-env
MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
MYAPP_SVC_PORT_80_TCP_PORT=80
HOSTNAME=pod-configmap-env
SHLVL=1
MYAPP_SVC_PORT_80_TCP_PROTO=tcp
HOME=/root
SPECAIL_HOW_KEY=very ### 來自ConfigMap
game.properties=enemies=aliens ### 來自ConfigMap
lives=3 ### 來自ConfigMap
enemies.cheat=true ### 來自ConfigMap
enemies.cheat.level=noGoodRotten ### 來自ConfigMap
secret.code.passphrase=UUDDLRLRBABAs ### 來自ConfigMap
secret.code.allowed=true ### 來自ConfigMap
secret.code.lives=30 ### 來自ConfigMap
SPECAIL_TPYE_KEY=charm ### 來自ConfigMap
MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
NGINX_VERSION=1.12.2
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYAPP_SVC_SERVICE_HOST=10.98.57.156
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
MYAPP_SVC_SERVICE_PORT=80
MYAPP_SVC_PORT=tcp://10.98.57.156:80
使用ConfigMap設定命令列引數
yaml檔案
[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat pod_configmap_cmd.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-configmap-cmd
spec:
containers:
- name: myapp
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
command: ["/bin/sh", "-c", "echo \"===$(SPECAIL_HOW_KEY)===$(SPECAIL_TPYE_KEY)===\""]
env:
- name: SPECAIL_HOW_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.how
- name: SPECAIL_TPYE_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.type
restartPolicy: Never
啟動pod並檢視狀態
[root@k8s-master storage]# kubectl apply -f pod_configmap_cmd.yaml
pod/pod-configmap-cmd created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-configmap-cmd 0/1 Completed 0 5s 10.244.4.125 k8s-node01 <none> <none>
檢視列印日誌
[root@k8s-master storage]# kubectl logs pod-configmap-cmd
===very===charm===
通過資料卷外掛使用ConfigMap【推薦】
在資料卷裡面使用ConfigMap,最基本的就是將檔案填入資料卷,在這個檔案中,鍵就是檔名【第一層級的鍵】,鍵值就是檔案內容。
yaml檔案
[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat pod_configmap_volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-configmap-volume
spec:
containers:
- name: myapp
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
#command: ["/bin/sh", "-c", "ls -l /etc/config/"]
command: ["/bin/sh", "-c", "sleep 600"]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: configmap-demo
restartPolicy: Never
啟動pod並檢視狀態
[root@k8s-master storage]# kubectl apply -f pod_configmap_volume.yaml
pod/pod-configmap-volume created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-configmap-volume 1/1 Running 0 5s 10.244.2.153 k8s-node02 <none> <none>
進入pod並檢視
[root@k8s-master storage]# kubectl exec -it pod-configmap-volume sh
/ # ls /etc/config
game.properties player_initial_lives ui_properties_file_name user-interface.properties
/ #
/ #
/ #
/ # cat /etc/config/player_initial_lives
3/ #
/ #
/ #
/ # cat /etc/config/ui_properties_file_name
user-interface.properties/ #
/ #
/ #
/ # cat /etc/config/game.properties
enemy.types=aliens,monsters
player.maximum-lives=5
/ #
/ #
/ # cat /etc/config/user-interface.properties
color.good=purple
color.bad=yellow
allow.textmode=true
ConfigMap熱更新
準備工作
yaml檔案
[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat pod_configmap_hot.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: log-config
namespace: default
data:
log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: v1
template:
metadata:
labels:
app: myapp
release: v1
env: test
spec:
containers:
- name: myapp
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: log-config
應用yaml檔案並檢視狀態
[root@k8s-master storage]# kubectl apply -f pod_configmap_hot.yaml
configmap/log-config created
deployment.apps/myapp-deploy created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get configmap log-config
NAME DATA AGE
log-config 1 21s
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-deploy-58ff9c997-drhwk 1/1 Running 0 30s 10.244.2.154 k8s-node02 <none> <none>
myapp-deploy-58ff9c997-n68j2 1/1 Running 0 30s 10.244.4.126 k8s-node01 <none> <none>
檢視ConfigMap資訊
[root@k8s-master storage]# kubectl get configmap log-config -o yaml
apiVersion: v1
data:
log_level: INFO
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"log_level":"INFO"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"log-config","namespace":"default"}}
creationTimestamp: "2020-06-07T16:08:11Z"
name: log-config
namespace: default
resourceVersion: "971348"
selfLink: /api/v1/namespaces/default/configmaps/log-config
uid: 7e78e1d7-12de-4601-9915-cefbc96ca305
檢視pod中的ConfigMap資訊
[root@k8s-master storage]# kubectl exec -it myapp-deploy-58ff9c997-drhwk -- cat /etc/config/log_level
INFO
熱更新
修改ConfigMap
[root@k8s-master storage]# kubectl edit configmap log-config ### 將 INFO 改為了 DEBUG
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
log_level: DEBUG
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"log_level":"DEBUG"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"log-config","namespace":"default"}}
creationTimestamp: "2020-06-07T16:08:11Z"
name: log-config
namespace: default
resourceVersion: "971348"
selfLink: /api/v1/namespaces/default/configmaps/log-config
uid: 7e78e1d7-12de-4601-9915-cefbc96ca305
檢視ConfigMap資訊
[root@k8s-master storage]# kubectl get configmap log-config -o yaml
apiVersion: v1
data:
log_level: DEBUG
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"log_level":"DEBUG"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"log-config","namespace":"default"}}
creationTimestamp: "2020-06-07T16:08:11Z"
name: log-config
namespace: default
resourceVersion: "972893"
selfLink: /api/v1/namespaces/default/configmaps/log-config
uid: 7e78e1d7-12de-4601-9915-cefbc96ca305
稍後10秒左右,再次檢視pod中的ConfigMap資訊
[root@k8s-master storage]# kubectl exec -it myapp-deploy-58ff9c997-drhwk -- cat /etc/config/log_level
DEBUG
由此可見,完成了一次熱更新
相關閱讀
2、Kubernetes K8S之通過yaml建立pod與pod檔案常用欄位詳解
相關文章
- kubernetes系列10—儲存卷詳解
- k8s叢集ConfigMap和Secret儲存卷K8S
- 雲原生儲存詳解:容器儲存與 K8s 儲存卷K8S
- kubernetes系列12—二個特色的儲存卷configmap和secret
- 3.k8s儲存之ConfigMap、SecretK8S
- Kubernetes(k8s)配置檔案管理:ConfigMapK8S
- k8s之資料儲存-配置儲存K8S
- kubernetes系列(十三) - 儲存之Volume
- kubernetes系列(十二) - 儲存之Secret
- kubernetes系列(十四) - 儲存之PersistentVolume
- k8s之資料儲存-高階儲存K8S
- K8S之Volume儲存K8S
- kubernetes/k8s CSI分析-容器儲存介面分析K8S
- k8s入門之ConfigMap(九)K8S
- Kubernetes的故事之持久化儲存(十)持久化
- ConfigMap 使用 | kubernetes 篇
- 分散式儲存Ceph之PG狀態詳解分散式
- kubernetes 儲存流程
- OceanBase 儲存引擎詳解儲存引擎
- Kubernetes 漫遊:理解 ConfigMap
- mongo 儲存過程詳解Go儲存過程
- Redis 持久化儲存詳解Redis持久化
- OpenTSDB 資料儲存詳解
- Kubernetes裡的ConfigMap的用途
- Kubernetes中的Configmap和Secret
- [轉帖]OceanBase 儲存引擎詳解儲存引擎
- 分散式儲存glusterfs詳解【轉】分散式
- 易失性儲存DRAM詳解
- Spark in action on Kubernetes - 儲存篇Spark
- Kubernetes-儲存卷Volume
- Kubernetes中的儲存(六)
- k8s之deployment詳解K8S
- Kubernetes 持久化儲存之 NFS 終極實戰指南持久化NFS
- 探索 Kubernetes 持久化儲存之 Longhorn 初窺門徑持久化
- mmap共享儲存對映(儲存I/O對映)系列詳解
- 詳解Android資料儲存技術Android
- 配置Kubernetes共享使用Ceph儲存
- Spark in action on Kubernetes - 儲存篇(一)Spark