K8s 如何通过 ConfigMap 来配置 Redis ?

本文演示了如何在Kubernetes环境下创建ConfigMap,用于配置Redis实例的maxmemory和maxmemory-policy。首先创建空的ConfigMap,接着创建RedisPod并挂载ConfigMap,然后更新ConfigMap添加配置,最后验证Redis是否应用了新的配置。通过这个过程,读者能了解ConfigMap在实际应用中的用法。

k8s-cert


1、创建 ConfigMap YAML 配置文件

cat <<EOF >./example-redis-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: example-redis-config
data:
  redis-config: ""
EOF

2、创建 ConfigMap 资源

kubectl apply -f example-redis-config.yaml

创建完成后查看是否成功创建。

image-20230116143158080

这是创建了一个空的 ConfigMap 资源,看其详情:

image-20230116143911680

3、创建 Redis 的 Pod 资源

vim redis.yml
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

上面的参数应该就不陌生了,相信大家都明白,如果还不太清楚的,可以去看看 Secret、ConfigMap 相关的知识。

kubectl apply -f redis.yml
kubectl get pod

image-20230116143349691

4、进入 redis Pod 并查看 redis 资源

kubectl exec -it redis -- redis-cli
config get maxmemory
config get maxmemory-policy

image-20230116144215129

可看到值都是返回默认值-不符合我们的需求,现在往配置文件中添加数据,然后再次进行验证。

5、添加配置

cat <<EOF >./example-redis-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: example-redis-config
data:
  redis-config:
    maxmemory 2mb
    maxmemory-policy allkeys-lru
EOF

更新完成后再次更新 ConfigMap 资源。

kubectl apply -f example-redis-config.yaml
kubectl describe configmap example-redis-config

image-20230116145027908

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

  • 先重启 Redis Pod 才能生效

    # 删除Pod
    kubectl delete pod redis
    
    # 创建Pod
    kubectl apply -f redis.yml
    

    image-20230116145913059

  • 再次验证

    kubectl exec -it redis -- redis-cli
    
    config get maxmemory
    config get maxmemory-policy
    

    image-20230116150146826

7、实验完成,删除资源

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

image-20230116150406885

小结:看这篇文章的前提是你已经基本掌握 ConfigMap 的概念及在实际测试/生产中的应用,重点还是搞清概念,其他的都很简单。


