K8S学习之基础二十八:k8s中的configMap
k8s中的configMap
configMap是k8s的资源对象,简称cm,用于保存非机密性的配置,数据可以用key/value键值对形式保存,也可以通过文件形式保存
在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。
在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。
1、Configmap是k8s中的资源, 相当于配置文件,可以有一个或者多个Configmap;
2、Configmap可以做成Volume,k8s pod启动之后,通过 volume 形式映射到容器内部指定目录上;
3、容器中应用程序按照原有方式读取容器特定目录上的配置文件。
4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。
局限性:ConfigMap不能保存大量数据,超过1M,就需要考虑挂载存储卷或其他方式了
configmap创建方法:
1、命令行创建:
kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com
[root@mast01 cm]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 21d
tomcat-config 2 4s
[root@mast01 cm]# kubectl describe cm tomcat-config
Name: tomcat-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
server_name:
----
myapp.tomcat.com
tomcat_port:
----
8080
BinaryData
====
Events: <none>
2、通过文件创建:
vim nginx.conf
server {
server_name www.nginx.com;
listen 80;
root /home/nginx/www/
}
kubectl create configmap www-nginx --from-file=www=./nginx.conf
[root@mast01 cm]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 21d
tomcat-config 2 3m19s
www-nginx 1 20s
[root@mast01 cm]# kubectl describe cm www-nginx
Name: www-nginx
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
www:
----
server {
server_name www.nginx.com;
listen 80;
root /home/nginx/www/
}
BinaryData
====
Events: <none>
3、指定目录创建
[root@mast01 cm]# mkdir -p mysql-cnf
[root@mast01 cm]# echo 'server-id=1' mysql-cnf/master.cnf
server-id=1 mysql-cnf/master.cnf
[root@mast01 cm]# echo 'server-id=2' mysql-cnf/slave.cnf
server-id=2 mysql-cnf/slave.cnf
[root@mast01 cm]# kubectl create cm mysql-cnf --from-file=./mysql-cnf/
configmap/mysql-cnf created
[root@mast01 cm]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 21d
mysql-cnf 2 8s
tomcat-config 2 13m
www-nginx 1 7m37s
[root@mast01 cm]# kubectl describe cm mysql-cnf
Name: mysql-cnf
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
server.conf:
----
server-id=1
slave.conf:
----
server-id=2
BinaryData
====
Events: <none>
4、通过yaml文件创建
vi config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: default # 可选,默认为default
data: # 多行内容用|保留换行符,或使用>折叠换行(根据需求选择)
# 简单键值对
log-level: INFO
# 多行配置文件内容
config.properties: |
server.port=8080
environment=production
debug.enabled=false
# JSON配置文件示例
app-settings.json: |
{
"featureFlag": true,
"maxConnections": 100
}
[root@mast01 cm]# kubectl get cm
NAME DATA AGE
app-config 3 4s
kube-root-ca.crt 1 21d
[root@mast01 cm]# kubectl describe cm app-config
Name: app-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
app-settings.json:
----
{
"featureFlag": true,
"maxConnections": 100
}
config.properties:
----
server.port=8080
environment=production
debug.enabled=false
log-level:
----
INFO
BinaryData
====
Events: <none>
ConfigMap使用
1、使用configMapKeyRef通过环境变量注入
vi pod-cm.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm
spec:
containers:
- name: busybox
image: 172.16.80.140/busybox/busybox:latest
command: [ "/bin/sh", "-c", "sleep 3600" ]
env:
- name: server.port #定义环境变量server.port
valueFrom:
configMapKeyRef:
name: app-config #指定configmap的名字
key: server.port #指定configmap中的key
- name: lower #定义环境变量lower
valueFrom:
configMapKeyRef:
name: app-config
key: log-level
restartPolicy: Never
[root@mast01 cm]# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-provisioner-7559c6b4fc-nbmb6 1/1 Running 0 5m33s 10.244.140.65 node02 <none> <none>
pod-cm 1/1 Running 0 6s 10.244.140.66 node02 <none> <none>
[root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
/ # env
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=pod-cm
SHLVL=1
HOME=/root
TERM=xterm
lower=INFO # 来源 cm app-config 的 log-level
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
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
server.port=server.port=8080 # 来源 cm app-config 的 config.properties
environment=production
debug.enabled=false
2、使用envfrom通过环境变量注入
vi pod-cm-envfrom.yaml
kind: Pod
metadata:
name: pod-cm
spec:
containers:
- name: busybox
image: 172.16.80.140/busybox/busybox:latest
command: [ "/bin/sh", "-c", "sleep 3600" ]
envFrom:
- configMapRef:
name: app-config #指定configmap的名字
restartPolicy: Never
kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-provisioner-7559c6b4fc-nbmb6 1/1 Running 0 20m 10.244.140.65 node02 <none> <none>
pod-cm 1/1 Running 0 69s 10.244.140.67 node02 <none> <none>
[root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
/ # env
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=pod-cm
SHLVL=1
HOME=/root
config.properties=server.port=8080
environment=production
debug.enabled=false
app-settings.json={
"featureFlag": true,
"maxConnections": 100
}
log-level=INFO
TERM=xterm
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
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
3、把configMap做成volume,挂载到pod里
vi pod-cm-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm
spec:
containers:
- name: busybox
image: 172.16.80.140/busybox/busybox:latest
command: [ "/bin/sh", "-c", "sleep 3600" ]
volumeMounts:
- name: app-config
mountPath: /tmp/config
volumes:
- name: app-config
configMap:
name: app-config
restartPolicy: Never
[root@mast01 cm]# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-provisioner-7559c6b4fc-nbmb6 1/1 Running 0 31m 10.244.140.65 node02 <none> <none>
pod-cm 1/1 Running 0 4s 10.244.140.69 node02 <none> <none>
[root@mast01 cm]# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-provisioner-7559c6b4fc-nbmb6 1/1 Running 0 31m 10.244.140.65 node02 <none> <none>
pod-cm 1/1 Running 0 8s 10.244.140.69 node02 <none> <none>
[root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
/ # cd /tmp/config
/tmp/config # ls
app-settings.json config.properties log-level
/tmp/config # cat app-settings.json
{
"featureFlag": true,
"maxConnections": 100
}
/tmp/config # cat config.properties
server.port=8080
environment=production
debug.enabled=false
/tmp/config # cat log-level
4、configMap热更新
通过kubectl edit cm cm 可以直接更新cm,保存后cm立即生效
env方式的不会更新
volume方式的大约10s后会更新