ConfigMap配置管理

我们实际开发应用程序和部署运行时,经常有许多的配置参数。在最早的虚拟机时代,这些参数会存放在服务器环境变量、文件目录等地方,如果每一台机器都手动配置一遍,很容易出错,且不方便管理。后来则出现了etcdSpringCloud Config等方案。

k8s也提供了一套配置管理方案ConfigMap组件。

ConfigMap的创建

ConfigMap可以通过kubectl命令或是yaml资源文件方式创建,我们通常使用后者。下面是一个例子:

apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
data:
  redis_host: "192.168.1.103"
  redis_port: "6379"
  redis_prefix: "onlineshop"

例子中,我们创建了3个键值对,我们可以使用kubectl apply创建该对象。

引用ConfigMap为环境变量

在Deployment文件中,我们可以通过环境变量方式引用ConfigMap。下面例子中,我们创建了一个Pod,并通过env作为环境变量引用相关配置:

apiVersion: v1
kind: Pod
metadata:
  name: testpod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: REDIS_HOST
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: redis_host
        - name: REDIS_PORT
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: redis_port
  restartPolicy: Never

上面Pod作为例子比较简单,只是执行了一条shell的env命令,我们可以通过观察Pod日志查看其输出:

kubectl logs testpod

注意:

  1. ConfigMap不能跨命名空间引用
  2. ConfigMap需要在引用之前被创建

引用ConfigMap为配置文件

ConfigMap除了作为环境变量引用,也可以作为配置文件引用,还是使用之前的myconfig,例子如下:

apiVersion: v1
kind: Pod
metadata:
  name: testpod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "-c", "ls /etc/myconfig" ]
      volumeMounts:
      - name: myconfig-volume
        mountPath: /etc/myconfig
  volumes:
    - name: myconfig-volume
      configMap:
        name: myconfig
  restartPolicy: Never

上面例子中,ConfigMap的3个data会以3个文件的形式挂载到/etc/myconfig目录,文件名为ConfigMap的key,文件内容即为ConfigMap的值。

使用Secret部署密码

前面介绍的ConfigMap主要用于存储一些通用配置,而数据库密码等一般通过Secret组件指定,其用法和ConfigMap类似。

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  redis_password: YWJjMTIzCg==

上面例子中,我们创建了一个Opaque类型的Secret,并指定了其值。注意data中,使用的是一个BASE64编码的字符串,这个字符串并没有加密!!!只是为了防止偷窥而进行了BASE64编码。

Ubuntu下,我们可以通过如下命令获取字符串的BASE64编码:

echo "abc123" | base64

引用Secret和ConfigMap类似,下面例子中以环境变量方式引用:

apiVersion: v1
kind: Pod
metadata:
  name: testpod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: REDIS_PASSWORD
          valueFrom:
              secretKeyRef:
                name: mysecret
                key: redis_password
  restartPolicy: Never
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap