一:配置 Pod 使用 ConfigMap
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/ —kubernetes官网介绍ConfigMap的地址
很多应用在其初始化或运行期间要依赖一些配置信息。 大多数时候,存在要调整配置参数所设置的数值的需求。 ConfigMap 是 Kubernetes 的一种机制,可让你将配置数据注入到应用的 Pod 内部。
ConfigMap 概念允许你将配置清单与镜像内容分离,以保持容器化的应用程序的可移植性。 例如,你可以下载并运行相同的容器镜像来启动容器, 用于本地开发、系统测试或运行实时终端用户工作负载。
本页提供了一系列使用示例,这些示例演示了如何创建 ConfigMap 以及配置 Pod 使用存储在 ConfigMap 中的数据。
1.创建 ConfigMap
kubectl create configmap
2.基于一个文件创建configmap
创建一个文件,文件中以key和value的格式记录信息
[root@k8s-master1 configmap]# touch db.properties
[root@k8s-master1 configmap]# vi db.properties
[root@k8s-master1 configmap]# cat db.properties
username=root
passwd=admin
#这个命令可以查看创建configmap的基本命令格式
[root@k8s-master1 configmap]# kubectl create configmap --help
#咱们基于db.properties这个配置文件创建个configmaop
[root@k8s-master1 configmap]# kubectl create configmap my-db-properties --from-file=/root/configure-pod-container/configmap/db.properties -n app
configmap/my-db-properties created
#查看configmap是否创建成功
[root@k8s-master1 configmap]# kubectl get configmap -n app
NAME DATA AGE
kube-root-ca.crt 1 8d
my-db-properties 1 35s
#查看configmap的详细信息
[root@k8s-master1 configmap]# kubectl describe configmap my-db-properties -n app
Name: my-db-properties
Namespace: app
Labels: <none>
Annotations: <none>
Data
====
db.properties:
----
username=root
passwd=admin
BinaryData
====
Events: <none>
在pod环境变量中中加载进去configmap的配置
#创建一个configmap
[root@k8s-master1 configmap]# kubectl create configmap test-env-config --from-literal=JAVA_OPTS_TEST='-Xms512m -Xmx512m' --from-literal=APP_NAME=springboot-test-env -n app
[root@k8s-master1 configmap]# kubectl get configmap -n app
NAME DATA AGE
kube-root-ca.crt 1 8d
my-db-properties 1 19m
test-env-config 2 5m11s
[root@k8s-master1 configmap]# kubectl describe configmap test-env-config -n app
Name: test-env-config
Namespace: app
Labels: <none>
Annotations: <none>
Data
====
APP_NAME:
----
springboot-test-env
JAVA_OPTS_TEST:
----
-Xms512m -Xmx512m
BinaryData
====
Events: <none>
#咱们将test-env-config这个configmap的配置加载到配置中,咱们创建一个pod
[root@k8s-master1 configmap]# cat app.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-env-cm
namespace: app
spec:
containers:
- name: test-env-cm
image: alpine
command: ["/bin/sh","-c","env;sleep 3600"]
imagePullPolicy: IfNotPresent
env:
- name: JAVA_VM_OPTS
valueFrom:
configMapKeyRef:
name: test-env-config #configmap的名字
key: JAVA_OPTS_TEST #表示从test-env-config这个configmap中获取名字为key的value值赋给环境变量名为JAVA_VM_OPTS的环境变量
创建pod
[root@k8s-master1 configmap]# kubectl create -f app.yaml
[root@k8s-master1 configmap]# kubectl get pods -n app
NAME READY STATUS RESTARTS AGE
test-env-cm 1/1 Running 0 6s
#查看容器的日志中的环境信息是不是咱们configmap中的配置
[root@k8s-master1 configmap]# kubectl logs -f test-env-cm -n app
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.255.0.1:443
HOSTNAME=test-env-cm
SHLVL=1
HOME=/root
JAVA_VM_OPTS=-Xms512m -Xmx512m #在容器的日志中查看到了打印的环境变量的信息了
上面是通过configmap定义环境变量的配置,咱们在演示一个通过configmap定义容器内配置文件相关的配置
[root@k8s-master1 configmap]# kubectl get configmap -n app
NAME DATA AGE
kube-root-ca.crt 1 8d
my-db-properties 1 61m
test-env-config 2 47m
当前环境中有三个环境变量,下面咱们将my-db-properties环境变量中的信息写到容器内的配置文件中去
[root@k8s-master1 configmap]# cat app.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-env-cm
namespace: app
spec:
containers:
- name: test-env-cm
image: alpine
command: ["/bin/sh","-c","env;sleep 3600"]
imagePullPolicy: IfNotPresent
env:
- name: JAVA_VM_OPTS
valueFrom:
configMapKeyRef:
name: test-env-config #configmap
key: JAVA_OPTS_TEST
volumeMounts: #加载数据卷
- name : db-config #表示加载volumes中的哪个数据卷
mountPath: "/usr/local/mysql/comfig" #想要加载的卷中的文件或者加载到哪个目录下
readOnly: true #是否只读
volumes: #数据卷挂载configmap
- name: db-config #数据卷的名字
configMap: #数据卷的类型为configmap
name: my-db-properties #configmap的名字,必须要跟想要加载的configmap的名字相同
items: #对configmap中的key进行映射,如果不指定,默认将configmap中的所有的key转换为同一个文件
- key: "db.properties" #configmap中的key
path: "db.properties" #将key的值转换为文件
#创建容器
[root@k8s-master1 configmap]# kubectl apply -f app.yaml
pod/test-env-cm created
[root@k8s-master1 configmap]# kubectl get pods -n app
NAME READY STATUS RESTARTS AGE
test-env-cm 1/1 Running 0 15s
#进入容器内验证配置文件是否根据configmap的配置生成
[root@k8s-master1 configmap]# kubectl exec -it test-env-cm -n app sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cd /usr/local/mysql/comfig/
/usr/local/mysql/comfig # ll
sh: ll: not found
/usr/local/mysql/comfig # ls -ltr
total 0
lrwxrwxrwx 1 root root 20 Dec 8 06:33 db.properties -> ..data/db.properties
/usr/local/mysql/comfig # cat db.properties
username=root
passwd=admin
SubPath的使用
使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath
配置方式:
1.定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始
2.在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同
先创建一个ngix.conf的ConfigMap的配置文件
[root@k8s-master1 configmap]# kubectl create configmap nginx-conf-cm --from-file=nginx.conf -n app
configmap/nginx-conf-cm created
[root@k8s-master1 configmap]# kubectl create configmap nginx-conf-cm --from-file=nginx.conf -n app
configmap/nginx-conf-cm created
[root@k8s-master1 configmap]# kubectl get cm -n app
NAME DATA AGE
kube-root-ca.crt 1 8d
my-db-properties 1 168m
nginx-conf-cm 1 65s
test-env-config 2 154m
#查看configmap的内容
[root@k8s-master1 configmap]# kubectl describe cm nginx-conf-cm -n app
Name: nginx-conf-cm
Namespace: app
Labels: <none>
Annotations: <none>
Data
====
nginx.conf:
----
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 10240; #为了和容器基础镜像内的配置文件做区分,这里的1024我改成了10240
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
BinaryData
====
Events: <none>
#
编辑nginx的deployment,配置ngxin的数据卷
volumeMounts:
- mountPath: /etc/nginx/nginx.conf
name: nginx-conf
subPath: etc/nginx/nginx.conf
volumes:
- configMap:
defaultMode: 420
items:
- key: nginx.conf
path: etc/nginx/nginx.conf
name: nginx-conf-cm
name: nginx-conf
``
我们通常会将项目的配置文件作为 configmap 然后挂载到 pod,那么如果更新 configmap 中的配置,会不会更新到 pod 中呢?
这得分成几种情况:
默认方式:会更新,更新周期是更新时间 + 缓存时间
subPath:不会更新
变量形式:如果 pod 中的一个变量是从 configmap 或 secret 中得到,同样也是不会更新的
对于 subPath 的方式,我们可以取消 subPath 的使用,将配置文件挂载到一个不存在的目录,避免目录的覆盖,然后再利用软连接的形式,将该文件链接到目标位置
但是如果目标位置原本就有文件,可能无法创建软链接,此时可以基于前面讲过的 postStart 操作执行删除命令,将默认的吻技安删除即可。
```bash
[root@k8s-master1 configmap]# kubectl get cm -n app
NAME DATA AGE
kube-root-ca.crt 1 8d
my-db-properties 1 3h32m
nginx-conf-cm 1 40m
test-env-config 2 3h18m
[root@k8s-master1 configmap]# kubectl describe cm my-db-properties -n app
\Name: my-db-properties
Namespace: app
Labels: <none>
Annotations: <none>
Data
====
db.properties:
----
username=root
passwd=admin
BinaryData
====
Events: <none>
[root@k8s-master1 configmap]# kubectl get pods -n app
NAME READY STATUS RESTARTS AGE
nginx-deploy-85d8dd85f6-cgmpx 1/1 Running 0 17m
test-env-cm 1/1 Running 2 (21m ago) 141m
[root@k8s-master1 configmap]# kubectl exec -it test-env-cm -n app sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cat /usr/local/mysql/comfig/db.properties
username=root
passwd=admin
目前我们基于my-db-properties这个configmap启动了一个pod,当我们修改my-db-properties这个configmap的配置时,pod内的配置如何发生变化
#修改configmap的配置
[root@k8s-master1 configmap]# kubectl edit configmap my-db-properties -n app
configmap/my-db-properties edited
[root@k8s-master1 configmap]# kubectl describe configmap my-db-properties -n app
Name: my-db-properties
Namespace: app
Labels: <none>
Annotations: <none>
Data
====
db.properties:
----
username=mysql
passwd=123456
BinaryData
====
Events: <none>
#过度时间进入容器发现pod内的配置发生变化
/usr/local/mysql/comfig # cat db.properties
username=mysql
passwd=123456
上面实现configmap热更新是通过编辑configmap实现了,下面演示另一种实现方式
#修改db.properties文件
[root@k8s-master1 configmap]# cat db.properties
username=xiaoming
passwd=20231208
#kubectl create cm my-db-properties --from-file=db.properties -n app --dry-run -o yaml将要更改的configmap输出成yaml的格式
[root@k8s-master1 configmap]# kubectl create cm my-db-properties --from-file=db.properties -n app --dry-run -o yaml
W1208 17:13:32.687657 100860 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
data:
db.properties: |
username=xiaoming
passwd=20231208
kind: ConfigMap
metadata:
creationTimestamp: null
name: my-db-properties
namespace: app
[root@k8s-master1 configmap]# kubectl create cm my-db-properties --from-file=db.properties -n app --dry-run -o yaml|kubectl replace -f- -n app
W1208 17:14:06.766426 101067 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.
configmap/my-db-properties replaced
当我们不想让ConfigMap发生变化时,只需要编辑comfigmap文件加上immutable: true 的参数即可