• k8s配置资源管理


    目录

    Secret

    前瞻

    实操

    创建 Secret

    使用方式

    ConfigMap

    前瞻

    实操

    创建 ConfigMap

    Pod 中使用 ConfigMap

     用 ConfigMap 设置命令行参数

     通过数据卷插件使用ConfigMap

    ConfigMap 的热更新


    Secret

    前瞻

    Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。
    Secret 有四种类型

    ●kubernetes.io/service-account-token:由 Kubernetes 自动创建,用来访问 APIServer 的 Secret,Pod 会默认使用这个 Secret 与 APIServer 通信, 并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中;
    ●Opaque :base64 编码格式的 Secret,用来存储用户自定义的密码、密钥等,默认的 Secret 类型;
    ●kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息。
    ●kubernetes.io/tls :用来存储 TLS 证书和私钥信息。

    创建Secret资源

    kubectl create secret generic <资源名称> --from-file=文件|目录  --from-literal=<键名>=<键值>
    kubectl create secret docker-registry <资源名称> --docker-server=<私有仓库URL路径> --docker-username=<仓库用户名> --docker-password=<用户密码> --docker-email=<邮箱地址>
    kubectl create secret tls <资源名称> --cert=证书文件 --key=私钥文件

     查看Secret资源(键值会以base64编码格式加密显示)

    kubectl get -n <命名空间> secret -o yaml
    kubectl describe -n <命名空间> secret

     使用Secret资源(三种)

     作为存储卷挂载的方式:
    在Pod资源配置中用spec.volumes字段设置secret类型的卷
    在容器配置中用volumeMounts将卷挂载到容器的指定的目录,Secret资源数据的键名会作为文件名,Secret资源数据的键值会作为文件内容

    作为容器环境变量的方式:
    在容器配置中用env.name字段自定义容器的环境变量名,用env.valueFrom.secretKeyRef.key/name字段指定环境变量的值从哪个Secret资源的键获取
    在容器配置中用envFrom.secretRef.name字段指定Secret资源的名称,使得Secret资源数据的键名和键值直接作为容器的环境变量名和值

    Pod配置从私有仓库拉取镜像:
    在Pod资源配置中用spec.imagePullSecrets.name字段指定kubernetes.io/dockerconfigjson类型的Secret资源名称

    实操

    创建 Secret

    用kubectl create secret命令创建Secret

    1. echo -n 'zhangsan' > username.txt
    2. echo -n 'abc1234' > password.txt
    3. kubectl create secret generic mysecret --from-file=username.txt --from-file=password.txt
    4. kubectl get secrets
    5. kubectl describe secret mysecret
    6. #get或describe指令都不会展示secret的实际内容,这是出于对数据的保护的考虑

     

    内容用 base64 编码,创建Secret

    1. echo -n zhangsan | base64
    2. emhhbmdzYW4K=
    3. echo -n abc1234 | base64
    4. YWJjMTIzNAo==
    5. vim secret.yaml
    6. apiVersion: v1
    7. kind: Secret
    8. metadata:
    9. name: mysecret1
    10. type: Opaque
    11. data:
    12. username: emhhbmdzYW4K=
    13. password: YWJjMTIzNAo==
    14. kubectl create -f secret.yaml
    15. kubectl get secrets
    16. kubectl get secret mysecret1 -o yaml

    使用方式

    将 Secret 挂载到 Volume 中,以 Volume 的形式挂载到 Pod 的某个目录下

    1. vim secret-test.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: mypod
    6. spec:
    7. containers:
    8. - name: nginx
    9. image: nginx
    10. volumeMounts:
    11. - name: secrets
    12. mountPath: "/etc/secrets"
    13. readOnly: true
    14. volumes:
    15. - name: secrets
    16. secret:
    17. secretName: mysecret
    18. kubectl create -f secret-test.yaml
    19. kubectl get pods
    20. kubectl exec -it mypod bash

     

    将 Secret 导出到环境变量中 

    1. vim secret-test1.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: mypod1
    6. spec:
    7. containers:
    8. - name: nginx
    9. image: nginx
    10. env:
    11. - name: TEST_USER
    12. valueFrom:
    13. secretKeyRef:
    14. name: mysecret1
    15. key: username
    16. - name: TEST_PASSWORD
    17. valueFrom:
    18. secretKeyRef:
    19. name: mysecret1
    20. key: password
    21. envFrom:
    22. - secretRef:
    23. name: mysecret1
    24. kubectl apply -f secret-test1.yaml
    25. kubectl get pods
    26. kubectl exec -it mypod bash

     

    ConfigMap

    前瞻

    与Secret类似,区别在于ConfigMap保存的是不需要加密配置的信息。
    ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。
    应用场景:应用配置
    创建cm资源

    kubectl create cm <资源名称> --from-file=文件|目录  --from-literal=<键名>=<键值>
    

    查看cm资源数据

    1. kubectl get -n <命名空间> cm -o yaml
    2. kubectl describe -n <命名空间> cm

    使用cm资源

    作为存储卷挂载的方式:
    在Pod资源配置中用spec.volumes字段设置configMap类型的卷
    在容器配置中用volumeMounts将卷挂载到容器的指定的目录,cm资源数据的键名会作为文件名,cm资源数据的键值会作为文件内容(支持热更新
    在容器配置中用volumeMounts.subPath字段指定文件名,实现将卷挂载到容器中指定的文件上(不支持热更新)

    作为容器环境变量的方式:(不支持热更新)
    在容器配置中用env.name字段自定义容器的环境变量名,用env.valueFrom.configMapKeyRef.key/name字段指定环境变量的值从哪个cm资源的键获取
    在容器配置中用envFrom.configMapRef.name字段指定cm资源的名称,使得cm资源数据的键名和键值直接作为容器的环境变量名和值

    实操

    创建 ConfigMap

    使用目录创建

    1. mkdir /opt/configmap/
    2. vim /opt/configmap/game.config
    3. enemy.types=aliens,monsters
    4. player.maximum-lives=5
    5. vim /opt/configmap/ui.config
    6. color.good=purple
    7. color.bad=yellow
    8. allow.textmode=true
    9. ls /opt/configmap/
    10. game.config
    11. ui.config
    12. kubectl create configmap game-config --from-file=/opt/configmap/
    13. #--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
    14. kubectl get cm
    15. kubectl get cm game-config -o yaml

    使用文件创建

    只要指定为一个文件就可以从单个文件中创建 ConfigMap
    --from-file 这个参数可以使用多次,即可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的

    1. kubectl create configmap game-config-2 --from-file=/opt/configmap/game.config --from-file=/opt/configmap/ui.config
    2. kubectl get configmaps game-config-2 -o yaml
    3. kubectl describe cm game-config-2


     

    使用字面值创建

    使用文字值创建,利用 --from-literal 参数传递配置信息,该参数可以使用多次,格式如下
     

    1. kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=good
    2. kubectl get configmaps special-config -o yaml

     

    Pod 中使用 ConfigMap

    使用 ConfigMap 来替代环境变量

    1. vim env.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: special-config
    6. namespace: default
    7. data:
    8. special.how: very
    9. special.type: good
    10. ---
    11. apiVersion: v1
    12. kind: ConfigMap
    13. metadata:
    14. name: env-config
    15. namespace: default
    16. data:
    17. log_level: INFO
    18. kubectl create -f env.yaml
    19. kubectl get cm

    Pod的创建

    1. vim test-pod.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: test-pod
    6. spec:
    7. containers:
    8. - name: busybox
    9. image: busybox:1.28.4
    10. command: [ "/bin/sh", "-c", "env" ]
    11. env:
    12. - name: SPECIAL_HOW_KEY
    13. valueFrom:
    14. configMapKeyRef:
    15. name: special-config
    16. key: special.how
    17. - name: SPECIAL_TYPE_KEY
    18. valueFrom:
    19. configMapKeyRef:
    20. name: special-config
    21. key: special.type
    22. envFrom:
    23. - configMapRef:
    24. name: env-config
    25. restartPolicy: Never
    26. kubectl create -f test-pod.yaml
    27. kubectl get pods
    28. kubectl logs test-pod

     

     用 ConfigMap 设置命令行参数

    1. vim test-pod2.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: test-pod2
    6. spec:
    7. containers:
    8. - name: busybox
    9. image: busybox:1.28.4
    10. command:
    11. - /bin/sh
    12. - -c
    13. - echo "$(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)"
    14. env:
    15. - name: SPECIAL_HOW_KEY
    16. valueFrom:
    17. configMapKeyRef:
    18. name: special-config
    19. key: special.how
    20. - name: SPECIAL_TYPE_KEY
    21. valueFrom:
    22. configMapKeyRef:
    23. name: special-config
    24. key: special.type
    25. envFrom:
    26. - configMapRef:
    27. name: env-config
    28. restartPolicy: Never
    29. kubectl create -f test-pod2.yaml
    30. kubectl get pods
    31. kubectl logs test-pod2

     通过数据卷插件使用ConfigMap

    在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容

    1. vim test-pod3.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: test-pod3
    6. spec:
    7. containers:
    8. - name: busybox
    9. image: busybox:1.28.4
    10. command: [ "/bin/sh", "-c", "sleep 36000" ]
    11. volumeMounts:
    12. - name: config-volume
    13. mountPath: /etc/config
    14. volumes:
    15. - name: config-volume
    16. configMap:
    17. name: special-config
    18. restartPolicy: Never
    19. kubectl create -f test-pod3.yaml
    20. kubectl get pods
    21. kubectl exec -it test-pod3 sh
    22. # cd /etc/config/
    23. # ls
    24. special.how special.type
    25. # cat special.how
    26. # cat special.type


    ConfigMap 的热更新

    1. vim test-pod4.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: log-config
    6. namespace: default
    7. data:
    8. log_level: INFO
    9. ---
    10. apiVersion: apps/v1
    11. kind: Deployment
    12. metadata:
    13. name: my-nginx
    14. spec:
    15. selector:
    16. matchLabels:
    17. app: nginx
    18. replicas: 1
    19. template:
    20. metadata:
    21. labels:
    22. app: nginx
    23. spec:
    24. containers:
    25. - name: my-nginx
    26. image: nginx
    27. ports:
    28. - containerPort: 80
    29. volumeMounts:
    30. - name: config-volume
    31. mountPath: /etc/config
    32. volumes:
    33. - name: config-volume
    34. configMap:
    35. name: log-config
    36. kubectl apply -f test-pod4.yaml
    37. kubectl get pods

     

     

    1. kubectl exec -it my-nginx-c4d7b87df-fm7tr -- cat /etc/config/log_level
    2. INFO
    3. kubectl edit configmap log-config
    4. apiVersion: v1
    5. data:
    6. log_level: DEBUG #INFO 修改成 DEBUG
    7. kind: ConfigMap
    8. metadata:
    9. annotations:
    10. kubectl.kubernetes.io/last-applied-configuration: |
    11. {"apiVersion":"v1","data":{"log_level":"DEBUG"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"log-config","namespace":"default"}}
    12. creationTimestamp: "2024-03-07T07:41:49Z"
    13. name: log-config
    14. namespace: default
    15. resourceVersion: "253476"
    16. selfLink: /api/v1/namespaces/default/configmaps/log-config
    17. uid: f972c8ca-1228-4eb1-b4ac-a44a40c6c488

    1. //等大概10秒左右,使用该 ConfigMap 挂载的 Volume 中的数据同步更新
    2. kubectl exec -it my-nginx-c4d7b87df-fm7tr -- cat /etc/config/log_level
    3. DEBUG
    4. //ConfigMap 更新后滚动更新 Pod
    5. 更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过在 .spec.template.metadata.annotations 中添加 version/config ,每次通过修改 version/config 来触发滚动更新
    6. kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210525" }}}}}'
    7. kubectl get pods

     

    PS:

    更新 ConfigMap 后 

    ●使用该 ConfigMap 挂载的 Env 不会同步更新。
    ●使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。

  • 相关阅读:
    (建议收藏)TCP协议灵魂之问,巩固你的网路底层基础
    酷开科技全球化智能大屏OS——Coolita ,将大屏数字化服务进行到底
    软件设计模式系列之一——设计模式概述
    【配置nacos】使用application.yml配置文件来配置spring-cloud-starter-alibaba-nacos-config
    Node.js详解(--模块内容详解(同步与异步,fs,url))
    DTC商业模式研报 | 创新DTC策略利于提升业务灵活性和数字化体验
    javascript设计模式 持续追加
    golang生成根证书,服务端证书,用于 tls
    基于vue和nodejs毕业设计酒店预约管理系统
    uniapp+vue3使用pinia,安卓端报错白屏
  • 原文地址:https://blog.csdn.net/weixin_72625764/article/details/136530161