七、Secret、ConfigMap详解

secret用途
  保存镜像仓库账号信息
  保存数字证书(比如https证书)
  保存通用的敏感数据,例如用户名密码
  加密数据实际还是存放在Etcd中,让Pod的容器以挂载Volume方式访问。
可通过kubectl get secret查看
将证书保存至secret:kubectl create secret tls blog-ctnrs-com --cert=blog.ctnrs.com.pem --key=blog.ctnrs-key.pem
 
Pod使用secret的两种方式
  变量注入
  挂载
secret.yaml文件及Pod使用secret文件
echo -n 'admin' | base64
YWRtaW4=
echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm

---------------------------------------------------------
# secret.yaml文件
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
# 通用类型
type: Opaque
data:
  # 通过base64加密后的用户名和密码,以key|value形式
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm

---------------------------------------------------------------------------

# 以变量的方式给pod注入secret
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    # 定义变量
    env:
        # 变量名称:变量值
      - name: SECRET_USERNAME
        # 表示变量值来自于secret
        valueFrom:
          secretKeyRef:
            # secret的名称
            name: mysecret
            # secret.yaml文件中的key
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
# 设置完之后进入容器可以打印这两个变量,具体运行还是要看场景需求
# echo $SECRET_USERNAME
# echo $SECRET_PASSWORD

---------------------------------------------------------------------------

# 以数据卷的形式给pod注入secret
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    # 将foo数据卷挂载到对应的目录
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  # 数据卷来源
  volumes:
  - name: foo
    # secret的名称
    secret:
      secretName: mysecret

# cat /etc/foo/username
# cat /etc/foo/password

 

ConfigMap
  与Secret类似,区别在于ConfigMap保存的是不需要加密配置信息。
可通过kubectl get cm查看
 
应用程序如何动态更新配置?
  当ConfigMap发生变更时,应用程序会动态加载的方案
    1、inotify(可以动态检查文件) 检查文件是否变动 ->但需要重启应用 (sidecar)
    2、与版本迭代一起
    3、进行热加载,需要程序有这块逻辑支持(比如加if判断。如果配置=1,则重启应用)
    4、采用统一配置中心,应用程序自己去读取,例如apollo、disconf (与方法3类似)
    5、触发滚动更新,即重启服务
 
ConfigMap.yaml文件及Pod使用ConfigMap文件
# ConfigMap文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
# 以键值对方式存储,如果是数字,需要有双引号
data:
  special.level: info
 special.type: hello

---------------------------------------------------------------------------
# 以变量的方式给pod注入ConfigMap
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
      image: busybox
      # 启动pod需要运行的命令,调用下面的变量
      command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
      env:
        - name: LEVEL
          # 变量来自ConfigMap
          valueFrom:
            configMapKeyRef:
              # ConfigMap的name
              name: myconfig
              key: special.level
        - name: TYPE
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.type
  restartPolicy: Never


---------------------------------------------------------------------------

# ConfigMap一般用来保存配置文件内容
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  # | 竖杠表示下面可以内容块
  redis.properties: |
    redis.host=127.0.0.1
    redis.port=6379
    redis.password=123456

---------------------------------------------------------------------------

# 以数据卷的形式给pod注入ConfigMap
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
      volumeMounts:
      - name: config-volume
        # 挂载到/etc/config目录下
        mountPath: /etc/config
  # 数据卷来自于ConfigMap
  volumes:
    - name: config-volume
      configMap:
        name: redis-config
  restartPolicy: Never

 

 
 
 

posted @ 2020-10-22 21:43  SoleMemory  阅读(344)  评论(0)    收藏  举报