• k8s之ConfigMap和Secret


    ConfigMap

    什么是ConfigMap?

    用来存储应用所需要的明文配置数据的。

    创建ConifgMap

    使用yaml定义ConfigMap对象,在data字段中定义配置数据。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: info
    
    data:
      count: '10'
      debug: 'on'
      path: '/etc/systemd'
      greeting: |
        say hello to kubernetes.
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    使用定义的yaml文件创建ConfigMap对象

    [root@k8s-worker1 zwf]# kubectl apply -f config.yaml  -n zwf
    configmap/info created
    
    [root@k8s-worker1 zwf]# kubectl get cm -n zwf
    NAME               DATA   AGE
    info               4      9s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Secret

    什么是Secret?

    和ConfigMap基本相同,差异在于存储的是密文的配置数据。

    具体的体现在于,使用kubectl describe时,ConfigMap可以看到配置信息,而Secret是看不到具体内容的。

    创建Secret

    使用yaml描述文件创建Secret对象,其中的数据必须得是base64编码的密文,否则会创建失败。

    apiVersion: v1
    kind: Secret
    metadata:
      name: user
    
    data:
      name: cm9vdA==  # root
      pwd: MTIzNDU2   # 123456
      db: bXlzcWw=    # mysql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    使用上面的yaml文件创建Secret对象

    [root@k8s-worker1 zwf]# kubectl apply -f secret.yaml -n zwf
    secret/user created
    
    [root@k8s-worker1 zwf]# kubectl get secret -n zwf
    NAME                                 TYPE                                  DATA   AGE
    user                                 Opaque                                3      9s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    通过查看Secret详情,会发现都是密文的,无法查看

    [root@k8s-worker1 zwf]# kubectl describe secret user -n zwf
    Name:         user
    Namespace:    zwf
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    db:    5 bytes
    name:  4 bytes
    pwd:   6 bytes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    但是还是可以通过自己通过base64解码来获取

    [root@k8s-worker1 zwf]# kubectl get secret user -n zwf -o json
    {
        "apiVersion": "v1",
        "data": {
            "db": "bXlzcWw=",
            "name": "cm9vdA==",
            "pwd": "MTIzNDU2"
        },
        "kind": "Secret",
        "metadata": {
            "annotations": {
                "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"data\":{\"db\":\"bXlzcWw=\",\"name\":\"cm9vdA==\",\"pwd\":\"MTIzNDU2\"},\"kind\":\"Secret\",\"metadata\":{\"annotations\":{},\"name\":\"user\",\"namespace\":\"zwf\"}}\n"
            },
            "creationTimestamp": "2022-08-31T01:43:30Z",
            "name": "user",
            "namespace": "zwf",
            "resourceVersion": "17208325",
            "uid": "c5082495-1b85-42ef-a202-596d65e2449c"
        },
        "type": "Opaque"
    }
    
    [root@k8s-worker1 zwf]#  kubectl get secret user -n zwf -o jsonpath="{.data.name}" | base64 --decode
    root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    如何使用ConfigMap/Secret

    使用的方式

    • 将配置以环境变量的方式注入到容器中,应用程序从环境变量中获取配置

    • 将配置以文件的方式放在容器的目录中,应用程序从文件中获取配置。

    注入环境变量

    定义Deployment的yaml文件,在containers下的env中使用configMapKeyRef来使用ConfigMap中的值作为环境变量。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: ngx-dep
      name: ngx-dep
    
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: ngx-dep
    
      template:
        metadata:
          labels:
            app: ngx-dep
        spec:
          containers:
          - image: mirrors.sangfor.com/nginx:alpine
            name: nginx2
            ports:
            - containerPort: 80
            env:
            - name: count
              valueFrom:
                configMapKeyRef:
                  name: info
                  key: count
            - name: debug
              valueFrom:
                configMapKeyRef:
                  name: info
                  key: debug
            - name: pwd
              valueFrom:
                secretKeyRef:
                  name: user
                  key: pwd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    使用上面定义的yaml创建Deployment对象

    [root@k8s-worker1 zwf]# kubectl apply -f deployments_cm.yaml -n zwf
    deployment.apps/ngx-dep created
    
    [root@k8s-worker1 zwf]# kubectl get deploy -n zwf
    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    ngx-dep   2/2     2            2           1h
    
    [root@k8s-worker1 zwf]# kubectl get pods -n zwf
    NAME                       READY   STATUS    RESTARTS   AGE
    ngx-dep-6c659bcc45-nnkgz   1/1     Running   0          8s
    ngx-dep-6c659bcc45-rgfxx   1/1     Running   0          6s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    进入到容器中,可以查看到我们设置debug、count、pwd的值

    [root@k8s-worker1 zwf]# kubectl exec -it ngx-dep-6c659bcc45-nnkgz -n zwf -- /bin/sh
    / # echo $debug
    on
    / # echo $count
    10
    / # echo $pwd
    123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注入配置文件

    编写描述Deployment文件,在sepc下定义两个volume,然后在containers下进行使用volumeMounts字段进行挂载。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: ngx-dep
      name: ngx-dep
    
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: ngx-dep
    
      template:
        metadata:
          labels:
            app: ngx-dep
        spec:
          containers:
          - image: mirrors.sangfor.com/nginx:alpine
            name: nginx2
            ports:
            - containerPort: 80
          - volumeMounts:
            - mountPath: /tmp/cm-items
              name: cm-vol
            - mountPath: /tmp/sec-items
              name: sec-vol
    
          volumes:
          - name: cm-vol
            configMap:
              name: info
    	  - name: sec-vol 
    	    secret: 
    	    secretName: user
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    创建该Deployment对象

    [root@k8s-worker1 zwf]# kubectl apply -f deployments_cm_file.yaml -n zwf
    deployment.apps/ngx-dep configured
    
    [root@k8s-worker1 zwf]# kubectl get pods -n zwf
    NAME                       READY   STATUS    RESTARTS   AGE
    ngx-dep-798f6f6c4f-cg6lv   1/1     Running   0          9s
    ngx-dep-798f6f6c4f-s8wws   1/1     Running   0          6s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    我们可以看到在容器内部在tmp目录下创建了cm-items和sec-items目录

    [root@k8s-worker1 zwf]# kubectl exec -it ngx-dep-798f6f6c4f-cg6lv -n zwf -- ls /tmp/
    cm-items   sec-items
    
    • 1
    • 2

    再看到这两个目录下的文件,都是以ConfigMap和Secret中定义的key为文件名,value为文件中的内容

    [root@k8s-worker1 zwf]# kubectl exec -it ngx-dep-798f6f6c4f-cg6lv -n zwf -- ls /tmp/cm-items
    count     debug     greeting  path
    [root@k8s-worker1 zwf]# kubectl exec -it ngx-dep-798f6f6c4f-cg6lv -n zwf -- cat /tmp/cm-items/debug
    on
    
    [root@k8s-worker1 zwf]# kubectl exec -it ngx-dep-798f6f6c4f-cg6lv -n zwf -- ls /tmp/sec-items
    db    name  pwd
    [root@k8s-worker1 zwf]# kubectl exec -it ngx-dep-798f6f6c4f-cg6lv -n zwf -- cat /tmp/sec-items/pwd
    123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    欢迎关注,互相学习,共同进步~

    我的个人博客

    我的微信公众号:编程黑洞

  • 相关阅读:
    项目文件上传到行云codeup teambition
    UE5 官方案例LyraStarter 全特性详解 5.LyraPlayerStart
    SQL之视图
    个人练习-PAT甲级-1132 Cut Integer
    如何简单创建一个 react 项目(使用脚手架)
    研究生选控制嵌入式还是机器视觉好?
    【Hello Go】Go语言并发编程
    java面试题及答案2020 大汇总
    丹磺酰荧光素/5-羧基四甲基罗丹明标记PCL聚已内酯纳米载体Dansyl-PCL|TMR-TK-PEG-PCL
    如何使用 JavaScript 导入和导出 Excel
  • 原文地址:https://blog.csdn.net/qq_22918243/article/details/126671003