k8s入门:配置 ConfigMap & Secret

本文深入介绍了Kubernetes中的ConfigMap和Secret的用途、创建方法及在Pod中的使用方式,包括命令行创建、yaml文件创建、通过kustomize生成,并探讨了它们在应用配置和安全管理中的角色。ConfigMap用于存储非敏感配置信息,Secret则用于保存敏感数据,如密码和密钥。此外,还介绍了如何通过volume挂载和环境变量将它们注入到容器中。
系列文章

第一章:✨ k8s入门:裸机部署 k8s 集群
第二章:✨ k8s入门:部署应用到 k8s 集群
第三章:✨ k8s入门:service 简单使用
第四章:✨ k8s入门:StatefulSet 简单使用
第五章:✨ k8s入门:存储(storage)
第六章:✨ K8S 配置 storageclass 使用 nfs 动态申领本地磁盘空间
第七章:✨ k8s入门:配置 ConfigMap & Secret
第八章:✨ k8s入门:k8s入门:Helm 构建 MySQL
第九章:✨ k8s入门:kubernetes-dashboard 安装
第十章:✨ k8s入门:kube-prometheus-stack 全家桶搭建(Grafana + Prometheus)



一、ConfigMap
1、概念
  • ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。

  • ConfigMap 将你的环境配置信息和容器镜像 解耦,便于应用配置的修改。

  • 很多应用在其初始化或运行期间要依赖一些配置信息, 存在要调整配置参数所设置的数值的需求,ConfigMap 可以向 Pod 中注入配置数据。

  • ConfigMap 不提供保密或者加密功能,加密数据可以使用 Secret 或其他第三方工具。

  • ConfigMap 中保存的数据不可超过 1 MiB。

  • ConfigMap 使用 data 和 binaryData 字段。这些字段能够接收键-值对作为其取值。data 和 binaryData 字段都是可选的。data 字段设计用来保存 UTF-8 字符串,而 binaryData 则被设计用来保存二进制数据作为 base64 编码的字串。

详细用法参考:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/

2、通过命令行创建
使用 `kubectl create configmap --help` 查看命令行详细参数

例子:

  • 通过文件夹创建:其中文件名为 key,文件内容为 value
# /root/configmap/dir 为文件夹
kubectl create configmap dir-config --from-file=/root/configmap/dir
# /root/configmap/file/test.txt 为文件名
kubectl create configmap file-config --from-file=/root/configmap/file/test.txt
  • 通过文件创建:其中 key 为 key1、key2,value 为文件内容
kubectl create configmap file-config --from-file=key1=/root/configmap/file/file1.txt --from-file=key2=/root/configmap/file/file2.txt
  • 通过键值对创建:key1=config1 、 key2=config2,特殊字符($,\,* 等)需要转义,最简单方法使用单引号
kubectl create configmap key-config --from-literal=key1=config1 --from-literal=key2=config2
  • env 文件本身就是键值对形式文件,所以 configmap 的 key 对应 env 文件的 key,value 对应 env 文件的 value
kubectl create configmap env-config --from-env-file=/root/configmap/file/config1.env --from-env-file=/root/configmap/file/config2.env

简单测试:利用 env 创建 configmap

[root@master configmap]# cat file/config1.env
id=1
name=admin
[root@master configmap]# cat file/config2.env
password=123456
[root@master configmap]# kubectl create configmap env-config --from-env-file=/root/configmap/file/config1.env --from-env-file=/root/configmap/file/config2.env
configmap/env-config created
[root@master configmap]# kubectl get cm
NAME               DATA   AGE
env-config         3      25s
[root@master configmap]# kubectl describe cm/env-config
Name:         env-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
name:
----
admin
password:
----
123456
id:
----
1

BinaryData
====

Events:  <none>

3、通过 yaml 文件创建

配置文件 /root/configmap/yaml/config.yaml注意: data 字段类型 UTF-8 字符串, binaryData 二进制数据作为 base64 编码的字串

apiVersion: v1
kind: ConfigMap
metadata:
 name: yaml-config
data:
 id: "001"
 name: admin
 password: "123456"

binaryData:
 address: 6KW/5a6J # 西安
 date: MjAyMi82LzIx # 2022/6/21

部署 configmap

[root@master configmap]# kubectl apply -f yaml/config.yaml 
configmap/yaml-config created
[root@master configmap]# kubectl describe cm/yaml-config
Name:         yaml-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
id:
----
001
name:
----
admin
password:
----
123456

BinaryData
====
address: 6 bytes
date: 9 bytes

Events:  <none>

4、不可变更的 ConfigMap

Kubernetes v1.21 新增特性 Immutable=true 设置 Secret 和 ConfigMap 为不可变更的选项,禁止更改 ConfigMap 的数据有以下好处

  • 保护应用,使之免受意外(不想要的)更新所带来的负面影响。
  • 通过大幅降低对 kube-apiserver 的压力提升集群性能, 这是因为系统会关闭对已标记为不可变更的 ConfigMap 的监视操作。

配置文件 /root/configmap/yaml/immutable-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: immutable-config
data:
  id: "002"
  name: admin
  password: "123456"
immutable: true

创建 configmap

[root@master configmap]# vi yaml/immutable-config.yaml
[root@master configmap]# kubectl apply -f yaml/immutable-config.yaml 
configmap/immutable-config created
[root@master configmap]# kubectl get cm
NAME               DATA   AGE
immutable-config   3      11s
[root@master configmap]# vi yaml/immutable-config.yaml # 修改配置文件的值
[root@master configmap]# kubectl apply -f yaml/immutable-config.yaml # 重新创建包如下错误,保证不可变更
The ConfigMap "immutable-config" is invalid: data: Forbidden: field is immutable when `immutable` is set

一旦 ConfigMap 被标记为不可变更,则无法逆转这一变化,也无法更改 data 或 binaryData 字段的内容,只能删除并重建 ConfigMap。

5、 Pod 使用 ConfigMap

有以下四种方式来使用 ConfigMap 配置 Pod 中的容器:

  • 在容器命令行参数内
  • 容器的环境变量
  • 使用 volume 挂载
  • 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

前三个方法,kubelet 使用 ConfigMap 中的数据在 Pod 中启动容器。第四种方法意味着你必须编写代码才能读取 ConfigMap 和它的数据,只要 ConfigMap 发生更改, 你的应用就能够通过订阅来获取更新。

①、命令行参数(容器环境变量)

/root/configmap/yaml/alpine-config.yaml

apiVersion: v1
kind: Pod
metadata:
  name: alpine-configmap-pod
spec:
  containers:
    - name: alpine-configmap-pod-container
      image: alpine
      # linux 获取某个环境变量值 echo ${环境变量}
      # sleep 20 保证存活 20 s
      command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2) && sleep 20"] 
      env:
        # 定义环境变量
        - name: KEY1 # 请注意这里和 ConfigMap 中的键名是不一样的
          valueFrom:
            configMapKeyRef:
              name: alpine-config           # 这个值来自 ConfigMap
              key: text1 # 需要取值的键
        - name: KEY2
          valueFrom:
            configMapKeyRef:
              name: alpine-config
           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值