• k8s的configMap基本概念及案例


    pod中两种特殊类型的存储卷:secret,configMap
      pod.spec.volumes.secret
      pod.spec.volumes.configMap
    多数情况下,这两个存储卷不是给pod做存储空间来用的,而是给我们的管理员或者用户提供了从集群外部向pod内部的应用注入配置信息的方式。
    configMap里放的是配置信息
    configMap的主要作用是:让配置信息与镜像文件结藕,配置信息可以通过configMap注入。
    简单来讲,一个configMap就是一系列配置数据的集合,而这些数据将来可以注入到pod对象中的容器中,以供使用。
    而注入方式有两种:1,直接把configMap当存储卷。2,使用env的envFrom应用configMap当中所保存的数据
    在每一个configMap中所有的配置信息都保存为键值格式。
    configMap属于名称空间级别的资源。

    configMap里面的配置信息是明文的。
    secret相对于configMap,功能上是相似的,但是secret是以其他编码方式去记录配置信息的,但是也可以被解读,只不过有技术门槛,不是那么容易就被解读的。
    使用base64是可以解读的:echo ******** | base64 -d
    ********是kubectl describe secret secretName -o yaml中的值的编码

    配置容器化应用的方式:
        1.自定义命令行参数;
           args:[ ]
        2.把配置文件直接焙进镜像;
        3.环境变量;
          (1)Cloud Native的应用程序一般可直接通过环境变量加载配置;
          (2)通过entrypoint脚本来预处理变量为配置文件中的配置信息;
        4.存储卷;
    pod资源环境变量的获取方式:
    在pod中我们要想通过环境变量传递内容、传递数据、传递信息给pod中的容器
    我们需要在容器上使用env、value、或valueFrom来获取数据;
    在pod.spec.containers.env{name,value}/{valueFrom}
    pod.spec.containers.env.valueFrom.{configMapKeyRef:configMap}/{fieldRef:引用配置文件的某个字段:metadata...}/{resourceFieldRef:资源限制}/{secretKeyRef:secret}

    使用valueFrom方式获取配置的方式:
    pod.spec.containers.env.valueFrom.configMapKeyRef
    pod.spec.containers.env.valueFrom.secretKeyRef
    kubectl create configMap configMapName --from-file=key1=file1url --from-file=keyN=fileNurl 此时以文件名为key,以文件内容为value
    详情:kubectl create configmap --help

    例:
    创建一个pod,创建一个configMap,pod用env引用configMap定义的key和value。
    1.先创建configMap

     1 kubectl create cm cm-1 --from-literal=nginx_port=80 --from-literal=server_name=myapp.smbands.com
     2 kubectl describe cm cm-1
     3 Name:         cm-1
     4 Namespace:    default
     5 Labels:       <none>
     6 Annotations:  <none>
     7 
     8 Data
     9 ====
    10 nginx_port:
    11 ----
    12 80
    13 server_name:
    14 ----
    15 myapp.smbands.com
    16 Events:  <none>

    2.创建pod

     1 vim myapp-pod.yaml
     2 apiVersion: apps/v1
     3 kind: Deployment
     4 metadata:
     5   name: myapp-demo
     6   namespace: default
     7 spec:
     8   replicas: 1
     9   selector:
    10     matchLabels:
    11       app: myapp
    12   template:
    13     metadata:
    14       labels:
    15         app: myapp
    16     spec:
    17       containers:
    18       - name: myapp
    19         image: ikubernetes/myapp:v1
    20         imagePullPolicy: IfNotPresent
    21         ports:
    22         - name: http
    23           containerPort: 80
    24         env:
    25         - name: NGINX_SERVER_PORT
    26           valueFrom:
    27             configMapKeyRef:
    28               name: cm-1
    29               key: nginx_port
    30         - name: NGINX_SERVER_NAME
    31           valueFrom:
    32             configMapKeyRef:
    33               name: cm-1
    34               key: server_name

    3.运行pod查看env

    1 kubectl apply -f myapp-pod.yaml
    2 kubectl exec myapp-pod-5db6d54bb7-rjhkz -- printenv
    3 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    4 HOSTNAME=myapp-demo-5db6d54bb7-rjhkz
    5 NGINX_SERVER_PORT=80
    6 NGINX_SERVER_NAME=myapp.smbands.com

    当我们使用环境变量注入时,只在pod启动时加载生效
    如上示例如果更改configMap中的key或value,容器中的env只会在重启容器时生效。

    当然我们可以使用存储卷方式来实时获取configMap里的数据。
    只不过存储卷方式,configMap挂载到pod中的某个目录下每个键成为文件名,对应值成为文件内容。也就是说,把configMap中的键值以文件方式挂载到pod中。
    例:创建一个pod,创建一个configMap,pod使用挂载卷方式引用configMap里的主机配置内容,pod运行后可直接使用指定主机访问。
    1.创建configMap:

     1 vim www.config
     2 server {
     3         server_name myapp.smbands.com;
     4         listen 80;
     5         root /data/web/html;
     6         }
     7 kubectl create cm cm-2 --from-file=www.conf
     8 kubectl describe cm cm-2
     9 Name:         cm-2
    10 Namespace:    default
    11 Labels:       <none>
    12 Annotations:  <none>
    13 
    14 Data
    15 ====
    16 www.conf:
    17 ----
    18 server {
    19    server_name myapp.smbands.com;
    20    listen 80;
    21    root /data/web/html;
    22 }
    23 
    24 Events:  <none>

    2.创建pod

     1 vim myapp-pod-1.yaml
     2 apiVersion: apps/v1
     3 kind: Deployment
     4 metadata:
     5   name: myapp-1
     6   namespace: default
     7 spec:
     8   replicas: 1
     9   selector:
    10     matchLabels:
    11       app: myapp
    12   template:
    13     metadata:
    14       labels:
    15         app: myapp
    16     spec:
    17       containers:
    18       - name: myapp
    19         image: ikubernetes/myapp:v1
    20         imagePullPolicy: IfNotPresent
    21         ports:
    22         - name: http
    23           containerPort: 80
    24         volumeMounts:
    25         - name: wwwconf
    26           mountPath: /etc/nginx/conf.d/
    27       volumes:
    28       - name: wwwconf
    29         configMap:
    30           name: cm-2

    3.启动pod,查看挂载点目录。

    1 kubectl apply -f myapp-pod-1.yaml
    2 kubectl exec myapp-1-5b5fc74c6-jd2b7 -- cat /etc/nginx/conf.d/www.conf    
    3 server {
    4     server_name myapp.smbands.com;
    5      listen 80;
    6      root /data/web/html;
    7 }          

    此时可以修改hosts文件,在发布路径下写测试页,然后就可以curl myapp.smbands.com

    4.修改configMap cm-2的listen 80 为listen 8080
    kubectl edit cm cm-2 修改80为8080
    等待片刻,再查看

    1 kubectl exec myapp-1-5b5fc74c6-jd2b7 -- cat /etc/nginx/conf.d/www.conf
    2 server {
    3     server_name myapp.smbands.com;
    4      listen 8080;
    5      root /data/web/html;
    6 }      

    注意:这里储存卷挂载方式可以实时注入信息,但是不一定注入的信息都能生效。
    比如此例,虽然cm-2修改为8080,pod中的配置文件也同步为8080,但是nginx的监听地址还是80,需要重载配置文件才能生效。 

  • 相关阅读:
    Linux下的”锁“事儿
    拿得起,放得下,想得开
    关于TCP协议握手的那些事儿

    C++中的RTTI机制解析
    C/C++中产生随机数
    数据库-事务和锁
    JS 数组Array常用方法
    C# 压缩 SharpZipLib
    正则表达式学习3-负向零宽断言
  • 原文地址:https://www.cnblogs.com/Smbands/p/10876940.html
Copyright © 2020-2023  润新知