docker - 如何在 kubernetes 中传递参数以启动 rq-worker 容器
问题描述
我正在做一个使用 rq-workers 的微服务架构项目。我已经使用 docker-compose 文件成功启动并将 rq-worker 与 redis 连接,但我不确定如何在 kubernetes 中复制它。无论我使用command和args尝试什么,我都会抛出Crashloopbackoff的状态。请指导我了解我所缺少的内容。以下是我的 docker-compose 和 rq-worker 部署文件。
rq-worker 和 redis 容器配置:
...
rq-worker:
build: ./simba-app
command: rq worker --url redis://redis:6379 queue
depends_on:
- redis
volumes:
- sharedvolume:/simba-app/app/docs
redis:
image: redis:4.0.6-alpine
ports:
- "6379:6379"
volumes:
- ./redis:/data
...
rq-worker.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: rq-worker
labels:
app: rq-worker
spec:
selector:
matchLabels:
app: rq-worker
template:
metadata:
labels:
app: rq-worker
spec:
containers:
- name: rq-worker
image: some-image
command: ["/bin/sh", "-c"]
#command: ["rqworker", "--url", "redis://redis:6379", "queue"]
args:
- rqworker
- --url
- redis://redis:6379
- queue
imagePullSecrets:
- name: regcred
---
提前致谢!
编辑:我使用 kubectl logs 检查了日志,发现了以下日志:
Error 99 connecting to localhost:6379. Cannot assign requested address.
首先,我在代码中使用“服务名称”而不是“本地主机”来连接 rq 和 redis。不知道为什么我在日志中看到“localhost”。(注意:redis 的 kubernetes 服务名称与我的 docker-compose 文件中使用的相同)
redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:4.0.6-alpine
ports:
- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
type: ClusterIP
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
解决方案
您不需要/bin/sh -c
这里的包装器。您的设置读取第一个args:
单词 ,rqworker
并将其解析为 shell 命令并执行它;剩下的单词都丢失了。
最直接的做法是将您的命令按原样拆分成单词,就像 Kubernetescommand:
containers:
- name: rq-worker
image: some-image
command:
- rqworker
- --url
- redis://redis:6379
- queue
(这与您的示例中注释掉的字符串匹配。)
一个常见的 Docker 模式是使用 anENTRYPOINT
来进行首次设置,并使其CMD
成为在设置脚本末尾运行的完整 shell 命令。在 Kubernetes 中,command:
覆盖 Docker ENTRYPOINT
;如果您的图像具有这种模式,那么您不需要使用 a command:
,而是将此命令作为您拥有的args:
.
唯一需要sh -c
包装器的情况是在需要运行多个命令、扩展环境变量或以其他方式使用仅 shell 功能的特殊情况下。在这种情况下,命令本身必须在or中的单个单词中。command:
args:
command:
- /bin/sh
- -c
- rqworker --url redis://redis:6379 queue
推荐阅读
- javascript - 当容器有右滚动条时,Flex 项目宽度在 IE11 中不起作用
- java - 在 ionic 中构建 Android 失败,transformClassesWithDexBuilderForDebug 进程 okhttp-3.13.1.jar
- mysql - 在 MySQL 中将表从 utf8 更新为 utf8mb4 是否安全?
- visual-studio-code - 无法在片段中获得建议
- javascript - Firebase Cloud Messaging - 在发送通知之前获取数据?
- opencv - 有没有任何方法可以在不从 Unity 资产商店购买 EmguCV 包的情况下将 EmguCV 与 Unity 一起用于 UWP(HoloLens)应用程序开发?
- javascript - 通过特殊字符从字符串中查找并提取序列
- angular - 本机脚本 DatePicker 显示错误的月份值
- angular - 在 html 中使用异步管道 => ¿BehaviorSubject 或 Observable?
- time - 标签到轴 - 将 int(秒)转换为小时