现象:

原因分析:  没有覆盖容器内部的cmd命令

看看官方镜像的说明,就能知道容器默认运行时不会指定redis配置文件

所以,就算你用本地redis.conf挂载到容器内部,但是因为容器启动命令并没有被重新,那么redis-server启动时并不会读取这个挂载的redis.conf文件

解决办法:

方法一(不推荐): 直接通过容器命令行参数传递redis密码和绑定ip范围:

类似于这样的:redis-server --requirepass 123456 --bind 0.0.0.0

spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: redis-server-app
  template:
    metadata:
      labels:
        k8s-app: redis-server-app
        name: redis-server-app
    spec:
      containers:
      - image: redis:6.2-alpine
        name: redis-server-app
        ports:
        - name: serv
          containerPort: 6379
        args:
        - --requirepass 123456
        - --bind 0.0.0.0

 方法二:使用configmap, 把redis.conf文件的内容写入到configmap的data中,然后通过configmap的name和key挂载到容器内部的目录

核心配置如下:

    spec:
      containers:
      - image: redis:6.2-alpine
        name: redis-server-app
        ports:
        - name: serv
          containerPort: 6379
        volumeMounts:
         - name: config-volume
           mountPath: /etc/redis #注意这里的路径只能到/etc/redis,而不能是/etc/redis/redis.conf,否则redis.conf也会是目录
        command: ["redis-server", "/etc/redis/redis.conf"] #通过command覆盖容器启动命令
      volumes:
      - name: config-volume
        configMap:
          name: redis-configmap
          items:
            - key:  "redisConfig"
              path: "redis.conf"   #这里的path跟上面的mountPath属于叠加关系,一起合成挂载到容器内部的路径
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: redis-configmap
data:  # data下面的redisConfig必须跟上面configMap中items中的key保持一致,否则无法读取这里的内容
  redisConfig: | # 这里的竖线的作用:原文中的换行符和缩进将被保留,可以保留原文的原始格式
    requirepass 123456
    bind 0.0.0.0

这里需要特别注意的是:

1. configMap=>items下面的path跟上面的mountPath属于叠加关系,二者合成的路径就是挂载到容器内部的路径。

2. configMap中data下面的redisConfig字段必须跟上面configMap中items中的key保持一致,否则无法读取data里面的内容

重点就是通过command指令覆盖容器的启动指令,达到读取用户自定义配置的目的

 方法三:使用configmap读取已经写好的redis.conf文件,然后通过configmap的name挂载到容器内部的目录

首先创建一个redis.conf文件,比如在当前目录下的config目录下创建一个redis.conf文件,文件内容为:

bind 0.0.0.0
requirepass 123456

 

然后使用kubectl 创建一个configmap读取这个redis.conf文件

语法:kubectl create configmap {创建configmap的名称} --from-file={读取配置文件的路径}

kubectl create configmap redis-configmap --from-file=config/redis.conf

然后把configmap读取的配置文件挂载到容器内部,并使用command指令读取redis配置文件并覆盖容器默认的cmd启动命令

核心配置:如下:

    spec:
      containers:
      - image: redis:6.2-alpine
        name: redis-server-app
        ports:
        - name: serv
          containerPort: 6379
        volumeMounts:
         - name: config-volume
           # 注意这里的路径只能到/etc/redis,不能是/etc/redis/redis.conf, 
           mountPath: /etc/redis 
           # 否则redis.conf也会是目录,最终路径就成了/etc/redis/redis.conf/
        command: ["redis-server", "/etc/redis/redis.conf"]
      volumes:
      - name: config-volume
        configMap:
          #要提前通过命令创建这个configmap: kubectl create configmap redis-configmap --from-file=config/redis.conf
          name: redis-configmap  

特别注意点: mountPath只能写到/etc/redis,因为configmap读取的文件名redis.conf会自动追加到该路径后面, 如果你写成/etc/redis/redis.conf, 那么最终路径就会变成/etc/redis.conf/redis.conf

另外挂载卷一定不要使用hostPath !!! 否则在分布式环境中pod没法在不同的节点读到数据!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