【问题标题】:How to pass arguments in kubernetes to start a rq-worker container如何在 kubernetes 中传递参数以启动 rq-worker 容器
【发布时间】:2021-09-22 13:14:15
【问题描述】:

我正在开发一个使用 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

【问题讨论】:

    标签: docker kubernetes


    【解决方案1】:

    这里不需要/bin/sh -c 包装器。您的设置读取第一个args:rqworker,并将其解析为shell 命令并执行它;剩下的单词都丢失了。

    最直接的做法是将您的命令按原样拆分成单词,如 Kubernetes command:

          containers:
          - name: rq-worker
            image: some-image
            command:
              - rqworker
              - --url
              - redis://redis:6379
              - queue   
    

    (这与您示例中注释掉的字符串匹配。)

    常见的 Docker 模式是使用 ENTRYPOINT 进行首次设置,并使 CMD 成为在设置脚本末尾运行的完整 shell 命令。在 Kubernetes 中,command: 覆盖 Docker ENTRYPOINT;如果你的图像有这种模式,那么你不需要使用command:,而是把这个命令作为你拥有的args:

    您需要sh -c 包装器的唯一情况是在需要运行多个命令、扩展环境变量或以其他方式使用仅外壳功能的特殊情况下。在这种情况下,命令本身必须在command:args: 中的一个单个单词中。

    command:
      - /bin/sh
      - -c
      - rqworker --url redis://redis:6379 queue
    

    【讨论】:

    • 非常感谢@DavidMaze 的详细解释和帮助。真的很感激!终于搞定了。
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 2020-06-24
    • 2019-06-12
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多