首页 > 解决方案 > 如何在 kubernetes 中传递参数以启动 rq-worker 容器

问题描述

我正在做一个使用 rq-workers 的微服务架构项目。我已经使用 docker-compose 文件成功启动并将 rq-worker 与 redis 连接,但我不确定如何在 kubernetes 中复制它。无论我使用commandargs尝试什么,我都会抛出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

标签: dockerkubernetes

解决方案


您不需要/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

推荐阅读