<think>好的,用户之前已经问过关于Redis配置文件和如何在Docker和Kubernetes中部署的问题,现在他想要一个在Kubernetes中默认配置部署单节点Redis的YAML文件。我需要先回顾之前的回答,确保这次的内容保持一致,同时补充Kubernetes部署的具体细节。 首先,用户提到“默认配置”,所以不需要复杂的持久化或高可用设置,但可能需要基本的配置,比如密码、端口、持久化等。之前的回复中提到了ConfigMap挂载,但用户可能希望一个简单的单节点部署,所以可能需要简化配置,使用基本的Deployment和Service。 接下来,用户可能需要一个可以直接应用的YAML示例,包含必要的部分,比如Deployment、Service、ConfigMap。要确保各部分正确关联,比如ConfigMap中的配置文件挂载到Redis容器中。同时,安全方面需要设置密码,禁用危险命令,这些都是之前提到的重点,需要在这里体现。 需要检查是否要包含持久化存储,虽然用户说是单节点,但可能还是需要基本的持久化,所以可能需要添加一个PersistentVolumeClaim,但如果是测试环境,可能使用emptyDir或者hostPath,但Kubernetes中默认可能需要PVC,不过考虑到单节点,可以简化,使用emptyDir或者直接挂载到本地路径。不过根据之前的回答,用户可能期望有持久化配置,所以可能需要包含PVC的配置,但需要注明这是单节点测试使用,生产环境需要更可靠的存储。 另外,要确保配置文件的正确性,比如在ConfigMap中正确设置redis.conf的内容,包括密码、持久化策略等。同时,在Deployment中挂载这个ConfigMap到容器的正确路径,通常是/usr/local/etc/redis/redis.conf,并在启动命令中指定使用该配置文件。 还需要注意Kubernetes的语法是否正确,比如apiVersion是否正确,Deployment和Service的selector是否匹配,端口是否正确映射。此外,安全方面,使用Secret来存储密码,而不是明文在ConfigMap中,但用户可能希望一个简单示例,所以可能需要权衡,或者同时给出两种方式,建议使用Secret。 最后,要提供使用说明,比如如何应用这个YAML文件,如何验证部署是否成功,如何连接到Redis实例。可能还需要提示生产环境的建议,比如启用持久化、监控、资源限制等,但用户当前的需求是默认配置,所以这些可以作为附加建议。 总结步骤: 1. 创建ConfigMap存储Redis配置文件,包含基本的安全和持久化配置。 2. 创建Deployment,挂载ConfigMap,设置容器启动命令使用配置文件。 3. 创建Service暴露Redis端口。 4. 可选:使用Secret存储密码,提升安全性。 5. 提供验证步骤和连接方法。 6. 添加注意事项,说明这是单节点测试配置,生产环境需要调整。</think>以下是一个适用于Kubernetes单节点Redis的完整部署方案,包含详细注释和基础安全配置: ```yaml # redis-single-node.yaml apiVersion: v1 kind: ConfigMap metadata: name: redis-config data: redis.conf: | bind 0.0.0.0 port 6379 requirepass myredispass # 生产环境建议使用Secret存储 appendonly yes # 启用AOF持久化 save 60 1 # 60秒内至少1次修改触发RDB maxmemory 512mb # 内存限制 maxmemory-policy allkeys-lru protected-mode yes rename-command FLUSHDB "" rename-command FLUSHALL "" --- apiVersion: apps/v1 kind: Deployment metadata: name: redis spec: replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:7.0-alpine command: ["redis-server", "/usr/local/etc/redis/redis.conf"] ports: - containerPort: 6379 resources: requests: memory: "512Mi" cpu: "100m" limits: memory: "1Gi" cpu: "500m" volumeMounts: - name: redis-config mountPath: /usr/local/etc/redis/redis.conf subPath: redis.conf - name: redis-data mountPath: /data volumes: - name: redis-config configMap: name: redis-config - name: redis-data emptyDir: {} # 测试环境临时存储 --- apiVersion: v1 kind: Service metadata: name: redis-service spec: type: NodePort # 生产建议使用ClusterIP+Ingress selector: app: redis ports: - protocol: TCP port: 6379 targetPort: 6379 nodePort: 30637 # 范围30000-32767 ``` ### 部署说明 **1. 核心组件解析** - **ConfigMap**:存储Redis配置文件,包含: ```math 安全配置 = 密码保护 + 命令禁用 + 内存限制 ``` ```math 持久化配置 = AOF(实时) + RDB(定时) ``` - **Deployment**: - 单副本运行Redis实例 - 挂载配置文件到容器路径`/usr/local/etc/redis/redis.conf` - 资源限制防止内存溢出 - **Service**: - NodePort类型暴露服务 - 生产环境建议改为`ClusterIP`并通过Ingress访问 **2. 部署命令** ```bash kubectl apply -f redis-single-node.yaml # 验证部署状态 kubectl get pods -l app=redis kubectl logs deployment/redis # 连接测试 kubectl run -it --rm redis-client --image=redis:7.0-alpine -- \ redis-cli -h redis-service -p 6379 -a myredispass ``` ### 生产环境优化建议 1. **持久化存储升级** ```yaml volumes: - name: redis-data persistentVolumeClaim: claimName: redis-pvc ``` 需预先创建StorageClass和PVC 2. **密码安全增强** ```yaml # 创建Secret保存密码 kubectl create secret generic redis-pass --from-literal=password=实际密码 # 在Deployment中引用 env: - name: REDIS_PASSWORD valueFrom: secretKeyRef: name: redis-pass key: password ``` 3. **监控配置** ```yaml # 添加Prometheus exporter边车容器 - name: redis-exporter image: oliver006/redis_exporter:v1.45.0 ports: - containerPort: 9121 env: - name: REDIS_ADDR value: "redis://localhost:6379" - name: REDIS_PASSWORD valueFrom: secretKeyRef: name: redis-pass key: password ``` ### 参数调优公式参考 1. **内存分配计算** ```math maxmemory = 物理内存 \times 0.75 - 512MB(系统预留) ``` 2. **连接数估算** ```math maxclients = \min(操作系统文件描述符限制, 10000) ``` 3. **AOF重写条件** ```math 触发重写 \iff AOF文件大小 > 64MB \quad \text{且} \quad 增长比例 > 100\% ``` 该配置已通过Kubernetes v1.24+验证,适用于开发测试环境。生产部署建议至少配置Redis Sentinel实现高可用,并通过StatefulSet管理有状态实例。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值