使用 ConfigMap 配置 Redis
本页面提供了如何使用 ConfigMap 配置 Redis 的真实示例,并在此基础上构建了配置 Pod 使用 ConfigMap任务。
目标
- 创建包含 Redis 配置值的 ConfigMap
- 创建一个挂载并使用所创建 ConfigMap 的 Redis Pod
- 验证配置是否正确应用。
准备工作
你需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具已配置为与你的集群通信。建议在至少有两个不作为控制平面主机的节点的集群上运行本教程。如果你没有集群,可以使用 minikube 创建一个,或者使用以下任一 Kubernetes 演练场:
要查看版本,请输入 kubectl version
。
- 本页面显示的示例适用于
kubectl
1.14 及更高版本。 - 理解 配置 Pod 使用 ConfigMap。
真实示例:使用 ConfigMap 配置 Redis
按照以下步骤使用存储在 ConfigMap 中的数据配置 Redis 缓存。
首先创建一个包含空配置块的 ConfigMap
cat <<EOF >./example-redis-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: example-redis-config
data:
redis-config: ""
EOF
应用上面创建的 ConfigMap 和 Redis Pod manifest
kubectl apply -f example-redis-config.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/pods/config/redis-pod.yaml
检查 Redis Pod manifest 的内容,并注意以下几点:
- 通过
spec.volumes[1]
创建了一个名为config
的卷。 spec.volumes[1].configMap.items[0]
下的key
和path
将example-redis-config
ConfigMap 中的redis-config
键作为名为redis.conf
的文件暴露在config
卷上。- 然后通过
spec.containers[0].volumeMounts[1]
将config
卷挂载到/redis-master
。
这最终的效果是,将上面 example-redis-config
ConfigMap 中 data.redis-config
的数据作为 /redis-master/redis.conf
文件暴露在 Pod 内部。
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis:5.0.4
command:
- redis-server
- "/redis-master/redis.conf"
env:
- name: MASTER
value: "true"
ports:
- containerPort: 6379
resources:
limits:
cpu: "0.1"
volumeMounts:
- mountPath: /redis-master-data
name: data
- mountPath: /redis-master
name: config
volumes:
- name: data
emptyDir: {}
- name: config
configMap:
name: example-redis-config
items:
- key: redis-config
path: redis.conf
检查已创建的对象
kubectl get pod/redis configmap/example-redis-config
你应该看到以下输出:
NAME READY STATUS RESTARTS AGE
pod/redis 1/1 Running 0 8s
NAME DATA AGE
configmap/example-redis-config 1 14s
回想一下,我们把 example-redis-config
ConfigMap 中的 redis-config
键留空了
kubectl describe configmap/example-redis-config
你应该看到一个空的 redis-config
键。
Name: example-redis-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
redis-config:
使用 kubectl exec
进入 Pod 并运行 redis-cli
工具检查当前配置
kubectl exec -it redis -- redis-cli
检查 maxmemory
127.0.0.1:6379> CONFIG GET maxmemory
它应该显示默认值 0
1) "maxmemory"
2) "0"
类似地,检查 maxmemory-policy
127.0.0.1:6379> CONFIG GET maxmemory-policy
这也应该显示其默认值 noeviction
1) "maxmemory-policy"
2) "noeviction"
现在让我们向 example-redis-config
ConfigMap 添加一些配置值
apiVersion: v1
kind: ConfigMap
metadata:
name: example-redis-config
data:
redis-config: |
maxmemory 2mb
maxmemory-policy allkeys-lru
应用更新后的 ConfigMap
kubectl apply -f example-redis-config.yaml
确认 ConfigMap 已更新
kubectl describe configmap/example-redis-config
你应该看到我们刚刚添加的配置值
Name: example-redis-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
redis-config:
----
maxmemory 2mb
maxmemory-policy allkeys-lru
再次使用 kubectl exec
通过 redis-cli
检查 Redis Pod,看看配置是否已应用
kubectl exec -it redis -- redis-cli
检查 maxmemory
127.0.0.1:6379> CONFIG GET maxmemory
它仍然保持默认值 0
1) "maxmemory"
2) "0"
类似地,maxmemory-policy
仍然是默认设置 noeviction
127.0.0.1:6379> CONFIG GET maxmemory-policy
返回
1) "maxmemory-policy"
2) "noeviction"
配置值没有改变,因为 Pod 需要重启才能获取关联 ConfigMap 的更新值。让我们删除并重新创建 Pod
kubectl delete pod redis
kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/pods/config/redis-pod.yaml
现在最后一次重新检查配置值
kubectl exec -it redis -- redis-cli
检查 maxmemory
127.0.0.1:6379> CONFIG GET maxmemory
现在它应该返回更新后的值 2097152
1) "maxmemory"
2) "2097152"
类似地,maxmemory-policy
也已更新
127.0.0.1:6379> CONFIG GET maxmemory-policy
它现在反映了期望值 allkeys-lru
1) "maxmemory-policy"
2) "allkeys-lru"
删除创建的资源以清理工作
kubectl delete pod/redis configmap/example-redis-config
下一步
- 详细了解 ConfigMaps。
- 按照 通过 ConfigMap 更新配置 的示例进行操作。