8-1 configmap

configmap
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMaP将环境配置信息和容器镜像解耦,便于应用配置的修改。比如:使用ConfigMap来将你的配置数据和应用程序代码分开

ConfigMap 对象 :
ConfigMap是一个API对象,让你可以存储其他对象所需要使用的配置。和其他Kubernetes对象都有一个spec不同的是,ConfigMap使用data和binaryData 字段。这些字段能够接收键-值对作为其取值。data和 binaryData字段都是可选的。data字段设计用来保存 UTF-8 字节序列,而binaryData则被设计用来保存二进制数据作为base64编码的字串。
ConfigMap的名字必须是一个合法的DNS子域名。
data或binaryData字段下面的每个键的名称都必须由字母数字字符或者 -、_ 或.组成。在data下保存的键名不可以与在binaryData下出现的键名有重叠

给容器内应用程序传递参数的实现方式:
1. 将配置文件直接打包到镜像中,但这种方式不推荐使用,因为修改配置不够灵活。
2. 通过定义Pod清单时,指定自定义命令行参数,即设定 args:["命令参数"],这种也
可在启动Pod时,传参来修改Pod的应用程序的配置文件.
3. 使用环境变量来给Pod中应用传参修改配置
,但要使用此种方式,必须符合以下前提之一:
   1) Pod中的应用程序必须是Cloud Native的应用程序,即支持直接通过环境变量来加载配置信息。
   2) 通过定义Entrypoint脚本的预处理变量来修改Pod中应用程序的配置文件,这些Entrypoint脚本
可以使用set,sed,grep等工具来实现修改,但也要确保容器中有这些工具。
4.存储卷: 我们可将配置信息直接放到存储卷中,如PV中,Pod启动时,自动挂载存储卷到配置文件目录,
来实现给Pod中应用提供不同的配置。
5. configMap 或 secret

可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:
1 在容器命令和参数内
2 容器的环境变量
3 在只读卷里面添加一个文件,让应用来读取
4 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

让Pod引用configMap中的环境变量的方式:
  kubectl explain pods.spec.containers.env    #env也可直接定义传递给Pod中容器的环境变量,这点需要记住。
    env.valueFrom
       configMapKeyRef: 可用于定义Pod启动时引用的configMapKey是哪个。
       fieldRef: 也可引用一个字段,为Pod中容器内应用程序的每个环境变量值,如:
       metadata.name: 引用Pod的名称
       metadata.namespace: 引用Pod所在的名称空间名
       metadata.labels: 引用Pod的标签
       status.hostIP: 引用Pod所在节点的IP
       status.podIP: 引用Pod的IP
       resourceFieldRef: 引用一个资源需求 或 资源限制
       secretKeyRef: 引用一个secretKey来为Pod传参

1、在命令行直接创建configmap
# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=myapp.test.com
# kubectl get configmap
# kubectl describe cm nginx-config

Name:         nginx-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
nginx_port:
----
80
server_name:
----
www.test.com

BinaryData
====

Events:  <none>

2、通过指定的文件创建configmap
cat www.conf
    server {
        server_name www.test.com;
        listen 80;
     root /data/nginx/test/
   }
# kubectl create configmap nginx-www --from-file=./www.conf 
可以看到指定文件创建时configmap会创建一个key/value对,key是文件名,value是文件内容

假如不想configmap中的key为默认的文件名,还可以在创建时指定key名字:
# 这个是定义了一个key叫www, 其值为www.conf的内容
kubectl create configmap nginx-www --from-file=www=./www.conf 

# kubectl get cm nginx-www -oyaml
apiVersion: v1
data:
  www.conf: |
    server {
        server_name www.test.com;
        listen 80;
        root /data/nginx/test/
      }
kind: ConfigMap
metadata:
  creationTimestamp: "2021-10-25T08:30:12Z"
  name: nginx-www
  namespace: default
  resourceVersion: "1142435"
  selfLink: /api/v1/namespaces/default/configmaps/nginx-www
  uid: 86162191-96e4-486f-8298-943b9d0c3f40

3、通过yaml文件创建configmap
# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-demo
data:
  # 类属性键;每一个键都映射到一个简单的值
  player_initial_lives: "3"
  ui_properties_file_name: 'user-interface.properties'

  # 类文件键
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true

4、给Pod中的容器传递configMap定义的变量的示例:
(1)使用valueFrom、configMapKeyRef、name、key指定要用的key:
vim  pod-configmap1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-1
  namespace: default
  labels:
     app: myapp
     tier: frontend
  annotations:
     test.com/created-by: "cluster admin"
spec:
  containers:
  -  name: myapp
     image: ikubernetes/myapp:v1
     ports:
     -   name: http
         containerPort: 80
     env:
     - name: NGINX_SERVER_PORT
       valueFrom:
         configMapKeyRef:
            name: nginx-config
            key: nginx_port
     - name:NGINX_SERVER_NAME
       valueFrom:
          configMapKeyRef:
            name: nginx-config
            key: server_name
# kubectl apply -f pod-configmap1.yaml

(2)还可以通过envFrom、configMapRef、name使得configmap中的所有key/value对都自动变成环境变量:
通过envFrom会把ConfigMap的所有键值对都映射到Pod的环境变量中去。使用如下:
apiVersion: v1
kind: Pod
metadata:
  name: pkslow-env-env-from
