Kubernetes--Configmap使用建立与读取方式

Configmap

Configmap如何建立?

  • 命令行建立
  • 指定文件形式建立
  • 指定一个目录建立
命令行建立
$ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
configmap/special-config created

$ kubectl get cm
NAME             DATA   AGE
special-config   2      4s
$ kubectl get configmaps special-config -o yaml
apiVersion: v1
data:
  special.how: very
  special.type: charm
kind: ConfigMap
metadata:
  creationTimestamp: "2020-08-01T12:14:17Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:special.how: {}
        f:special.type: {}
    manager: kubectl
    operation: Update
    time: "2020-08-01T12:14:17Z"
  name: special-config
  namespace: default
  resourceVersion: "18003"
  selfLink: /api/v1/namespaces/default/configmaps/special-config
  uid: 6c116e86-d6b3-4d32-be87-d32f9a608219

a.jpg

指定文件形式建立
$ kubectl create configmap nginx-config --from-file=./nginx.conf
configmap/nginx-config created
$ kubectl get configmap nginx-config -o yaml   
apiVersion: v1
data:
  nginx.conf: |
    #user  nobody;
    worker_processes  1;

    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;

    #pid        logs/nginx.pid;


    events {
        worker_connections  1024;
    }


    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"'
                  '$upstream_addr $upstream_status $request_time $upstream_response_time';


        access_log  /var/log/nginx/access.log main;
        error_log   /var/log/nginx/error.log;

        server_tokens off;
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        tcp_nopush      on;
        client_max_body_size 10m;
        client_body_buffer_size 128k;

        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
        proxy_buffer_size 64k;
        proxy_buffers 4 512k;
        proxy_busy_buffers_size 512k;
        proxy_temp_file_write_size 512k;
        proxy_temp_path   /data/nginx/proxy_temp;
        proxy_cache_path  /data/nginx/proxy_cache levels=1:2 keys_zone=cache_one:2000m inactive=3d max_size=500g;

        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        gzip  on;
        gzip_min_length 1k;
        gzip_buffers 4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types text/plain application/x-javascript text/css application/xml;
        gzip_vary on;

        upstream go {
            server www.cnblogs.com:80 weight=4;
            #server 42.121.252.58:80 weight=4;
        }

        server {

                listen    192.168.55.133:80;
                #server_name  www.cnblogs.com;
                access_log  /var/log/nginx/go.access.log main;
                error_log   /var/log/nginx/go.error.log error;


               location / {
                        proxy_cache cache_one;
                        #proxy_cache_valid  200 304 301 302 2h;
                        #proxy_cache_valid any 2h;
                        #expires 1d;
                        add_header X-Cache $upstream_cache_status;
                        proxy_pass  http://go;
                        proxy_cache_key    $uri$is_args$args;
               }

               location ~ /purge(/.*) {
                   allow              127.0.0.1;
                   allow              192.168.55.0/24;
                   deny               all;
                   proxy_cache_purge  cache_one $1$is_args$args;
            }

        }
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2020-08-01T12:19:48Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:nginx.conf: {}
    manager: kubectl
    operation: Update
    time: "2020-08-01T12:19:48Z"
  name: nginx-config
  namespace: default
  resourceVersion: "18116"
  selfLink: /api/v1/namespaces/default/configmaps/nginx-config
  uid: 2fb95961-a780-45ea-8db3-8ba85db1270d

b.jpg

b2.jpg

指定一个目录建立
$ cat >game/game.properties <<EOF                                
enemies=aliens   
lives=3         
enemies.cheat=true 
enemies.cheat.level=noGoodRotten
secret.conde.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
EOF

$ cat >game/ui.properties <<EOF                                  
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
EOF
$ ls -l game 
total 16
-rw-r--r--  1 ca0gu0  staff  159  8  1 20:28 game.properties
-rw-r--r--  1 ca0gu0  staff   83  8  1 20:28 ui.properties
$  kubectl create configmap game-config --from-file=./game
configmap/game-config created
$ kubectl get cm
NAME             DATA   AGE
game-config      2      5s
nginx-config     1      9m6s
special-config   2      14m
$ kubectl get cm game-config -o yaml
apiVersion: v1
data:
  game.properties: |
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.conde.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-08-01T12:28:49Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:game.properties: {}
        f:ui.properties: {}
    manager: kubectl
    operation: Update
    time: "2020-08-01T12:28:49Z"
  name: game-config
  namespace: default
  resourceVersion: "18299"
  selfLink: /api/v1/namespaces/default/configmaps/game-config
  uid: d71c3f79-e5f4-4932-a83d-96e861788d54

c.jpg


configmap如何读取?

  • 挂载到环境变量
  • 挂载到文件
挂载到环境变量
尝试将configmap配置挂载到环境变量,经过变量名读取(valueFrom方式)
$ cat configmap-multikeys.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm
$ cat pod-configmap-env-var-valueFrom.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: SPECIAL_LEVEL
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: SPECIAL_TYPE
  restartPolicy: Never
$ kubectl apply -f configmap-multikeys.yaml
configmap/special-config created

$ kubectl apply -f pod-configmap-env-var-valueFrom.yaml
pod/dapi-test-pod created

$ kubectl get cm
NAME             DATA   AGE
special-config   2      12s

$ kubectl get pod
NAME            READY   STATUS      RESTARTS   AGE
dapi-test-pod   0/1     Completed   0          12s

$ kubectl logs dapi-test-pod
very charm

d.jpg

挂载到文件
尝试将configmap配置挂载到Pod文件,从文件读取(volumeMounts方式)
# 将所有key都挂载成文件,文件名与key同名
ca0gu0@ca0gu0deMBP configmap % cat pod-configmap-volume.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod2
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        # Provide the name of the ConfigMap containing the files you want
        # to add to the container
        name: special-config
  restartPolicy: Never
$ kubectl apply -f pod-configmap-volume.yaml
pod/dapi-test-pod2 created

$ kubectl get pod
NAME             READY   STATUS      RESTARTS   AGE
dapi-test-pod2   0/1     Completed   0          3s

$ kubectl logs dapi-test-pod2   
SPECIAL_LEVEL
SPECIAL_TYPE

e.jpg

# 将指定的key挂载到指定文件,自动建立文件
$ cat pod-configmap-volume-specific-key.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod3
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh","-c","ls /etc/config/; cat /etc/config/keys /etc/config/keys2" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
        items:
        - key: SPECIAL_LEVEL
          path: keys
        - key: SPECIAL_TYPE
          path: keys2
  restartPolicy: Never
  
$ kubectl create -f pod-configmap-volume-specific-key.yaml
pod/dapi-test-pod3 created

$ kubectl logs dapi-test-pod3
keys       # 文件
keys2      # 文件
verycharm  # 打印获得的两个文件的内容

1596286627468.jpg

【完结】