k8s series 11: ConfigMap,Secret

·  阅读 233

这是我参与更文挑战的第8天,活动详情查看: 更文挑战

ConfigMap

简介

 configmap提供了非加密的键值对,存储在etcd中,使用控制器对象时,会作用于pod中,环境变量,命令行参数,或直接挂载存储卷

作用

  • 配置数据和应用解偶部署,不需要打在一个包里
  • 热更新配置
  • 可以做配置中心,方便统一管理
  • 环境变量集中化
  • 支持不可变key-value,强化业务稳定性

因为value是不加密的,安全性低,不适合存储账密等信息

创建

直接在命令行终端创建和查看

kubectl create configmap test1 --from-literal=hello=world
kubectl get cm
kubectl describe cm/test1
复制代码

可以看到Data字段下方 出现key和value,以---为分隔符

使用yaml配置创建

kind: ConfigMap
apiVersion: v1
metadata:
  creationTimestamp: 2021-06-26T08:22:38Z
  name: example-config
  namespace: default
data: 
  example.property.1: hello
  example.property.2: world
  example.property.file: |-
    property.1=value-1
    property.2=value-2
    property.3=value-3
复制代码

创建

kubectl apply -f example-cm.yaml
复制代码

查看configmap中example-config的配置

kubectl get cm/example-config -o yaml
复制代码

使用文件方式创建

kubectl create configmap database --from-file=redis=./conf/redis.conf --from-file=mysql=./conf/mysql.conf
kubectl describe cm/database
复制代码

使用三种方式创建了配置,接下来如何在pod中使用

使用

先创建配置

kubectl create configmap cm-demo --from-literal=db.host=localhost --from-literal=db.port=3306
复制代码

使用configmap作于环境变量和参数带入

apiVersion: v1
kind: Pod
metadata:
  name: testcm1-pod
spec:
  containers:
    - name: testcm1
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: cm-demo
              key: db.host
        - name: DB_PORT
          valueFrom:
            configMapKeyRef:
              name: cm-demo
              key: db.port
      envFrom:
        - configMapRef:
            name: cm-demo
复制代码

直接在rancher页面查看,因为将env打印了出来

Secret

  现在信息安全得到非常重视,所以在一些敏感信息都需要一个加密存储,而secret可以保存密码、OAuth 令牌和 ssh key等,配合pod使用,使安全性大大提高

三种类型

  • 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类型

执行以下命令得到一个加密后的string, 可做为value 写到yaml中

echo -n "root" | base64
echo -n "root123" | base64


apiVersion: v1
kind: Secret
metadata:
  name: secret-demo
type: Opaque
data:
  username: cm9vdA==
  password: cm9vdDEyMw==

kubectl create -f secret-demo.yaml
kubectl describe secret/secret-demo
复制代码

可以看到value是加密的

service-account-token类型

create serviceaccount时k8s会默认创建对应的secret,pod使用sa时,对应的sc会自动挂载到pod的/run/secrets/kubernetes.io/serviceaccount目录中

例子:

kubectl run secret-pod3 --image nginx:1.18
kubectl exec $(kubectl get pods | grep secret | awk '{print $1}') ls /run/secrets/kubernetes.io/serviceaccount
kubectl exec $(kubectl get pods | grep secret | awk '{print $1}') cat /run/secrets/kubernetes.io/serviceaccount/token
复制代码

可以看到里面的token内容

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 不区分类型
分类:
后端
分类:
后端
收藏成功!
已添加到「」, 点击更改