使用 ConfigMap 来配置 Redis

这篇文档基于使用 ConfigMap 来配置 Containers 这个任务,提供了一个使用 ConfigMap 来配置 Redis 的真实案例。

教程目标

  • 使用 Redis 配置的值创建一个 ConfigMap
  • 创建一个 Redis Pod,挂载并使用创建的 ConfigMap
  • 验证配置已经被正确应用。

准备开始

  • 你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    要获知版本信息,请输入 kubectl version.

  • 此页面上显示的示例适用于 kubectl 1.14和在其以上的版本。

  • 理解使用ConfigMap来配置Containers

真实世界的案例:使用 ConfigMap 来配置 Redis

按照下面的步骤,使用 ConfigMap 中的数据来配置 Redis 缓存。

首先创建一个配置模块为空的 ConfigMap:

  1. cat <<EOF >./example-redis-config.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: example-redis-config
  6. data:
  7. redis-config: ""
  8. EOF

应用上面创建的 ConfigMap 以及 Redis pod 清单:

  1. kubectl apply -f example-redis-config.yaml
  2. kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/pods/config/redis-pod.yaml

检查 Redis pod 清单的内容,并注意以下几点:

  • spec.volumes[1] 创建一个名为 config 的卷。
  • spec.volumes[1].items[0] 下的 keypath 会将来自 example-redis-config ConfigMap 中的 redis-config 密钥公开在 config 卷上一个名为 redis-config 的文件中。
  • 然后 config 卷被 spec.containers[0].volumeMounts[1] 挂载在 /redis-master

这样做的最终效果是将上面 example-redis-config 配置中 data.redis-config 的数据作为 Pod 中的 /redis-master/redis.conf 公开。

pods/config/redis-pod.yaml 使用 ConfigMap 来配置 Redis - 图1

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: redis
  5. spec:
  6. containers:
  7. - name: redis
  8. image: redis:5.0.4
  9. command:
  10. - redis-server
  11. - "/redis-master/redis.conf"
  12. env:
  13. - name: MASTER
  14. value: "true"
  15. ports:
  16. - containerPort: 6379
  17. resources:
  18. limits:
  19. cpu: "0.1"
  20. volumeMounts:
  21. - mountPath: /redis-master-data
  22. name: data
  23. - mountPath: /redis-master
  24. name: config
  25. volumes:
  26. - name: data
  27. emptyDir: {}
  28. - name: config
  29. configMap:
  30. name: example-redis-config
  31. items:
  32. - key: redis-config
  33. path: redis.conf

检查创建的对象:

  1. kubectl get pod/redis configmap/example-redis-config

你应该可以看到以下输出:

  1. NAME READY STATUS RESTARTS AGE
  2. pod/redis 1/1 Running 0 8s
  3. NAME DATA AGE
  4. configmap/example-redis-config 1 14s

回顾一下,我们在 example-redis-config ConfigMap 保留了空的 redis-config 键:

  1. kubectl describe configmap/example-redis-config

你应该可以看到一个空的 redis-config 键:

  1. Name: example-redis-config
  2. Namespace: default
  3. Labels: <none>
  4. Annotations: <none>
  5. Data
  6. ====
  7. redis-config:

使用 kubectl exec 进入 pod,运行 redis-cli 工具检查当前配置:

  1. kubectl exec -it redis -- redis-cli

查看 maxmemory

  1. 127.0.0.1:6379> CONFIG GET maxmemory

它应该显示默认值 0:

  1. 1) "maxmemory"
  2. 2) "0"

同样,查看 maxmemory-policy

  1. 127.0.0.1:6379> CONFIG GET maxmemory-policy

它也应该显示默认值 noeviction

  1. 1) "maxmemory-policy"
  2. 2) "noeviction"

现在,向 example-redis-config ConfigMap 添加一些配置:

pods/config/example-redis-config.yaml 使用 ConfigMap 来配置 Redis - 图2

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: example-redis-config
  5. data:
  6. redis-config: |
  7. maxmemory 2mb
  8. maxmemory-policy allkeys-lru

应用更新的 ConfigMap:

  1. kubectl apply -f example-redis-config.yaml

确认 ConfigMap 已更新:

  1. kubectl describe configmap/example-redis-config

你应该可以看到我们刚刚添加的配置:

  1. Name: example-redis-config
  2. Namespace: default
  3. Labels: <none>
  4. Annotations: <none>
  5. Data
  6. ====
  7. redis-config:
  8. ----
  9. maxmemory 2mb
  10. maxmemory-policy allkeys-lru

通过 kubectl exec 使用 redis-cli 再次检查 Redis Pod,查看是否已应用配置:

  1. kubectl exec -it redis -- redis-cli

查看 maxmemory

  1. 127.0.0.1:6379> CONFIG GET maxmemory

它保持默认值 0:

  1. 1) "maxmemory"
  2. 2) "0"

同样,maxmemory-policy 保留为默认设置 noeviction

  1. 127.0.0.1:6379> CONFIG GET maxmemory-policy

返回:

  1. 1) "maxmemory-policy"
  2. 2) "noeviction"

配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。 让我们删除并重新创建 Pod:

  1. kubectl delete pod redis
  2. kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/pods/config/redis-pod.yaml

现在,最后一次重新检查配置值:

  1. kubectl exec -it redis -- redis-cli

查看 maxmemory

  1. 127.0.0.1:6379> CONFIG GET maxmemory

现在,它应该返回更新后的值 2097152:

  1. 1) "maxmemory"
  2. 2) "2097152"

同样,maxmemory-policy 也已更新:

  1. 127.0.0.1:6379> CONFIG GET maxmemory-policy

现在它反映了期望值 allkeys-lru

  1. 1) "maxmemory-policy"
  2. 2) "allkeys-lru"

删除创建的资源,清理你的工作:

  1. kubectl delete pod/redis configmap/example-redis-config

接下来