spec:
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
        - configMapRef:
            name: pkslow-yaml
  restartPolicy: Never

5、通过共享卷的方式来挂载configmap:
5.1通过volume的方式把ConfigMap加载进Pod
vim  pod-configmap-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-2
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    test.com/created-by: "cluster admin"
spec:
 containers:
 - name: myapp
   image: ikubernetes/myapp:v1
   ports:
   - name: http
     containerPort: 80
   volumeMounts:
   - name: nginxconf
     mountPath: /etc/nginx/config.d/   #挂载点不存在,Pod会自动创建.
     readOnly: true       #不能让容器修改配置的内容。
volumes:
-  name: nginxconf        #定义存储卷的名字为nginxconf
   configMap:
     name: nginx-config   #要挂载nginx-config这个configMap
# kubectl apply -f pod-configmap-2.yaml

5.2如果只想要ConfigMap的部分内容,并自定义文件名,可通过items来配置
apiVersion: v1
kind: Pod
metadata:
  name: pkslow-mount-volume
spec:
  volumes:
    - name: config-volume
      configMap:
        name: pkslow-yaml
        items:
          - key: application.yaml
            path: app.yaml
          - key: application-uat.yaml
            path: uat.yaml
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "sleep 1000000" ]
      imagePullPolicy: IfNotPresent
      volumeMounts:
        - name: config-volume
          mountPath: /data/config
5.3通过subPath加载
通过配置subPath字段,把文件一个一个加载到Pod中去:

apiVersion: v1
kind: Pod
metadata:
  name: pkslow-mount-subpath
spec:
  volumes:
    - name: config-volume
      configMap:
        name: pkslow-yaml
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "sleep 1000000" ]
      imagePullPolicy: IfNotPresent
      volumeMounts:
        - name: config-volume
          mountPath: /data/config/dev.yaml
          subPath: application.yaml
        - name: config-volume
          mountPath: /data/config/uat.yaml
          subPath: application-uat.yaml
  restartPolicy: Never

备注:使用的configmap内容如下:
kubectl get configmaps pkslow-file -o yaml:

apiVersion: v1
data:
  application-uat.yaml: |-
    server:
      port: 8080
    pkslow:
      name: LarryDpk
      age: 20
      webSite: https://www.pkslow.com
  application.yaml: |-
    server:
      port: 8080
    pkslow:
      name: Larry
      age: 18
      webSite: www.pkslow.com
kind: ConfigMap
metadata:
  name: pkslow-file
  namespace: default

5.4 多个configmap合并在一起:
# kubectl get configmap -o yaml
apiVersion: v1
items:
- apiVersion: v1
  data:
    game.properties: |+   ##### 本段最后有一行空格,+ 表示保留字符串行末尾的换行
      enemies=aliens
      lives=3
      enemies.cheat=true
      enemies.cheat.level=noGoodRotten
      secret.code.passphrase=UUDDLRLRBABAs
      secret.code.allowed=true
      secret.code.lives=30

    ui.properties: |
      color.good=purple
      color.bad=yellow
      allow.textmode=true
      how.nice.to.look=fairlyNice
  kind: ConfigMap
  metadata:
    creationTimestamp: "2020-06-07T06:57:28Z"
    name: game-config
    namespace: default
    resourceVersion: "889177"
    selfLink: /api/v1/namespaces/default/configmaps/game-config
    uid: 6952ac85-ded0-4c5e-89fd-b0c6f0546ecf
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""


其它示例:
ConfigMaps 和 Pods
引用ConfigMap的Pod的spec,并根据ConfigMap中的数据在该Pod中配置容器。这个Pod和ConfigMap必须要在同一个名字空间中。
configmap示例:
apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
    # 类属性键;每一个键都映射到一个简单的值
    player_initial_lives: "3"
    ui_properties_file_name: "user-interface.properties"

  # 类文件键
    game.properties: |
        enemy.types=aliens,monsters
        player.maximum-lives=5    
    user-interface.properties: |
        color.good=purple
        color.bad=yellow
        allow.textmode=true
# kubectl get configmap

使用configmap的POD示例:
apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  containers:
    - name: demo
      image: alpine
      command: ["sleep", "3600"]
      env:
        # 定义环境变量
        - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的
          valueFrom:
            configMapKeyRef:
              name: game-demo           # 这个值来自这个ConfigMap
              key: player_initial_lives # 需要取值的键
        - name: UI_PROPERTIES_FILE_NAME
          valueFrom:
            configMapKeyRef:
              name: game-demo
              key: ui_properties_file_name
      volumeMounts:
      - name: config
        mountPath: "/config"
        readOnly: true
  volumes:
    # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
    - name: config
      configMap:
        # 提供你想要挂载的 ConfigMap 的名字
        name: game-demo
        # 来自 ConfigMap 的一组键,将被创建为文件
        items:
        - key: "game.properties"
          path: "game.properties"
        - key: "user-interface.properties"
          path: "user-interface.properties"
# kubectl get pods 

 

posted @ 2022-11-14 23:50  Sky-wings  阅读(99)  评论(0编辑  收藏  举报