• kubernetes配置资源管理


    目录

    一、Secret

    1.Secret 类型 

    2.创建 Secret

    (1)用kubectl create secret命令创建Secret

    (2)内容用 base64 编码,创建Secret

    3.使用方式

    二、ConfigMap

    1.创建 ConfigMap

    (1)使用文件创建 

    (2)使用字面值创建 

    2.Pod 中使用 ConfigMap 

    (1)使用 ConfigMap 来替代环境变量

    (2)Pod的创建

    3.用 ConfigMap 设置命令行参数 

    4.通过数据卷插件使用ConfigMap 

    (1)ConfigMap 的热更新

    (2)ConfigMap 更新后滚动更新 Pod


    一、Secret

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

    1.Secret 类型 

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

    Pod 需要先引用才能使用某个 secret,Pod 有 3 种方式来使用 secret:

    1)作为挂载到一个或多个容器上的卷 中的文件。
    2)作为容器的环境变量。
    3)由 kubelet 在为 Pod 拉取镜像时使用。

    应用场景:凭据
    https://kubernetes.io/docs/concepts/configuration/secret/

    2.创建 Secret

    (1)用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

    get或describe指令都不会展示secret的实际内容,这是出于对数据的保护的考虑

    (2)内容用 base64 编码,创建Secret

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

    3.使用方式

    1)将 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 seret-test bash
    21. # cd /etc/secrets/
    22. # ls
    23. # vi password.txt
    24. # vi username.txt

    2)将 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. kubectl apply -f secret-test1.yaml
    22. kubectl get pods
    23. kubectl exec -it mypod bash
    24. # echo $TEST_USER
    25. # echo $TEST_PASSWORD

    二、ConfigMap

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

    1.创建 ConfigMap

    1. mkdir /opt/configmap/
    2. vim /opt/configmap/game.properties
    3. enemies=aliens
    4. lives=3
    5. enemies.cheat=true
    6. enemies.cheat.level=noGoodRotten
    7. secret.code.passphrase=UUDDLRLRBABAS
    8. secret.code.allowed=true
    9. secret.code.lives=30
    10. vim /opt/configmap/ui.properties
    11. color.good=purple
    12. color.bad=yellow
    13. allow.textmode=true
    14. how.nice.to.look=fairlyNice
    15. ls /opt/configmap/
    16. game.properties
    17. ui.properties
    18. kubectl create configmap game-config --from-file=/opt/configmap/
    19. --from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
    20. kubectl get cm
    21. kubectl get cm game-config -o yaml

    (1)使用文件创建 

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

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

    (2)使用字面值创建 

    1. 使用文字值创建,利用 --from-literal 参数传递配置信息,该参数可以使用多次,格式如下
    2. kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=good
    1. kubectl get configmaps special-config -o yaml
    2. kubectl delete cm --all
    3. kubectl delete pod --all

    2.Pod 中使用 ConfigMap 

    (1)使用 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

    (2)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
    1. kubectl logs pod-test
    2. KUBERNETES_SERVICE_PORT=443
    3. KUBERNETES_PORT=tcp://
    4. HOSTNAME=pod-test
    5. SHLVL=1
    6. SPECIAL_HOW_KEY=very 赋值变量 SPECIAL_HOW_KEY 的值为 special-config 的 special.how: very
    7. HOME=/root
    8. SPECIAL_TYPE_KEY=good 赋值变量 SPECIAL_TYPE_KEY 的值为 special-config 的 special.type: good
    9. KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
    10. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    11. KUBERNETES_PORT_443_TCP_PORT=443
    12. KUBERNETES_PORT_443_TCP_PROTO=tcp
    13. log_level=INFO 引入 env-config 的变量 log_level: INFO
    14. KUBERNETES_PORT_443_TCP=tcp://
    15. KUBERNETES_SERVICE_PORT_HTTPS=443
    16. KUBERNETES_SERVICE_HOST=
    17. PWD=/

    3.用 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

    4.通过数据卷插件使用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. # vi special.how
    25. # vi special.type

    (1)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: extensions/v1beta1
    11. kind: Deployment
    12. metadata:
    13. name: my-nginx
    14. spec:
    15. replicas: 1
    16. template:
    17. metadata:
    18. labels:
    19. run: my-nginx
    20. spec:
    21. containers:
    22. - name: my-nginx
    23. image: nginx
    24. ports:
    25. - containerPort: 80
    26. volumeMounts:
    27. - name: config-volume
    28. mountPath: /etc/config
    29. volumes:
    30. - name: config-volume
    31. configMap:
    32. name: log-config
    33. kubectl apply -f test-pod5.yaml
    34. kubectl get pods
    35. kubectl exec -it my-nginx-76b6489f44-6dwxh -- cat /etc/config/log_level
    36. INFO
    37. kubectl edit configmap log-config

    等大概10秒左右,使用该 ConfigMap 挂载的 Volume 中的数据同步更新 

    kubectl exec -it my-nginx-76b6489f44-6dwxh -- cat /etc/config/log_level

    (2)ConfigMap 更新后滚动更新 Pod

    更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过在 .spec.template.metadata.annotations 中添加 version/config ,每次通过修改 version/config 来触发滚动更新

    1. kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210525" }}}}}'
    2. kubectl get pods

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

  • 相关阅读:
    Java InputStream如何读取文件呢?
    gentoo-useflags
    继电器测试负载箱的价格和性价比如何?
    汽车搭载的车载摄像头分类
    我用 Python 写了一个统计博客园文章信息的小工具
    Cesium屏幕中心坐标和相机位置坐标计算
    计算机网络408考研 2014
    C++超市商品管理系统
    Camtasia Studio2022卡塔莎(专业的电脑屏幕录像软件)
    高吞吐SFTP连接池设计方案
  • 原文地址:https://blog.csdn.net/Drw_Dcm/article/details/127791654