解决k8s设置redis密码失败并报错:called without any password configured for the default user的问题
解决k8s设置redis密码失败并报错:called without any password configured for the default user的问题
现象:
原因分析: 没有覆盖容器内部的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没法在不同的节点读到数据!
更多推荐
所有评论(0)