Loading

第10章:管理应用程序配置

10.1 secret

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

应用场景:凭据、https证书、secret存放docker registry认证信息、存放文件内容或者字符串,例如用户名密码

Pod使用secret两种方式:

  • 变量注入

  • 挂载

1 创建一个secret用于保存应用程序用到的用户名和密码

创建用户名和密码:

# echo -n 'admin' | base64
YWRtaW4=
# echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm

创建secret:

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

2 变量注入方式在pod中使用secret

创建pod:

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

进入到Pod中测试是否传入变量:

# kubectl exec -it mypod bash
# echo $SECRET_USERNAME
admin
# echo $SECRET_PASSWORD
1f2d1e2e67df

2 数据挂载方式在Pod中使用secret

创建pod:

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

进入到Pod中测试是否写入文件:

# kubectl exec -it mypod bash
# cat /etc/foo/username
admin
# cat /etc/foo/password
1f2d1e2e67df

如果你的应用程序使用secret,应遵循Pod获取该数据的方式。

10.2 configmap

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

应用场景:应用配置文件

1 创建一个configmap用于保存应用程序用到的字段值

创建字段

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

2 变量注入方式在Pod中使用configmap:

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
              key: special.type
  restartPolicy: Never

查看Pod日志就可以看到容器里打印的键值了:

# kubectl logs mypod 
info hello

2 数据挂载方式在pod中使用configmp

举一个常见的用法,例如将应用程序的配置文件保存到configmap中,这里以redis为例:

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: mypod
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

查看Pod日志就可以看到容器里打印的文件了:

# kubectl logs mypod 
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

10.3 应用程序如何动态更新配置?

ConfigMap更新时,动态让应用生效方案: 1、重建pod 2、应用程序本身实现监听本地配置文件,如果发生变化触发配置热更新 3、使用sidecar容器监听配置文件是否更新,如果发生变化触发socket、http通知应用热更新 4、采用配置中心,例如nacos、apollo

posted @ 2021-05-09 10:07  云起时。  阅读(202)  评论(0编辑  收藏  举报