K8S-配置管理(Secret与Configmap)

1.配置容器化应用的方式

(1)自定义命令行参数;
args: []
(2)把配置文件直接焙进镜像;2018/8/23 kubernetes.txt
(3)环境变量
① Cloud Native的应用程序一般可直接通过环境变量加载配置;
② 通过entrypoint脚本来预处理变量为配置文件中的配置信息;
(4)存储卷

2.Secret(加密)

官网文档:https://kubernetes.io/docs/concepts/configuration/secret/
加密数据并存放Etcd中,让Pod的容器以挂载Volume方式访问。
应用场景:凭据 、私钥、证书、某一些密码 base64编码
Pod使用secret两种方式:
• 变量注入
• 挂载

保存类型
docker-registry docker仓库的认证方式
generic 通用,文件或者一些变量
tls tls证书

(1)配置docker私有仓库(在pod的spec中配置使用的secret的名字)
在pod的配置段配置拉取使用的secret

spec:
  imagePullSecrets:    
  - name: myregistrykey
  containers:

配置secret
kubectl create secret docker-registry secret名字 --docker-server=docker私有仓库地址 --docker-username=用户名 --docker-password=密码 --docker-email=邮箱

示例kubectl create secret docker-registry regsecret --docker-server=registry.fjhb.cn --docker-username=ylw --docker-password=123 [email protected]

[root@k8s-master nfs]# echo 555 | base64
NTU1Cg==
[root@k8s-master nfs]# echo NTU1Cg== | base64 -d
555
(2)在pod指定serviceaccountName(pod连接api-server的用户)
然后serviceaccountName对应的serviceaccount具备docker私有仓库的认证信息
这样可以更加安全在pod种只能看到sa并不能看到我们sa的信息
(3)变量注入
Base 64加密

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque  #通用类型
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME          #传给容器内的变量
        valueFrom:
          secretKeyRef:
            name: mysecret              #用的哪一个secret
            key: username               #secret的key
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password       

(4)数据卷挂载

apiVersion: v1
kind: Pod
metadata:
  name: mypod2
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret

3.Configmap(不加密)

官网文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
与Secret类似,区别在于ConfigMap保存的是不需要加密配置信息。
应用场景:应用配置
Configmap也是名称空间级别的类型简称(cm),一些列配置数据的集合,让镜像变得更加灵活,保存的所有都是键值对,value没有长度限制,在pod启动的时候,可以从configmap的key获取相关的配置项

命令行创建
[root@k8s-master nfs]# kubectl create configmap nginx
–from-file=www=1.conf www为key Value为1.conf的内容 如果没有www的话那么key就默认为文件名

(1)变量注入(这种方法只会在pod启动生效,无法实时更新)
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info
special.type: hello

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh", "-c", "echo $LEVEL $(TYPE)" ]
      env:
        - name: LEVEL
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.level
        - name: TYPE              #这个就是你容器中的一个变量
          valueFrom:
            configMapKeyRef:
              name: myconfig   #引用的configmap的名字
              key: special.type  #这个是从configmap中获取的key,通过key获取value
              optional: true(flase) 布尔值      #如果有这个的话就是没有configmap也没事,以后添加也可以,如果没有这个那么如果你选择的configmap一旦没有那么直接报错
  restartPolicy: Never

(2)数据卷挂载
相当于做了个软连接 把configmap的内容软连接pod中你挂在目录路下,实时更新,虽然实时更新,但是读取配置文件的话还需要web热加载一下,不支持热加载的需要重启一下,那么就需要灰度发布

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  redis.properties: |
    redis.host=127.0.0.1
    redis.port=6379
    redis.password=123456

---

apiVersion: v1
kind: Pod
metadata:
  name: mypod2
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
      volumeMounts:                   #使用存粗卷挂载
      - name: config-volume             #存储卷名字
        mountPath: /etc/config           #挂载到哪里(容器)
        readOnly: true                   #不应该由容器来改变,只读挂载(这个可以没有,没有的话表示读写挂载)
  volumes:                             #村粗卷
    - name: config-volume              #存粗卷名称
      configMap:                       #类型为configmap
        name: redis-config             #configmap名字
  restartPolicy: Never

一个configmap可能会有多个key,但是我们如果只需要其中的某一个或几个的话可以用
items(是个列表)来指定并且用key和path还有mode做一些管控,key是键,path是文件路径不能用…来写,mode是文件权限比如0700等等
查询姿势kubectl explain pod.spec.volumes.configMap.items
官方文档示例:https://kubernetes.io/docs/concepts/storage/volumes/#configmap
是写在volumes中 设置这个存储卷使用那些key,然后volumeMounts直接使用即可

你可能感兴趣的:(kubernetes)