欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

k8s集群中的configmap和secret

程序员文章站 2024-03-11 19:08:25
...

许多应用经常会有从配置文件、命令行参数或者环境变量中读取一些配置信息,这些配置信息我们肯定不会直接写死到应用程序中去,而ConfigMap就给我们提供了向容器中注入配置信息的能力,不仅可以用来保存单个属性,也可以用来保存整个配置文件。
ConfigMap 资源对象使用key-value形式的键值对来配置数据,这些数据可以在Pod里面使用,ConfigMap和Secrets比较类似,一个比较大的区别是ConfigMap可以比较方便的处理一些非敏感的数据,比如密码之类的还是需要使用Secrets来进行管理

用yaml文件创建configmap

kind: ConfigMap
apiVersion: v1
metadata:
  name: cm-demo
  namespace: default
data:
  data.1: hello
  data.2: world
  config: |
    property.1=value-1
    property.2=value-2
    property.3=value-3

前两个被用来保存单个属性,后面一个被用来保存一个配置文件。

使用命令创建configmap
$ mkdir testcm
$ cd testcm
$ vim redis.conf
host=127.0.0.1
port=6379
$ vim mysql.conf
host=127.0.0.1
port=3306
$ cd …
$ kubectl create configmap cm-demo1 --from-file=testcm
$ kubectl create configmap cm-demo2 --from-file=testcm/redis.conf
$ kubectl get configmap
$ kubectl describe configmap cm-demo2
Name: cm-demo2
Namespace: default
Labels:
Annotations:

Data

redis.conf:

host=127.0.0.1
port=6379
$ kubectl get configmap cm-demo2 -o yaml

apiVersion: v1
data:
  redis.conf: |+
    host=127.0.0.1
    port=6379

kind: ConfigMap
metadata:
  creationTimestamp: "2019-08-21T08:44:45Z"
  name: cm-demo2
  namespace: default
  resourceVersion: "2386733"
  selfLink: /api/v1/namespaces/default/configmaps/cm-demo2
  uid: ecdd35b6-c3ef-11e9-9b9e-000c29d8512b

将configmap以volume的形式挂载到pod中

apiVersion: v1
kind: Pod
metadata:
  name: testcm3-pod
spec:
  containers:
    - name: testcm3
      image: busybox
      command: [ "/bin/sh", "-c", "cat /etc/config/redis.conf" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: cm-demo2

$ kubectl logs testcm3-pod
host=127.0.0.1
port=6379

Secret有三种类型:
Opaque:base64 编码格式的 Secret,用来存储密码、**等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
kubernetes.io/service-account-token:用于被serviceaccount引用,serviceaccout 创建时Kubernetes会默认创建对应的secret。Pod如果使用了serviceaccount,对应的secret会自动挂载到Pod目录/run/secrets/kubernetes.io/serviceaccount中。

创建Opaque secret有多种方式
1、通过命令创建
$ kubectl create secret generic mysecret1 --from-literal=user=root -
-from-literal=password=redhat
$ kubectl get secret
$ kubectl describe secret mysecret1

Name:         mysecret1
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  6 bytes
user:      4 bytes

$ kubectl get secret mysecret1 -o yaml

apiVersion: v1
data:
  password: cmVkaGF0
  user: cm9vdA==
kind: Secret
metadata:
  creationTimestamp: "2019-08-21T12:07:41Z"
  name: mysecret1
  namespace: default
  resourceVersion: "2396051"
  selfLink: /api/v1/namespaces/default/secrets/mysecret1
  uid: 466da758-c40c-11e9-9b9e-000c29d8512b
type: Opaque

2、通过普通文件和变量文件创建
$ echo -n tom > user
$ echo -n redhat > password
$ kubectl create secret generic mysecret2 --from-file=user --from-file=password
$ vim env.txt
user=tom
password=redhat
$ kubectl create secret generic mysecret3 --from-file=env.txt

3、通过yaml文件创建
$ echo -n tom |base64
dG9
$ echo -n redhat |base64
cmVkaGF0
$ vim secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret4
type: Opaque
data:
  user: dG9t
  password: cmVkaGF0

以卷的方式挂载secret

apiVersion: v1
kind: Pod
metadata:
  name: secret2-pod
spec:
  containers:
  - name: secret2
    image: busybox
    command: ["/bin/sh", "-c", "ls /etc/secrets"]
    volumeMounts:
    - name: secrets
      mountPath: /etc/secrets
			readOnly: true
  volumes:
  - name: secrets
    secret:
     secretName: mysecret4

最后我们来对比下Secret和ConfigMap这两种资源对象的异同点:

相同点:

key/value的形式
属于某个特定的namespace
可以导出到环境变量
可以通过目录/文件形式挂载
通过 volume 挂载的配置信息均可热更新
不同点:

Secret 可以被 ServerAccount 关联
Secret 可以存储 docker register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像
Secret 支持 Base64 加密
Secret 分为 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三种类型,而 Configmap 不区分类型