在之前ConfigMap介绍中,我们知道ConfigMap存在的目的并不是为pod提供存储空间来用的,而是给用户提供从集群外部向pod内部应用注入配置信息,本篇笔记简单介绍如何注入一些配置信息,发分别是环境变量和文件的方式。在configMap
中,会用到configMapKeyRef
和secretKeyRef
.configMap
也属于名称空间资源。在创建时,没有spec,而有data,结构相对简单。并且可以直接在命令行创建(kubectl create configmap ...
),也可以定义配置清单。
1,命令行创建
创建一个名称为linuxea-config
的cm,键值分别是:
NGINX_PORT:80
SERVER_NAME:meftp.linuxea.com
如下:
[root@linuxea linuxea]# kubectl create configmap linuxea-config --from-literal=NGINX_PORT=80 --from-literal=SERVER_NAME=meftp.linuxea.com
configmap/linuxea-config created
kubectl get cm
其中DATA下 有两个key
[root@linuxea linuxea]# kubectl get cm
NAME DATA AGE
linuxea-config 2 4s
使用kubectl describe cm linuxea-config
查看键值内容。并且这里的comfigmap能够被pod启动时候调用
[root@linuxea configMap]# kubectl describe cm linuxea-config
Name: linuxea-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
NGINX_PORT:
----
80
SERVER_NAME:
----
meftp.linuxea.com
Events: <none>
2,文件创建
kubectl create configmap CM名称 --from-file=键=./值FILE
如果不指定键键,文件名称就为键编写一个文件
[root@linuxea configMap]# cat 80.conf
server_name meftp.linuxea.com;
listen 80;
创建一个comfigmap,名称为linuxea-nginx,键名称和文件一样
[root@linuxea configMap]# kubectl create configmap linuxea-nginx --from-file=./80.conf
使用kubectl get cm
查看定义的linuxea-nginx
的DATA有一个键
[root@linuxea configMap]# kubectl get cm
NAME DATA AGE
linuxea-config 2 13h
linuxea-nginx 1 3m
使用 kubectl get cm linuxea-nginx -o yaml
查看定义过的内容其中80.conf为键:
data:
80.conf: |2
server_name meftp.linuxea.com;
listen 80;
如下
[root@linuxea configMap]# kubectl get cm linuxea-nginx -o yaml
apiVersion: v1
data:
80.conf: |2
server_name meftp.linuxea.com;
listen 80;
kind: ConfigMap
metadata:
creationTimestamp: 2018-09-28T08:26:24Z
name: linuxea-nginx
namespace: default
resourceVersion: "1712102"
selfLink: /api/v1/namespaces/default/configmaps/linuxea-nginx
uid: 2f948b0e-c2f8-11e8-a8ab-88882fbd1028
在或者使用kubectl describe cm linuxea-nginx
查看定义过的键值
[root@linuxea configMap]# kubectl describe cm linuxea-nginx
Name: linuxea-nginx
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
80.conf:
----
server_name meftp.linuxea.com;
listen 80;
Events: <none>
3,应用环境变量CM到POD
- 环境变量的配置的configMap,在我们修改后是不会立即生效到pod中的
变量name需要使用下滑线,如果是减号"-",也会被转换成下划线
env:
- name: NGINX_PORT
valueFrom:
configMapKeyRef: # 引用configmap, 默认需要事先存在,如果不存在启动会报错
name: linuxea-config # 被应用的configmap,已经事先定义好的
key: NGINX_PORT # 将NGINX_PORT的值传递给name的NGINX_PORT,最终映射到容器内的是name的值
optional: true #这样一个场景,倘若在启动pod时候,configMap事先并没有创建好。但是我们知道,如果没有事先创建这里会报错。optional设置为true可以解决这个问题。也就是说配置optional设置为true后,启动不会失败,启动后再创建configMap,而后重载pod生效configMap
- name: SERVER_NAME
valueFrom:
configMapKeyRef:
name: linuxea-config
key: SERVER_NAME
定义资源清单,为了方便访问,这里直接定义了hostNetwork: true
,当然,如果使用hostnetwork
就要加
- name: http
containerPort: 80
hostPort: 80
最后如下
[root@linuxea configMap]# cat pod-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-meftp
namespace: default
labels:
www: meftplinuxea
tier: backend
annotations:
www.linuxea.com/ops-by: "linuxea ftp and mirrors"
spec:
hostNetwork: true
containers:
- name: linuxea-pod1-com
image: "marksugar/nginx_createrepo"
ports:
- name: http
containerPort: 80
hostPort: 80
env:
- name: NGINX_PORT
valueFrom:
configMapKeyRef:
name: linuxea-config
key: NGINX_PORT
- name: SERVER_NAME
valueFrom:
configMapKeyRef:
name: linuxea-config
key: SERVER_NAME
将资源清单中定义的pod apply 启动
[root@linuxea configMap]# kubectl apply -f pod-configmap.yaml
pod/pod-meftp created
而后pod被启动,得到的ip是172.16.5.112
[root@linuxea configMap]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
linuxea-pvc-pod 1/1 Running 0 4d 172.16.4.7 linuxea.node-2.com <none>
pod-meftp 1/1 Running 0 9s 10.10.240.146 linuxea.node-3.com <none>
而后直接访问meftp.linuxea.com
(假如你解析了的话)而后进入容器
[root@linuxea configMap]# kubectl exec -it pod-meftp -- /bin/sh
我们过滤下环境变量确定是否被正常传入
sh-4.2# printenv |egrep "NGINX_PORT|SERVER_NAME"
SERVER_NAME=meftp.linuxea.com
NGINX_PORT=80
以及被变量替换
sh-4.2# cat /etc/nginx/vhost/ps.conf
listen 80;
server_name meftp.linuxea.com;
4,应用文件CM到POD
- 在上面提到,环境变量修改是不会同步到POD中,而使用configMap的文件设置键值,当修改后,一段时间后就会同步到POD中(这个文件在pod中表现为链接文件),自动完成同步。这个同步时间取决于api server的同步时间
4.1,准备configMap
我们将80.conf重命名到ps.conf而后重新创建,内容和80.conf一致。主要是镜像中对配置文件的名称已经写死了
[root@linuxea configMap]# cat ps.conf
server_name meftp.linuxea.com;
listen 80;
create
[root@linuxea configMap]# kubectl create configmap linuxea-nginx --from-file=./ps.conf
configmap/linuxea-nginx created
[root@linuxea configMap]# kubectl get cm
NAME DATA AGE
linuxea-config 2 5h
linuxea-nginx 1 4s
4.2,应用到pod
编写资源清单,而后定义存储卷,将configMap引用进来
volumes:
- name: nginxconf
configMap:
name: linuxea-nginx #这里挂在的是之前创建好的configMap以linuxea-nginx为名称的键名
而后在pod中调用
volimeMounts:
- name: nginxconf
mountPath: /etc/nginx/vhost/ # 将创建的configMap文件挂载到此目录下
readOnly: true # 这里配置readOnly为true说明不允许容器内修改,只读模式
完成的资源清单如下:
[root@linuxea configMap]# cat pod-configmap-file.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-meftp-cmfile
namespace: default
labels:
www: meftplinuxea
tier: backend
annotations:
www.linuxea.com/ops-by: "linuxea ftp and mirrors"
spec:
hostNetwork: true
containers:
- name: linuxea-pod1-com
image: "marksugar/nginx_createrepo"
ports:
- name: http
containerPort: 80
hostPort: 80
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/vhost/ps.conf
readOnly: true
volumes:
- name: nginxconf
configMap:
name: linuxea-nginx
apply
[root@linuxea configMap]# kubectl apply -f pod-configmap-file.yaml
pod/pod-meftp-cmfile created
[root@linuxea configMap]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
linuxea-pvc-pod 1/1 Running 0 4d
pod-meftp 1/1 Running 0 2h
pod-meftp-cmfile 1/1 Running 0 7s
而后进入容器内,验证是否被挂在到容器
[root@linuxea configMap]# kubectl exec -it pod-meftp-cmfile -- /bin/sh
sh-4.2# cat /etc/nginx/vhost/ps.conf
server_name meftp.linuxea.com;
listen 80;
sh-4.2#
4.3,修改configMap
此时修改在pod外的configMap文件,在短暂的同步后就会生效到容器内使用kubectl edit cm linuxea-nginx
编辑,修改server_name www.linuxea.com
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
ps.conf: |2
server_name www.linuxea.com;
listen 80;
kind: ConfigMap
metadata:
creationTimestamp: 2018-09-28T09:10:58Z
name: linuxea-nginx
namespace: default
resourceVersion: "1716528"
selfLink: /api/v1/namespaces/default/configmaps/linuxea-nginx
uid: 69c0d927-c2fe-11e8-a8ab-88882fbd1028
进入容器
[root@linuxea configMap]# kubectl exec -it pod-meftp-cmfile -- /bin/sh
而后循环的进行监控观察,一点时间后已经同步到容器内。这个同步时间取决于api server的同步时间!此刻,配置发生改变,说明修改生效。
sh-4.2# while true;do cat /etc/nginx/vhost/ps.conf ;sleep 1;done
server_name meftp.linuxea.com;
listen 80;
server_name meftp.linuxea.com;
listen 80;
server_name www.linuxea.com;
listen 80;
server_name www.linuxea.com;
listen 80;
同时, 这个配置文件也是一个链接文件
sh-4.2# ls -sl
total 0
0 lrwxrwxrwx 1 root root 14 Sep 28 09:16 ps.conf -> ..data/ps.conf
5,挂载部分键
只挂载部分键值,而非所有 items: 列出的键 key: 列出的值。对应文件内容以key对应的value mode: 指定权限 path: 路径不能使用“..”