• K8S配置管理---secret与configmap


    一、ConfigMap介绍

    1.1 概述

    在部署应用程序时,我们都会涉及到应用的配置,在容器中,如Docker容器中,如果将配置文件打入容器镜像,这种行为等同于写死配置,每次修改完配置,镜像就得重新构建。当然,我们也可以通过挂载包含该文件的卷进行配置管理和修改。而在k8s中,我们要讲一种更好的方式,即ConfigMap,这种资源对象的出现,更是极大的方便了应用程序的配置管理。
      ConfigMap是一个或多个key/value的形式保存在k8s中,内部可以管理变量也可以管理完整的配置文件内容。

    1.2 用法

    1. 生成容器内的环境变量,在pod中可以通过spec.env或者spec.envFrom进行引用。
    2. 设置容器启动命令的启动参数,前提是设置为环境变量。
    3. 以卷volume的方式挂载到容器内部的文件或目录,通过spec.volumes引用。

    注:在使用命令的时候注意单词: configmap等价于cm,cm算是简写,类似于deployment可以使用命令时写成deploy,service可以写成svc,namespace可以写成ns,pod可以写成po。

    1.3 创建

    1.3.1yaml文件方式创建

    示例:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: cm-test01
    5. data:
    6. appconf01: value01
    7. appconf02: value02

    命令:

    1. [root@k8s-master k8s]# kubectl create -f cm-test01.yaml
    2. configmap/cm-test01 created

    1.3.2 命令行方式创建

    • 读取文件方式(也可以是目录)通过--from-file参数从文件中读取。可以指定key的名称,若不指定,则默认使用文件名为key。
      如当前目录有一个配置文件为test.properties
    1. [root@k8s-master k8s]# cat test.properties
    2. key01:value01
    3. key02:value02
    4. conf01: value03

    命令:

    1. [root@k8s-master k8s]# kubectl create cm cm-test-file --from-file=test.properties
    2. configmap/cm-test-file created
    3. //指定参数方式,通过--from-literal指定keyxx=valuexx创建confimap中的data内配置属性。
    4. [root@k8s-master k8s]# kubectl create configmap cm-test-literal --from-literal=key01=value01 --from-literal=key02=value02
    5. configmap/cm-test-literal created

    1.4 查询

    1.4.1 查询configmap列表

    1. [root@k8s-master k8s]# kubectl get cm
    2. NAME DATA AGE
    3. cm-test-file 1 3m51s
    4. cm-test-literal 2 3m30s
    5. cm-test01 2 9m2s
    6. kube-root-ca.crt 1 4d16h

    1.4.2 查看configmap详细信息

    1. [root@k8s-master k8s]# kubectl describe cm cm-test01
    2. Name: cm-test01
    3. Namespace: default
    4. Labels:
    5. Annotations:
    6. Data
    7. ====
    8. appconf01:
    9. ----
    10. value01
    11. appconf02:
    12. ----
    13. value02
    14. Events:
    15. [root@k8s-master k8s]# kubectl describe cm cm-test-file
    16. Name: cm-test-file
    17. Namespace: default
    18. Labels:
    19. Annotations:
    20. Data
    21. ====
    22. test.properties:
    23. ----
    24. key01:value01
    25. key02:value02
    26. conf01: value03
    27. Events:
    28. [root@k8s-master k8s]# kubectl describe cm cm-test-literal
    29. Name: cm-test-literal
    30. Namespace: default
    31. Labels:
    32. Annotations:
    33. Data
    34. ====
    35. key01:
    36. ----
    37. value01
    38. key02:
    39. ----
    40. value02
    41. Events:

    1.4.3 查看yaml输出

    1. [root@k8s-master k8s]# kubectl get cm cm-test01 -o yaml
    2. apiVersion: v1
    3. data:
    4. appconf01: value01
    5. appconf02: value02
    6. kind: ConfigMap
    7. metadata:
    8. creationTimestamp: "2022-08-07T00:18:47Z"
    9. name: cm-test01
    10. namespace: default
    11. resourceVersion: "44876"
    12. uid: 7492a928-b163-4b86-a3dd-54a7fbe59a10
    13. [root@k8s-master k8s]# kubectl get configmap cm-test-file -o yaml
    14. apiVersion: v1
    15. data:
    16. test.properties: |+
    17. key01:value01
    18. key02:value02
    19. conf01: value03
    20. kind: ConfigMap
    21. metadata:
    22. creationTimestamp: "2022-08-07T00:23:58Z"
    23. name: cm-test-file
    24. namespace: default
    25. resourceVersion: "45341"
    26. uid: 818a39b4-cbaf-4643-9541-1119b4d61982
    27. [root@k8s-master k8s]# kubectl get cm cm-test-literal -o yaml
    28. apiVersion: v1
    29. data:
    30. key01: value01
    31. key02: value02
    32. kind: ConfigMap
    33. metadata:
    34. creationTimestamp: "2022-08-07T00:24:19Z"
    35. name: cm-test-literal
    36. namespace: default
    37. resourceVersion: "45372"
    38. uid: 051849e0-bf0a-4926-a549-2405dc4963cc

    1.5 更新

    1.5.1 edit

    [root@k8s-master k8s]# kubectl edit cm cm-test01
    configmap/cm-test01 edited

    1. [root@k8s-master k8s]# kubectl edit cm cm-test01
    2. configmap/cm-test01 edited

     

    通过kubectl describe cm cm-test01查看更新是否生效

    1. [root@k8s-master k8s]# kubectl describe cm cm-test01
    2. Name: cm-test01
    3. Namespace: default
    4. Labels: <none>
    5. Annotations: <none>
    6. Data
    7. ====
    8. appconf02:
    9. ----
    10. value02
    11. appconf01:
    12. ----
    13. value001
    14. Events: <none>

    1.5.2 apply

    直接更新yaml文件里的值,通过 kubectl apply -f configmap-test01.yaml重新发布一遍进行更新

    1.6 删除

    1.6.1 通过yaml文件方式删除

    $ kubectl delete -f configmap-test01.yaml

    1.6.2 直接删除资源

    kubectl delet cm cm-test01

    二、ConfigMap和Pod的使用

    容器应用对ConfigMap的使用主要是两种:
    1)通过环境变量获取ConfigMap的内容:spec.envspec.envFrom
    2)通过卷volume挂载的方式将ConfigMap的内容挂载到容器内部的文件或目录:spec.volumes

    以下内容均以上述的ConfigMap资源cm-test01为例

    2.1 环境变量方式

    sepc.env方式

    2.1.1 创建pod

    1. [root@k8s-master k8s]# vim pod-test01.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: cm-pod-test001
    6. spec:
    7. containers:
    8. - name: cm-test
    9. image: tomcat:8
    10. command: [ "/bin/sh", "-c", "env | grep APP"]
    11. env:
    12. - name: APPCONF01 # 定义环境变量的名称
    13. valueFrom: # key “appconf01”的值获取
    14. configMapKeyRef:
    15. name: cm-test01 # 环境变量的值来自于configmap cm-test01
    16. key: appconf01 # configmap中的配置key为appconf01
    17. - name: APPCONF02 # 定义环境变量的名称
    18. valueFrom: # key “appconf02”的值获取
    19. configMapKeyRef:
    20. name: cm-test01 # 环境变量的值来自于configmap cm-test01
    21. key: appconf02 # configmap中的配置key为appconf02
    22. restartPolicy: Never # 重启策略:从不。

     

    执行创建pod:

    1. [root@k8s-master k8s]# kubectl create -f pod-test01.yaml
    2. pod/cm-test001 created

    2.1.2 查看pod

    1. [root@k8s-master k8s]# kubectl get pods
    2. [root@k8s /cm/test]# kubectl get pods
    3. NAME READY STATUS RESTARTS AGE
    4. cm-pod-test001 0/1 Completed 0 1h

     2.1.3 查看pod日志

    1. [root@k8s-master k8s]# kubectl logs cm-pod-test001
    2. APPCONF01=value01
    3. APPCONF02=value02

    说明容器内部的环境变量使用ConfigMap中进行读取的

    spec.envFrom方式

    2.1.4 创建pod

    yaml文件

    1. [root@k8s-master k8s]# vim pod-test02.yaml
    2. piVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: cm-pod-test002
    6. spec:
    7. containers:
    8. - name: cm-test2
    9. image: tomcat:8
    10. command: [ "/bin/sh", "-c", "env"]
    11. envFrom:
    12. - configMapRef:
    13. name: cm-test01 # 根据ConfigMap cm-test01资源自动生成环境变量
    14. restartPolicy: Never

     

    执行创建pod:

    [root@k8s-master k8s]# kubectl create -f pod-test02.yaml

    2.1.5 查看pod:

    1. [root@k8s-master k8s]# kubectl get po
    2. NAME READY STATUS RESTARTS AGE
    3. cm-pod-test001 0/1 Completed 0 2h
    4. cm-pod-test002 0/1 Completed 0 1h

    注意:
    环境变量的名称受限制:[a-zA-Z][a-zA-Z0-9_]*,不能以数字或非法字符开头。

    2.2 卷挂载方式

    指定items

    1. [root@k8s-master k8s]# vim pod-test03.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: cm-pod-test003
    6. spec:
    7. containers:
    8. - name: cm-test3
    9. image: tomcat:8
    10. volumeMounts:
    11. - name: vm-01-1
    12. mountPath: /conf
    13. volumes:
    14. - name: vm-01-1
    15. configMap:
    16. name: cm-test-file
    17. items:
    18. - key: key-testproperties
    19. path: test.properties
    20. restartPolicy: Never

    不指定items

    1. [root@k8s-master k8s]# vim pod-test04.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: cm-pod-test004
    6. spec:
    7. containers:
    8. - name: cm-test4
    9. image: tomcat:8
    10. volumeMounts:
    11. - name: vm-02-2
    12. mountPath: /conf
    13. volumes:
    14. - name: vm-02-2
    15. configMap:
    16. name: cm-test-file
    17. restartPolicy: Never

    进入容器中查看

    [root@k8s-master k8s]# kubectl exec -it cm-pod-test004 -c cm-test4 -- bash


    进入容器后,ls /conf查看是否有test.properties文件。

    1. [root@k8s-master k8s]# kubectl exec -it cm-pod-test004 -c cm-test4 -- bash
    2. root@cm-pod-test004:/usr/local/tomcat# ls /conf
    3. test.properties

    2.3 补充

    关于--from-file的方式的创建指定key和不指定key的区别
    1)不指定key名
     

    1. 创建:
    2. [root@k8s-master k8s]# kubectl create cm cm-test-file --from-file=test.properties
    3. 输出:
    4. [root@k8s-master k8s]# kubectl get cm cm-test-file -o yaml

    2)指定key

    1. 2)指定key
    2. 创建:
    3. [root@k8s-master k8s]# kubectl create cm cm-test-file02 --from-file=tp=test.properties
    4. 输出:
    5. [root@k8s-master k8s]# kubectl get cm cm-test-file -o yaml

     

     若指定key的名称,configmap中将会使用指定名称;若不指定,则默认使用文件名为key。

    三、secret

    3.1 概述

    Secret对象与ConfigMap对象类似,但它主要用于存储以下敏感信息,例如密码,OAuth token和SSH key等等。将这些信息存储在secret中,和直接存储在Pod的定义中,或Docker镜像定义中相比,更加安全和灵活。

    3.2 secret类型

    Secret有三种类型:

    • Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
    • kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
    • kubernetes.io/service-account-token:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

    3.3 常见的Opaque Secret

    Opaque类型的Secret,其value为base64编码后的值。

    其他的参考Secret | Kubernetes

    3.3.1 从文件中创建Secret

    分别创建两个名为username.txt和password.txt的文件:

    1. [root@k8s-master k8s]# echo -n "admin" > ./username.txt
    2. [root@k8s-master k8s]# echo -n "123456" > ./password.txt
    3. [root@k8s-master k8s]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
    4. secret/db-user-pass created

    3.3.2 使用描述文件创建Secret

    1. [root@k8s-master k8s]# echo -n 'name' | base64
    2. bmFtZQ==
    3. [root@k8s-master k8s]# echo -n '123456' | base64
    4. MTIzNDU2

    创建secret

    1. [root@k8s-master k8s]# cat secret.yaml
    2. apiVersion: v1
    3. kind: Secret
    4. metadata:
    5. name: mysecret
    6. type: Opaque
    7. data:
    8. username: bmFtZQ==
    9. password: MTIzNDU2
    10. [root@k8s-master k8s]# kubectl create -f secret.yaml
    11. secret/mysecret created

     查看secret

    1. [root@k8s-master k8s]# kubectl get secrets | grep myse
    2. mysecret Opaque 2 109s
    3. [root@k8s-master k8s]# kubectl describe secrets mysecret
    4. Name: mysecret
    5. Namespace: default
    6. Labels:
    7. Annotations:
    8. Type: Opaque
    9. Data
    10. ====
    11. password: 6 bytes
    12. username: 4 bytes
    13. [root@k8s-master k8s]# kubectl get secrets mysecret -o yaml
    14. apiVersion: v1
    15. data:
    16. password: MTIzNDU2
    17. username: bmFtZQ==
    18. kind: Secret
    19. metadata:
    20. creationTimestamp: "2022-08-07T02:21:23Z"
    21. name: mysecret
    22. namespace: default
    23. resourceVersion: "58148"
    24. uid: 261bd305-2376-47bd-a0fe-5563fdde8752
    25. type: Opaque

    3.4 Secret的使用

    创建好Secret之后,可以通过两种方式使用:

    • 以Volume方式
    • 以环境变量方式

    3.4.1 将Secret挂载到Volume中

    1. [root@k8s-master k8s]# cat mypod1.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: mypod
    6. spec:
    7. containers:
    8. - name: mypod
    9. image: redis
    10. volumeMounts:
    11. - name: foo
    12. mountPath: "/etc/foo"
    13. readOnly: true
    14. volumes:
    15. - name: foo
    16. secret:
    17. secretName: mysecret

     

    1. [root@k8s-master k8s]# kubectl create -f mypod1.yaml
    2. pod/mypod created
    3. [root@k8s-master k8s]# kubectl get pods
    4. NAME READY STATUS RESTARTS AGE
    5. mypod 0/1 ContainerCreating 0 12s
    6. [root@k8s-master k8s]# kubectl get pods
    7. NAME READY STATUS RESTARTS AGE
    8. mypod 1/1 Running 0 30s

    进入pod查看挂载的Secret:

    1. [root@k8s-master k8s]# kubectl exec -it mypod /bin/bash
    2. kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
    3. root@mypod:/data# cd /etc/foo/
    4. root@mypod:/etc/foo# ls
    5. password username
    6. root@mypod:/etc/foo# cat password
    7. 123456root@mypod:/etc/foo# cat username
    8. nameroot@mypod:/etc/foo#

    也可以只挂载Secret中特定的key:

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: mypod
    5. spec:
    6. containers:
    7. - name: mypod
    8. image: redis
    9. volumeMounts:
    10. - name: foo
    11. mountPath: "/etc/foo"
    12. readOnly: true
    13. volumes:
    14. - name: foo
    15. secret:
    16. secretName: mysecret
    17. items:
    18. - key: username
    19. path: my-group/my-username

    在这种情况下:

    username 存储在/etc/foo/my-group/my-username中

    password未被挂载

    3.4.2 将Secret设置为环境变量

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: secret-env-pod
    5. spec:
    6. containers:
    7. - name: mycontainer
    8. image: redis
    9. env:
    10. - name: SECRET_USERNAME
    11. valueFrom:
    12. secretKeyRef:
    13. name: mysecret
    14. key: username
    15. - name: SECRET_PASSWORD
    16. valueFrom:
    17. secretKeyRef:
    18. name: mysecret
    19. key: password
    20. restartPolicy: Never
    1. [root@k8s-master k8s]# kubectl get pods
    2. NAME READY STATUS RESTARTS AGE
    3. mypod 1/1 Running 0 10m
    4. secret-env-pod 1/1 Running 0 37s
    5. [root@k8s-master secret]# kubectl exec -it secret-env-pod /bin/bash
    6. root@secret-env-pod:/data# env | grep -E "USERNAME|PASSWORD"
    7. SECRET_USERNAME=admin
    8. SECRET_PASSWORD=123456
    9. root@secret-env-pod:/data#

    3.5 一个MySQL密码注入pod样例

    3.5.1 创建secret

    [root@k8s-master k8s]# kubectl create secret generic test --from-literal=MYSQL_ROOT_PASSWORD=1234567

    3.5.2 查看yaml文件

    1. [root@k8s-master k8s]# vim myapp-demo.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. volumeMounts:
    25. - name: mysql
    26. mountPath: /test/
    27. volumes:
    28. - name: mysql
    29. secret:
    30. secretName: test

    3.5.3 启动pod,查看信息是否注入

    目录

    一、ConfigMap介绍

    1.1 概述

    1.2 用法

    1.3 创建

    1.3.1yaml文件方式创建

    1.3.2 命令行方式创建

    1.4 查询

    1.4.1 查询configmap列表

    1.4.2 查看configmap详细信息

    1.4.3 查看yaml输出

    1.5 更新

    1.5.1 edit

    1.5.2 apply

    1.6 删除

    1.6.1 通过yaml文件方式删除

    1.6.2 直接删除资源

    二、ConfigMap和Pod的使用

    2.1 环境变量方式

    2.1.1 创建pod

    2.1.2 查看pod

     2.1.3 查看pod日志

    2.1.4 创建pod

    2.1.5 查看pod:

    2.2 卷挂载方式

    2.3 补充

    三、secret

    3.1 概述

    3.2 secret类型

    3.3 常见的Opaque Secret

    3.3.1 从文件中创建Secret

    3.3.2 使用描述文件创建Secret

    3.4 Secret的使用

    3.4.1 将Secret挂载到Volume中

    3.4.2 将Secret设置为环境变量

    3.5 一个MySQL密码注入pod样例

    3.5.1 创建secret

    3.5.2 查看yaml文件

    3.5.3 启动pod,查看信息是否注入


  • 相关阅读:
    sklearn快速入门教程:处理分类型数据
    DataOps 不是工具,而是帮助企业实现数据价值的最佳实践
    5 个读者提问,如果是你该怎么回答?
    【STM32学习(3)】STM32——简述中断的基础知识
    java: 无法访问org.mybatis.spring.annotation.MapperScan
    Mysql 字符集修改方案及说明
    LeetCode-17-电话号码的字母组合
    Java获取本机IP地址的方法(内网、公网)
    【Vue基础九】--父子组件传值
    聚焦天线组件如何提升无线物联网设备的功率效率
  • 原文地址:https://blog.csdn.net/L2111533547/article/details/126205760