K8S配置管理资源对象:ConfigMap和Secret

科技   2024-11-24 17:23   广东  

 码字不易,戳下方名片,关注+星标


1. ConfigMap

1.1 用途

用于将非敏感配置数据存储为键值对,并可以动态地注入到容器中。这使得容器化应用程序的配置与代码分离,支持配置变更而无需重建镜像或重启服务。

1.2 主要特点

  • 数据类型:ConfigMap 的数据存储在 Kubernetes 的 etcd 数据库中,数据为明文存储。
  • 存储数据:可以存储多个键值对。

1.3 用途场景:

  • 应用程序的配置文件。
  • 环境变量配置。
  • 命令行参数。

1.4 创建方法

1.4.1 使用 YAML 创建

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  # 配置内容以键值对形式存储
  app.properties: |
    app.name=App1
    app.version=1.0.0
  log_level: "INFO"

应用:

kubectl apply -f configmap.yaml

1.4.2  使用命令行创建

kubectl create configmap my-configmap2 --from-literal=log_level=ERROR --from-literal=app.name=App2

1.4.3 使用文件创建

在文件中需要提前创建键值对

kubectl create configmap my-configmap3 --from-file=app.properties

1.5 查看configmap

[root@k8s-master data]kubectl get configmap
NAME               DATA   AGE
kube-root-ca.crt   1      32d
my-configmap       2      18s
my-configmap2      2      9s
my-configmap3      1      6s
[root@k8s-master data]kubectl describe configmap my-configmap
Name:         my-configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
log_level:
----
INFO
app.properties:
----
app.name=App1
app.version=1.0.0


BinaryData
====

Events:  <none>

如果 ConfigMap 中的值发生更改,Pod 中引用该值的应用程序会动态感知变化

1.6 使用 ConfigMap

1.6.1 作为环境变量:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.25
    env:
    - name: LOG_LEVEL
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: log_level

1.6.2 挂载为文件:

volumes:
  - name: config-volume
    configMap:
      name: my-configmap2

containers:
  - name: app-container
    volumeMounts:
      - name: config-volume

        mountPath: /etc/config

1.7 动态更新 ConfigMap

如果 ConfigMap 更新了,Pod 中挂载的文件会动态更新,但 环境变量不会自动更新。

应用动态感知需要依赖重新加载挂载的文件,或者手动重启 Pod。

2 Secret

2.1 用途

用于存储和管理敏感信息(例如密码、密钥、证书等)。与 ConfigMap 类似,Secret 也可以将数据以环境变量或挂载文件的方式注入到 Pod 中。数据以加密的方式存储在 etcd 中(但不是完全安全,需额外保护)。

2.2 主要特点

  • 数据类型:支持 Base64 编码的文本数据。
  • 存储数据:也以键值对的形式存储。

2.3 用途场景:

  • 数据库密码。
  • 云服务认证密钥。
  • SSL/TLS 证书。

2.4 创建方法

2.4.1  使用 YAML 创建

默认情况下,Secret 的数据以 Base64 编码存储和传递。数据需要先用 Base64 编码:

echo -n "123456" | base64

编写yaml文件

apiVersion: v1
kind: Secret
metadata:
  name: harbor-secret
type: Opaque
data:
  username: YWRtaW4=   # "admin" 的 Base64 编码
  password: MTIzNDU2  # "123456" 的 Base64 编码

应用

kubectl apply -f my-secret1.yaml

2.4.2 使用命令行创建

kubectl create secret generic my-secret2 --from-literal=username=admin --from-literal=password=my-secret-password

2.4.3 从文件创建

需要提前文件 username.txt 和 password.txt,每个文件包含一个值:


kubectl create secret generic my-secret3 \
  --from-file=username=username.txt \
  --from-file=password=password.txt

2.5 查看Secret

kubectl get secret

kubectl describe secret my-secret

2.6 使用 Secret

2.6.1 作为环境变量:

    env:
    - name: DB_USERNAME
      valueFrom:
        secretKeyRef:
          name: my-secret1
          key: username
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:

          name: my-secret1
          key: password

2.6.2 挂载为文件:

volumes:
  - name: secret-volume
    secret:
      secretName: my-secret2

containers:
  - name: app-container
    volumeMounts:
      - name: secret-volume
        mountPath: /etc/secret

挂载后,username 和 password 会成为 /etc/secret/username 和 /etc/secret/password 两个文件。

2.7 Secret 的类型

Kubernetes 中的 Secret 可以有多种类型,常见的有:

  • Opaque:默认类型,用于一般数据存储。
  • kubernetes.io/dockerconfigjson:用于 Docker 镜像拉取密钥。
  • kubernetes.io/tls:用于存储 TLS 密钥和证书。

3. ConfigMap 与 Secret 的比较

特性ConfigMapSecret
数据类型非敏感配置敏感信息
数据存储格式明文Base64 编码(etcd 中加密存储)
安全性无需加密提供一定程度的安全性
使用场景应用的普通配置密码、密钥等敏感信息
存储方式键值对键值对

4. 注意事项

(1)ConfigMap 与 Secret 的限制

  • 数据总大小不得超过 1MB,适用于小型配置文件。
  • 必须创建Pod之前创建,Pod才能引用它们
  • configMap和Secret受namespace限制,只有处于相同命名空间才能引用他们
  • 无法用于静态Pod

(2)配置管理最佳实践

  • 将 ConfigMap 和 Secret 配置文件放在版本控制中,敏感数据除外。
  • 使用工具(如 Helm 或 Kustomize)管理 ConfigMap 和 Secret 的生成。

(3)提高 Secret 的安全性

  • 启用 Kubernetes 的 加密静态数据 功能。
  • 限制对 Secret 的访问权限。


    欢迎转发点亮下方“在看”图标让更多的人看到


END


往期推荐


1

万字长文:K8S命令详解汇总【自用珍藏版】

2

Linux的150个常用命令汇总,运维大神不一定全部掌握!

3

K8S重要概念区分:Ingress 和 Service 的异同点

4

【Docker系列知识】常用命令大全汇总

5

Nginx配置文件详解及常用功能配置(实用率90%)

6

手把手教你搭建企业级Harbor镜像仓库

运维李哥不背锅
专注于各种运维技术、,分享Linux基础知识,服务器,数据库,云原生和网络安全等相关技术,各种进阶知识等着你,助你成为技术达人!
 最新文章