伺服器版本 | docker軟體版本 | Kubernetes(k8s)叢集版本 | CPU架構 |
---|---|---|---|
CentOS Linux release 7.4.1708 (Core) | Docker version 20.10.12 | v1.21.9 | x86_64 |
Kubernetes叢集架構:k8scloude1作為master節點,k8scloude2,k8scloude3作為worker節點
伺服器 | 作業系統版本 | CPU架構 | 程序 | 功能描述 |
---|---|---|---|---|
k8scloude1/192.168.110.130 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico | k8s master節點 |
k8scloude2/192.168.110.129 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker節點 |
k8scloude3/192.168.110.128 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker節點 |
使用ConfigMap的前提是已經有一套可以正常執行的Kubernetes叢集,關於Kubernetes(k8s)叢集的安裝部署,可以檢視部落格《Centos7 安裝部署Kubernetes(k8s)叢集》https://www.cnblogs.com/renshengdezheli/p/16686769.html。
ConfigMap 是一種 API 物件,用來將非機密性的資料儲存到鍵值對中。使用時, Pods 可以將其用作環境變數、命令列引數或者儲存卷中的組態檔。
ConfigMap 是一個 API 物件, 讓你可以儲存其他物件所需要使用的設定。 和其他 Kubernetes 物件都有一個 spec 不同的是,ConfigMap 使用 data 和 binaryData 欄位。這些欄位能夠接收鍵-值對作為其取值。data 和 binaryData 欄位都是可選的。data 欄位設計用來儲存 UTF-8 字串,而 binaryData 則被設計用來儲存二進位制資料作為 base64 編碼的字串。
ConfigMap 的名字必須是一個合法的 DNS 子域名。
data 或 binaryData 欄位下面的每個鍵的名稱都必須由字母數位字元或者 -、_ 或 . 組成。在 data 下儲存的鍵名不可以與在 binaryData 下出現的鍵名有重疊。
從 v1.19 開始,你可以新增一個 immutable 欄位到 ConfigMap 定義中, 建立不可變更的 ConfigMap。
ConfigMap 將你的環境設定資訊和 容器映象 解耦,便於應用設定的修改。
注意:ConfigMap 並不提供保密或者加密功能
。 如果你想儲存的資料是機密的,請使用 Secret,關於secret的使用請檢視部落格《Kubernetes(k8s)密碼管理:Secret》, 或者使用其他第三方工具來保證你的資料的私密性,而不是用 ConfigMap。
ConfigMap的用途如下:使用 ConfigMap 來將你的設定資料和應用程式程式碼分開。
這讓你可以獲取在雲中執行的容器映象,並且如果有需要的話,在本地偵錯完全相同的程式碼。
ConfigMap 在設計上不是用來儲存大量資料的。在 ConfigMap 中儲存的資料不可超過 1 MiB。如果你需要儲存超出此尺寸限制的資料,你可能希望考慮掛載儲存卷 或者使用獨立的資料庫或者檔案服務。
查詢configmap
[root@k8scloude1 secret-manage]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 5h29m
configmap的建立方式和secret類似,可以使用鍵值對,也可以使用檔案
使用鍵值對建立configmap
[root@k8scloude1 secret-manage]# kubectl create cm cm1 --from-literal=xioaming=zxc --from-literal=bob=plm
configmap/cm1 created
[root@k8scloude1 secret-manage]# kubectl get cm
NAME DATA AGE
cm1 2 4s
kube-root-ca.crt 1 5h31m
檢視configmap的詳細內容
[root@k8scloude1 secret-manage]# kubectl describe cm cm1
Name: cm1
Namespace: secret-manage
Labels: <none>
Annotations: <none>
Data
====
bob:
----
plm
xioaming:
----
zxc
Events: <none>
以yaml格式檢視configmap
[root@k8scloude1 secret-manage]# kubectl get cm cm1 -o yaml
apiVersion: v1
data:
bob: plm
xioaming: zxc
kind: ConfigMap
metadata:
creationTimestamp: "2022-01-21T09:25:32Z"
name: cm1
namespace: secret-manage
resourceVersion: "890529"
selfLink: /api/v1/namespaces/secret-manage/configmaps/cm1
uid: bdbb0647-dfe9-45ec-827d-9af2ea12a0a1
使用檔案建立configmap
[root@k8scloude1 secret-manage]# kubectl create cm cm2 --from-file=/etc/shadow --from-file=/etc/hosts
configmap/cm2 created
[root@k8scloude1 secret-manage]# kubectl create cm cm3 --from-file=nginx.conf
configmap/cm3 created
[root@k8scloude1 secret-manage]# kubectl get cm
NAME DATA AGE
cm1 2 4m18s
cm2 2 22s
cm3 1 4s
kube-root-ca.crt 1 5h35m
使用MySQL映象建立pod,以環境變數的方式參照ConfigMap
[root@k8scloude1 secret-manage]# vim mysqlconfgmap.yaml
#configMapKeyRef:指定confgmap的名字和key
[root@k8scloude1 secret-manage]# cat mysqlconfgmap.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: mysql
name: mysql
spec:
terminationGracePeriodSeconds: 0
containers:
- image: hub.c.163.com/library/mysql:latest
imagePullPolicy: IfNotPresent
name: mysql
resources: {}
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
configMapKeyRef:
name: cm1
key: xioaming
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
建立pod
[root@k8scloude1 secret-manage]# kubectl apply -f mysqlconfgmap.yaml
pod/mysql created
[root@k8scloude1 secret-manage]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql 1/1 Running 0 24s 10.244.112.139 k8scloude2 <none> <none>
連線mysql資料庫
[root@k8scloude1 secret-manage]# mysql -uroot -pzxc -h 10.244.112.139
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.18 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> exit
Bye
檢視mysql pod的mysql密碼MYSQL_ROOT_PASSWORD,mysql密碼沒有顯示
[root@k8scloude1 secret-manage]# kubectl describe pod mysql | grep -A10 Environment
Environment:
MYSQL_ROOT_PASSWORD: <set to the key 'xioaming' of config map 'cm1'> Optional: false
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dllmm (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
刪除pod
[root@k8scloude1 secret-manage]# kubectl delete pod mysql --force
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "mysql" force deleted
設定pod,以卷的方式參照configmap,掛載cm3的nginx.conf到/etc/nginx/nginx.conf
[root@k8scloude1 secret-manage]# vim volumenginxconfconfigmap.yaml
[root@k8scloude1 secret-manage]# cat volumenginxconfconfigmap.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
terminationGracePeriodSeconds: 0
#定義configmap型別的卷
volumes:
- name: configmap1
configMap:
name: cm3
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
#把nginx.conf檔案掛載到/etc/nginx/nginx.conf
volumeMounts:
- name: configmap1
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
建立pod
[root@k8scloude1 secret-manage]# kubectl apply -f volumenginxconfconfigmap.yaml
pod/nginx created
[root@k8scloude1 secret-manage]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 9s 10.244.112.141 k8scloude2 <none> <none>
進入Nginx容器
[root@k8scloude1 secret-manage]# kubectl exec -it nginx -- bash
root@nginx:/# cat /etc/nginx/nginx.conf | head -3
##modify file
user nginx;
worker_processes auto;
root@nginx:/# exit
exit
可以使用edit編輯nginx.conf檔案
[root@k8scloude1 secret-manage]# kubectl edit cm cm3
configmap/cm3 edited
檢視修改過後的configmap內容
[root@k8scloude1 secret-manage]# kubectl get cm cm3 -o yaml | head -7
apiVersion: v1
data:
nginx.conf: |+
##modify file
##new add
user nginx;
worker_processes auto;
進入容器檢視Nginx的組態檔,可以發現:cm3裡檔案內容已經改變了,但是容器裡檔案內容沒變。
pod裡的組態檔nginx.conf沒有變化,需要重新建立pod
[root@k8scloude1 secret-manage]# kubectl exec -it nginx -- bash
root@nginx:/# cat /etc/nginx/nginx.conf | head -3
##modify file
user nginx;
worker_processes auto;
root@nginx:/# exit
exit
刪除pod並重新建立pod
[root@k8scloude1 secret-manage]# kubectl delete pod nginx --force
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "nginx" force deleted
[root@k8scloude1 secret-manage]# kubectl apply -f volumenginxconfconfigmap.yaml
pod/nginx created
此時nginx.conf檔案內容已經改變了,就達到了修改configmap檔案,從而改變容器裡組態檔的目的。
[root@k8scloude1 secret-manage]# kubectl exec -it nginx -- bash
root@nginx:/# cat /etc/nginx/nginx.conf | head -3
##modify file
##new add
user nginx;
root@nginx:/# exit
exit
檢視所有的configmap
[root@k8scloude1 secret-manage]# kubectl get cm -A
NAMESPACE NAME DATA AGE
default kube-root-ca.crt 1 12d
kube-node-lease kube-root-ca.crt 1 12d
kube-public cluster-info 1 12d
kube-public kube-root-ca.crt 1 12d
kube-system calico-config 4 12d
kube-system coredns 1 12d
kube-system extension-apiserver-authentication 6 12d
kube-system kube-proxy 2 12d
kube-system kube-root-ca.crt 1 12d
kube-system kubeadm-config 2 12d
kube-system kubelet-config-1.21 1 12d
ns1 kube-root-ca.crt 1 11d
ns2 kube-root-ca.crt 1 11d
pod kube-root-ca.crt 1 9d
secret-manage cm1 2 33m
secret-manage cm2 2 29m
secret-manage cm3 1 12m
secret-manage kube-root-ca.crt 1 6h5m
volume kube-root-ca.crt 1 3d5h
可以編輯其他的configmap內容
[root@k8scloude1 secret-manage]# kubectl edit cm calico-config -n kube-system
Edit cancelled, no changes made.
[root@k8scloude1 secret-manage]# kubectl edit cm kube-proxy -n kube-system
Edit cancelled, no changes made.