linuxea:kubernetes ConfigMap两种应用方式(24)


在之前ConfigMap介绍中,我们知道ConfigMap存在的目的并不是为pod提供存储空间来用的,而是给用户提供从集群外部向pod内部应用注入配置信息,本篇笔记简单介绍如何注入一些配置信息,发分别是环境变量和文件的方式。
configMap中,会用到configMapKeyRefsecretKeyRef.configMap也属于名称空间资源。在创建时,没有spec,而有data,结构相对简单。并且可以直接在命令行创建(kubectl create configmap ...),也可以定义配置清单。

I. 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>

II. 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>

III. 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;

IV. 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

V. 5,挂载部分键

只挂载部分键值,而非所有
​ items: 列出的键
​ key: 列出的值。对应文件内容以key对应的value
​ mode: 指定权限
​ path: 路径不能使用“..”

0 分享

您可以选择一种方式赞助本站

支付宝扫码赞助

支付宝扫码赞助

日期: 2018-10-28分类: kubernetes

标签: kubernetes

发表评论