涉及文档
- Kubernetes ConfigMap 官方文档
- Kubernetes subPath 官方文档
- Kubernetes 挂载的 ConfigMap 将自动更新官方文档
- [Kubernetes 将ConfigMap 数据添加到数据卷中的特定路径
- kubernetes 其他博主subpath 笔记
简介:
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到健值对中。使用时可以用作环境变量、命令行参数或者存储卷中的配置文件
一、查看帮助命令
kubectl create cm -h
二、目录形式创建cm
1、创建目录
mkdir -p /root/kubernetes/configmap/dir
2、生成2个文件
cd /root/kubernetes/configmap/dir
echo "ConfigMap 是一种 API 对象,用来将非机密性的数据保存到健值对中。使用时可以用作环境变量、命令行参数或者存储卷中的配置文件。" > configmapdir1
echo "ConfigMap 将您的环境配置信息和 容器镜像 解耦,便于应用配置的修改。当您需要储存机密信息时可以使用 Secret 对象。">configmapdir2
3、以目录形式创建cm
kubectl create configmap dir-cm \
--from-file=/root/kubernetes/configmap/dir/
4、查看信息
- 方式一
kubectl get cm dir-cm -o yaml
- 方法二:
kubectl describe cm dir-cm
三、以文件形式创建cm
1、创建目录并且复制之前的两个到当前文件中
mkdir -p /root/kubernetes/configmap/txt && cp ../dir/* ./
2、生成cm文件
kubectl create configmap txt-config \
--from-file=/root/kubernetes/configmap/txt/configmapdir1 \
--from-file=/root/kubernetes/configmap/txt/configmapdir2
3、查看信息
- 方式一
kubectl get cm txt-config -o yaml
- 方法二:
kubectl describe cm txt-config
四、以字面形式创建cm
1、生成cm文件
kubectl create configmap write-config \
--from-literal=yeal=2020/08/22 \
--from-literal=time=22:30:37
2、查看信息
- 方式一
kubectl get cm write-config -o yaml
- 方法二:
kubectl describe cm write-config
五、注入环境变量方式挂载cm
1、创建yaml文件
vim envcm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: log-info
namespace: default
data:
log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cmenv
name: cmenv
spec:
replicas: 1
selector:
matchLabels:
app: cmenv
template:
metadata:
labels:
app: cmenv
spec:
containers:
- image: nginx
name: nginx
#command: [ "/bin/sh", "-c", "env" ]
env: #注入环境变量
- name: YEAR_KEY #环境变量名称
valueFrom:
configMapKeyRef:
name: write-config #注入cm名为write-config
key: yeal #cm名为write-config中key为yeal的值
- name: TIME_KEY
valueFrom:
configMapKeyRef:
name: write-config #注入cm名为write-config
key: time #cm名为write-config中key为year的值
envFrom:
- configMapRef:
name: log-info #挂载cm名为log-info
2、生成pod
kubectl apply -f envcm.yaml
3、查看pod信息是否注入成功
格式:
- 方式一(一个Pod存在多镜像情况)
kubectl exec -it pod名称 -c containers名称 env
- 方式二(常用)
kubectl exec -it cmenv-644ccf94fc-cbvx7 -c nginx env
- 方式三:
kubectl exec -it cmenv-644ccf94fc-cbvx7 -- env
六、volumes挂载形式将cm挂载
1、生成volume格式的yaml文件
vim volumescm.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cmvolume
name: cmvolume
spec:
replicas: 1
selector:
matchLabels:
app: cmvolume
template:
metadata:
labels:
app: cmvolume
spec:
containers:
- image: nginx
name: cmvolume
#command: ["/bin/sh","-c","cat /etc/config/"]
volumeMounts:
- name: config-volume
mountPath: /etc/config #如果目录不存在则创建
readOnly: true
volumes:
- name: config-volume
configMap:
name: log-info
2、生成volume形式挂载pod
kubectl apply -f volumescm.yaml
3、查看信息
kubectl exec -it cmvolume-56bc686988-b8h7k -- ls /etc/config
kubectl exec cmvolume-56bc686988-b8h7k -- cat /etc/config/log_level
注意: 上面值获取到日志级别为INFO,后期实验有用
七、将 ConfigMap 数据添加到数据卷中的特定路径
使用 path 字段为特定的 ConfigMap 项目指定预期的文件路径,path 必须是相对路径
。
kubectl explain Deployment.spec.template.spec.volumes.configMap.items.path
1、新建Pod资源的yaml文件
vim volumescm2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: log-info
data:
nginx.conf: |
user nginx;
worker_processes 4;
worker_rlimit_nofile 48127;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
multi_accept on;
worker_connections 16384;
use epoll;
}
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;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /nginx_status {
#allow 127.0.0.1;
#deny all;
access_log off;
stub_status on;
}
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cmvolume
name: cmvolume
spec:
replicas: 1
selector:
matchLabels:
app: cmvolume
template:
metadata:
labels:
app: cmvolume
spec:
containers:
- image: nginx
name: cmvolume
#command: ["/bin/sh","-c","cat /etc/config/"]
volumeMounts:
- name: config-volume
mountPath: /etc/nginx
volumes:
- name: config-volume
configMap:
name: log-info
items:
- key: nginx.conf
path: /etc/nginx/nginx.conf
2、资源生成Pod
kubectl apply -f volumescm2.yaml
3、更新Pod资源的yaml文件
vim volumescm2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: log-info
data:
nginx.conf: |
user nginx;
worker_processes 4;
worker_rlimit_nofile 48127;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
multi_accept on;
worker_connections 16384;
use epoll;
}
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;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /nginx_status {
#allow 127.0.0.1;
#deny all;
access_log off;
stub_status on;
}
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cmvolume
name: cmvolume
spec:
replicas: 1
selector:
matchLabels:
app: cmvolume
template:
metadata:
labels:
app: cmvolume
spec:
containers:
- image: nginx
name: cmvolume
#command: ["/bin/sh","-c","cat /etc/config/"]
volumeMounts:
- name: config-volume
mountPath: /etc/nginx
volumes:
- name: config-volume
configMap:
name: log-info
items:
- key: nginx.conf
path: etc/nginx/nginx.conf
- 再次更新Yaml文件
kubectl apply -f volumescm2.yaml
4、再次更新Pod资源的yaml文件
vim volumescm2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: log-info
data:
nginx.conf: |
user nginx;
worker_processes 4;
worker_rlimit_nofile 48127;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
multi_accept on;
worker_connections 16384;
use epoll;
}
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;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /nginx_status {
#allow 127.0.0.1;
#deny all;
access_log off;
stub_status on;
}
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cmvolume
name: cmvolume
spec:
replicas: 1
selector:
matchLabels:
app: cmvolume
template:
metadata:
labels:
app: cmvolume
spec:
containers:
- image: nginx
name: cmvolume
#command: ["/bin/sh","-c","cat /etc/config/"]
volumeMounts:
- name: config-volume
mountPath: /etc/nginx
volumes:
- name: config-volume
configMap:
name: log-info
items:
- key: nginx.conf
path: nginx.conf
5、再次更新Pod资源
kubectl apply -f volumescm2.yaml
对此接下来实验会使用到subPath
挂载参数解决这个现象(把文件挂载在已存在的目录下,不覆盖原目录),但是使用subPath 无法进行configmap热更新。
八、configmap热更新
涉及实验, 1、configmap热更新
2、subPath 作为configmap 的数据卷,nginx配置更新
实验一:
1、cmvolume pod 热更新
kubectl edit cm log-info
原数据:
2、更新数据:
修改成功:
3、 再次查看信息:
kubectl exec cmvolume-56bc686988-b8h7k -- cat /etc/config/log_level
实验二:
使用 ConfigMap 作为subPath 的数据卷将不会收到 ConfigMap 更新
1、更新Pod资源的yaml文件
vim volumescm2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: log-info
data:
nginx.conf: |
user nginx;
worker_processes 4;
worker_rlimit_nofile 48127;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
multi_accept on;
worker_connections 16384;
use epoll;
}
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;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /nginx_status {
#allow 127.0.0.1;
#deny all;
access_log off;
stub_status on;
}
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cmvolume
name: cmvolume
spec:
replicas: 1
selector:
matchLabels:
app: cmvolume
template:
metadata:
labels:
app: cmvolume
spec:
containers:
- image: nginx
name: cmvolume
#command: ["/bin/sh","-c","cat /etc/config/"]
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
volumes:
- name: config-volume
configMap:
name: log-info
items:
- key: nginx.conf
path: nginx.conf
2、再次更新Pod资源
kubectl apply -f volumescm2.yaml
3、再更新Pod资源的yaml文件( 查看ConfigMap是否受到subPath 影响热更新)
cat volumescm2.yaml -n |head -n 50
4、重新再次更新Pod资源
kubectl apply -f volumescm2.yaml