Kubernetes(k8s)配置文件管理:ConfigMap
阅读原文时间:2023年07月10日阅读:1

目录

一.系统环境

服务器版本

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概览

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 来将你的配置数据和应用程序代码分开。

  • 比如,假设你正在开发一个应用,它可以在你自己的电脑上(用于开发)和在云上 (用于实际流量)运行。 你的代码里有一段是用于查看环境变量 DATABASE_HOST,在本地运行时, 你将这个变量设置为 localhost,在云上,你将其设置为引用 Kubernetes 集群中的 公开数据库组件的 服务。

这让你可以获取在云中运行的容器镜像,并且如果有需要的话,在本地调试完全相同的代码。

ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。

四.创建ConfigMap

查询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

五.ConfigMap的使用

使用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.