BenjaminYang In solitude, where we are least alone

应用配置管理Secret&ConfigMap

1.Secret

常见的应用配置方式

  • 镜像
  • 配置中心
  • 配置文件
  • 共享存储
  • 放到git 仓库

配置文件分类:

  • 敏感信息    
  • 非敏感信息 如账号密码 服务器地址

Secret再k8s中 的使用方式

加密数据并存放Etcd中,让Pod的容器以挂载Volume方式访问。

应用场景:凭据

 

Pod使用secret两种方式: 

  • 变量注入
  • 挂载

 

例:现在一对  用户名  密码  pod在运行的时候需要加载 注入到pod 中 

假如现在 用户名:admin  密码:password

 

echo -n "admin" |base64
YWRtaW4=

echo -n "password" |base64
cGFzc3dvcmQ=

passwdAndusername-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data: 
  username: YWRtaW4=
  password: cGFzc3dvcmQ=

 

image.png

 

pod怎样注入secret中的变量

secret-var-use.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password

image.png

 

将secret挂载到pod文件中

secret-volume.yaml

 

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

 

image.png

三种类型secret

[root@k8s-master1 ~/learn]#  kubectl create secret -h
Create a secret using specified subcommand.

Available Commands:
  docker-registry Create a secret for use with a Docker registry
  generic         Create a secret from a local file, directory or literal value
  tls             Create a TLS secret

docker-registry 是配置docker私有仓库的认证信息,当yaml中指定了相应的secret 就可以获取到对应的变量值

 

kubectl create secret docker-registry myregistry --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=benjami
n7788 --docker-password=a7260488

 

imagePullSecrets:
- name: myregistry

generic 通过传值 或者 指定本地文件的方式 创建secret

传值:

kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456

传文件:

echo -n admin > ./username
echo -n 123456 > ./password
kubectl create secret generic mysecret --from-file=./username --from-file=./password

tls 创建证书型secret一般用于 ingress 配置https 场景中

 

kubectl create secret tls secret-tls --cert=/root/learn/ssl/example.ctnrs.com.pem --key=/root/learn/ssl/example.ctnrs.com-ke
y.pem

 

tls:
  - hosts:
    - example.ctnrs.com
    secretName: secret-tls

Secret官网:https://kubernetes.io/docs/concepts/configuration/secret/

2.ConfigMap

与Secret类似,区别在于ConfigMap保存的是不需要加密配置信息。

应用场景:应用配置

引用变量方式

configmap-string.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info
  special.type: hello

 

image.png

 config-var.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: mypod3
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
              key: special.type
  restartPolicy: Never

image.png

挂载数据卷方式

cat config-volume.yaml 

 

---

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: mypod4
spec:
  containers:
    - name: busybox
      image: busybox
      command: ["/bin/sh","-c","cat /etc/config/redis.properties"]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
      - name: config-volume
        configMap:
          name: redis-config
  restartPolicy: Never

 

image.png

应用程序动态更新配置

ConfigMap更新时,业务也随之更新的方案:

  • 当ConfigMap发生变更时,应用程序动态加载 
  • 触发滚动更新,即重启服务

 

 但是问题是,如何触发应用reload?如何周期性的检查文件是否变化?

比如 我将configMap中定义的密码 由 123456 改为 password

然后重新应用程序,发现应用并未使用更新后的配置

image.png

只有将pod 进行重建后,才能加载到修改后的配置

kubectl delete po mypod4

kubectl apply -f config-volume.yaml 

image.png

 

ConfigMap 官网:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

posted @ 2020-03-09 09:03  benjamin杨  阅读(446)  评论(0编辑  收藏  举报