• Configmap配置与Secret加密


    一,ConfigMap 简介

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

    将配置信息放到configmap对象中,然后在pod的对象中导入configmap对象,实现导入配置的操作。

    ConigMap是一种 API对象,用来将非机密性的数据保存到键值对中。使用时可以用作环境变量、命令行参数或者存储卷中的配置文件。

    ConfigMap将环境配置信息和容器镜像解耦,便于应用配置的修改。当你需要储存机密信息时可以使用Secret对象。

    备注: ConfigMap 并不提供保密或者加密功能。如果你想存储的数据是机密的,请使用Secret;或者使用其他第三方工具来保证数据的私密性,而不是用ConfigMap。

    二,项目中的应用

    1. 创建 ConfigMap 的资源清单

    1. apiVersion: v1 # 版本,通过 kubectl explain cm 可以查看
    2. kind: ConfigMap
    3. metadata:
    4. name: special-config # ConfigMap 的名字
    5. namespace: default # 名称空间
    6. data: # key: value 结构,配置数据
    7. special.how: very
    8. special.type: charm
    9. kubectl apply -f comfigmap.yaml

    2. 使用目录创建

    创建 /root/k8s/yaml/configmap/game.properties 文件:

    1. enemies=aliens
    2. lives=3
    3. enemies.cheat=true
    4. enemies.cheat.level=noGoodRotten
    5. secret.code.passphrase=UUDDLRLRBABAS
    6. secret.code.allowed=true
    7. secret.code.lives=30

    创建 /root/k8s/yaml/configmap/ui.properties 文件

    1. color.good=purple
    2. color.bad=yellow
    3. allow.textmode=true
    4. how.nice.to.look=fairlyNice

    3.创建 configmap ,--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容

    kubectl create configmap game-config --from-file=../configmap/

    4.查看创建的 configmap(可简写为 cm):

    1. $ kubectl get cm
    2. NAME DATA AGE
    3. game-config 2 6m40s
    4. # 查看详细信息
    5. kubectl get cm game-config -o yaml
    6. kubectl describe cm game-config

    5. 使用文件创建

    通过 --from-file 参数只要指定为一个文件就可以从单个文件中创建 ConfigMap

    –from-file 这个参数可以使用多次,你可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的

    1. kubectl create configmap game-config-2 --fromfile=game.properties
    2. kubectl get configmaps game-config-2 -o yaml

    6. 使用字面值创建

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

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

    7.Pod 中使用 ConfigMap

    创建两个 ConfigMap(configmap.yaml)

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: special-config
    5. namespace: default
    6. data:
    7. special.how: very
    8. special.type: charm
    9. ---
    10. apiVersion: v1
    11. kind: ConfigMap
    12. metadata:
    13. name: env-config
    14. namespace: default
    15. data:
    16. log_level: INFO

    创建pod

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: dapi-test-pod
    5. spec:
    6. containers:
    7. - name: test-container
    8. image: wangyanglinux/myapp:v1
    9. command: [ "/bin/sh", "-c", "env" ] # 打印 env
    10. env: # 从 ConfigMap 中选择读取的键,并起个别名
    11. - name: SPECIAL_LEVEL_KEY # 键别名,在这值应该是 very
    12. valueFrom:
    13. configMapKeyRef:
    14. name: special-config # ComfigMap 的名称
    15. key: special.how # 上句指定 ConfigMap 中的键名
    16. - name: SPECIAL_TYPE_KEY # 键别名,在这值应该是 charm
    17. valueFrom:
    18. configMapKeyRef:
    19. name: special-config # ComfigMap 的名称
    20. key: special.type # 上句指定 ConfigMap 中的键名
    21. envFrom: # 直接从 ConfigMap 中读取全部配置
    22. - configMapRef:
    23. name: env-config # ComfigMap 的名称
    24. restartPolicy: Never

    查看日志,可以看到 ConfigMap 中的配置已经注入到了容器中

    使用 ConfigMap 设置命令行参数

    创建 ConfigMap

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: special-config
    5. namespace: default
    6. data:
    7. special.how: very
    8. special.type: charm

    创建pod

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: dapi-test-pod
    5. spec:
    6. containers:
    7. - name: test-container
    8. image: wangyanglinux/myapp:v1
    9. command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ] #可以调整启动Pod时的命令
    10. env: # 从 ConfigMap 中选择读取的键,并起个别名
    11. - name: SPECIAL_LEVEL_KEY # 键别名,在这值应该是 very
    12. valueFrom:
    13. configMapKeyRef:
    14. name: special-config # ComfigMap 的名称
    15. key: special.how # 上句指定 ConfigMap 中的键名
    16. - name: SPECIAL_TYPE_KEY # 键别名,在这值应该是 charm
    17. valueFrom:
    18. configMapKeyRef:
    19. name: special-config # ComfigMap 的名称
    20. key: special.type
    21. restartPolicy: Never

    查看日志

    kubectl logs dapi-test-pod

    very charm

    通过数据卷插件使用ConfigMap

    通过 Volume 方式挂载,ConfigMap 中的键名就是 文件名,键值就是 文件内容

    创建 ConfigMap

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: special-config
    5. namespace: default
    6. data:
    7. special.how: very
    8. special.type: charm
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: dapi-test-pod
    5. spec:
    6. containers:
    7. - name: test-container
    8. image: wangyanglinux/myapp:v1
    9. command: ["/bin/sh", "-c", "cat /etc/config/special.how"] # 打印挂载目录下的文件内容
    10. volumeMounts: # volume 挂载
    11. - name: config-volume # 挂载下面指定的 volume
    12. mountPath: /etc/config # 挂载到的目录(容器内路径,该目录下,文件名就里键名,文件内容就是键值)
    13. volumes:
    14. - name: config-volume # volume 名称
    15. configMap: # 来自 ConfigMap
    16. name: special-config # ConfigMap 名字
    17. restartPolicy: Never

    kubectl logs dapi-test-pod

    very

    8,ConfigMap 的热更新

    创建一个 ConfigMap 和 Deployment:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: log-config
    5. namespace: default
    6. data:
    7. log_level: INFO
    8. ---
    9. apiVersion: extensions/v1beta1
    10. kind: Deployment
    11. metadata:
    12. name: my-nginx
    13. spec:
    14. replicas: 1
    15. template:
    16. metadata:
    17. labels:
    18. run: my-nginx
    19. spec:
    20. containers:
    21. - name: my-nginx
    22. image: wangyanglinux/myapp:v1
    23. ports:
    24. - containerPort: 80
    25. volumeMounts: # 这块儿不懂看上一节《通过数据卷插件使用ConfigMap》
    26. - name: config-volume
    27. mountPath: /etc/config # 容器内这个目录下会有 log_level 这个文件,内容为 INFO
    28. volumes:
    29. - name: config-volume
    30. configMap:
    31. name: log-config

    查看 /etc/config/log_level 文件的内容

    kubectl exec my-nginx-c484b98b4-sbls9 -it -- cat /etc/config/log_level
    INFO

    修改 ConfigMap

    kubectl edit configmap log-config

     再次查看 /etc/config/log_level 文件的内容,可以看到,Pod 中的配置也改了


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

    让 Pod 滚动更新
    ConfigMap 更新后,并不会让相应的文件重载。例如,Nginx 在启动时,会加载一次配置文件(配置文件中有 ConfigMap 的相关参数),加载完成后,无论这个配置文件再怎么变化,Nginx 都不会再加载它。因此需要 ConfigMap 更新后滚动更新 Pod。

    可以通过修改 pod annotations 的方式强制触发滚动更新
    这里我们在 .spec.template.metadata.annotations 中添加 version/config ,每次通过修改 version/config 的时间来触发滚动更新

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

    三. Secret

    Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用

    用户可以创建 secret,同时系统也创建了一些 secret。

    Secret 有三种类型:

    • Service Account:用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中
    • Opaque:base64 编码格式的 Secret,用来存储密码、密钥等。加密程度不高
    • kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息

    要使用 secret,pod 需要引用 secret。Pod 可以用两种方式使用 secret:

    作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里,
    当 kubelet 为 pod 拉取镜像时使用。

    1. Service Account(不常用)

    Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中

    1. # 1. 随便找一个需要访问 Kubernetes API 的 Pod
    2. $ kubectl get pod -n kube-system
    3. NAME READY STATUS RESTARTS AGE
    4. kube-proxy-2pqkk 1/1 Running 6 40d
    5. # 2. 查看该 Pod 中 /run/secrets/kubernetes.io/serviceaccount 目录下的文件
    6. $ kubectl exec kube-proxy-2pqkk -n kube-system -it -- ls /run/secrets/kubernetes.io/serviceaccount
    7. ca.crt:访问 API Service 时的证书
    8. namespace:名称空间
    9. token:认证的密钥信息

    2. Opaque Secret

    Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:

    (1)创建 Opaque Secret

    给用户名和密码用 base64 加密

    1. $ echo -n admin | base64
    2. YWRtaW4=
    3. $ echo -n 123 | base64
    4. MTIz

    base64编码

    1. $ echo -n YWRtaW4= | base64 -d
    2. admin

    使用加密后的用户名和密码创建 Secret

    1. apiVersion: v1 # kubectl explain secret 查看
    2. kind: Secret
    3. metadata:
    4. name: mysecret # Secret 名称
    5. type: Opaque # Secret 的类型
    6. data:
    7. password: MTIz # 密码
    8. username: YWRtaW4= # 用户名

    查看Secret
    default-token-xxxxx:k8s 默认会在每个名称空间下都创建一个,用于 Pod 的挂载

    1. $ kubectl get secret
    2. NAME TYPE DATA AGE
    3. default-token-fm46c kubernetes.io/service-account-token 3 40d
    4. mysecret Opaque 2 12s

    (2)将 Secret 挂载到 Volume 中

    创建 Pod

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. labels:
    5. name: secret-test
    6. name: secret-test
    7. spec:
    8. volumes: # 创建一个卷
    9. - name: secrets # 卷名
    10. secret: # 卷使用的方案
    11. secretName: mysecret # 来自于上一节创建的 mysecret
    12. containers:
    13. - image: wangyanglinux/myapp:v1
    14. name: db
    15. volumeMounts: # 卷挂载
    16. - name: secrets # 挂载的是上面声明的 secrets
    17. mountPath: "/etc/secrets" # 挂载的目录(容器内目录)
    18. readOnly: true # 只读 

    查看

    1. # Opaque Secret 中的用户名和密码都已经挂载进来了
    2. $ kubectl exec secret-test -it -- ls /etc/secrets
    3. password username
    4. # 查看内容,发现内容已经自动被解密
    5. $ kubectl exec secret-test -it -- cat /etc/secrets/password
    6. 123
    7. $ kubectl exec secret-test -it -- cat /etc/secrets/username
    8. admin

    (3)将 Secret 导出到环境变量中

    创建 Deployment

    1. apiVersion: extensions/v1beta1
    2. kind: Deployment
    3. metadata:
    4. name: pod-deployment
    5. spec:
    6. replicas: 2
    7. template:
    8. metadata:
    9. labels:
    10. app: pod-deployment
    11. spec:
    12. containers:
    13. - name: pod-1
    14. image: wangyanglinux/myapp:v1
    15. ports:
    16. - containerPort: 80
    17. env:
    18. - name: TEST_USER # 环境变量名
    19. valueFrom:
    20. secretKeyRef: # 从 Secret 中获取
    21. name: mysecret # Secret 的名字
    22. key: username # Secret 中的键名
    23. - name: TEST_PASSWORD # 环境变量名
    24. valueFrom:
    25. secretKeyRef: # 从 Secret 中获取
    26. name: mysecret # Secret 的名字
    27. key: password # Secret 中的键名(相比 configmap,Secret 在这儿不需要使用明文,稍微安全一点)

    查看环境变量

    1. # 进入容器
    2. $ kubectl exec pod-deployment-747f78bc67-2w9wk -it -- /bin/sh
    3. # 查看环境变量
    4. $ echo $TEST_USER
    5. admin
    6. $ echo $TEST_PASSWORD
    7. 123

    3. kubernetes.io/docker configjson

    使用 Kuberctl 创建 docker registry 认证的 secret

    1. # kubectl create secret docker-registry \ # 创建 Secret 的类型
    2. # myregistrykey \ # Secret 的名称
    3. # --docker-server=hub.zyx.com \ # docker server 的地址
    4. # --docker-username=admin \ # docker 用户名
    5. # --docker-password=Harbor12345 \ # docker 密码
    6. # --docker-email=aa@qq.com # docker 邮箱
    7. kubectl create secret docker-registry \
    8. myregistrykey \
    9. --docker-server=hub.zyx.com \
    10. --docker-username=admin \
    11. --docker-password=Harbor12345 \
    12. --docker-email=aa@qq.com

    在创建 Pod 的时候,通过 imagePullSecrets 来引用刚创建的 myregistrykey,来拉取私有仓库的镜像

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: foo
    5. spec:
    6. containers:
    7. - name: foo
    8. image: hub.zyx.com/zyx/myapp:v1
    9. imagePullSecrets: # 当去私有仓库拉取时的认证信息
    10. - name: myregistrykey # 认证信息,上一步创建的 docker registry
  • 相关阅读:
    ASEMI-1N5819二极管的参数
    jupyter中配置多种虚拟环境
    Python开发者的宝典:CSV和JSON数据处理技巧大公开!
    在windows10上怎么安装Kafka
    179. 最大数
    MySQL 数据表操作
    redis命令行操作库、键、和五大数据类型详解
    caffe之upsample实现
    学习笔记-java代码审计-sqli
    iptables使用详解(centos7)
  • 原文地址:https://blog.csdn.net/echizao1839/article/details/126039325