如何在不运行进程的K8S上运行utils POD

时间:2019-09-15 15:28:30

标签: docker kubernetes

我有这个Docker映像,其中安装了许多有用的工具。我在docker内部使用它来调试内容,例如测试与其他容器的连接。现在我想在Kubernetes中使用此图像。但是,由于它不运行进程,因此pod无法启动

Dockerfile:

FROM ubuntu:latest
RUN .... useful tools ...

还有kubernetes文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: uitls
spec:
  replicas: 1
  selector:
    matchLabels:
      bar: utils-xxl
  template:
    metadata:
      labels:
        bar: utils-xxl
    spec:
      containers:
      - name: utils
        image: jeanluca/base

当我尝试应用此广告连播时,它以CrashLoopBackOff状态结束。 Kubernetes中有没有办法启动这个Pod?也许使用execbash?有什么建议吗?

3 个答案:

答案 0 :(得分:4)

您可以kubectl run一次性容器进行交互式调试。

kubectl run jeanluca-debug \
  --generator=run-pod/v1 \
  --rm -it \
  --image=jeanluca/base

这基本上与具有相同选项的docker run命令等效,只是容器名称是必需的位置参数。

此技术对于您描述的各种调试任务很有用。如果您的映像具有redis-climysqlpsql客户端之类的工具,DNS hostdig之类的DNS查找工具,等等,则可能会很有用弄清楚为什么您的组合系统完全损坏了。图像的默认命令可以为CMD ["/bin/bash"],这很好,但是如果没有附加输入流,它将立即退出,因此您需要像这样通过kubectl run运行它,而不是尝试获取它。部署以保持其生命力。

通常,保持容器或容器的运行实际上没有任何意义。当然,有一些技巧可以阻止Docker容器退出,但我建议您避免使用它们。

答案 1 :(得分:3)

如果您想要一个可以一直执行的Pod,可以将其用于执行和运行命令,则只需告诉容器打开外壳并进入睡眠状态即可。

类似这样的东西:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: uitls
spec:
  replicas: 1
  selector:
    matchLabels:
      bar: utils-xxl
  template:
    metadata:
      labels:
        bar: utils-xxl
    spec:
      containers:
      - name: utils
        image: jeanluca/base
        command: ["/bin/sh"]
        args: ["-c", "while true; sleep 999; done"]

答案 2 :(得分:1)

您可以尝试以下操作:

  • CMD tail -f /dev/null的末尾添加dockerfile。在这种情况下,应使用相同的部署yaml。

OR

  • 修改您的k8s部署。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: uitls
spec:
  replicas: 1
  selector:
    matchLabels:
      bar: utils-xxl
  template:
    metadata:
      labels:
        bar: utils-xxl
    spec:
      containers:
      - name: utils
        image: jeanluca/base
        command: ["tail"]
        args: ["-f", "/dev/null"]

OR

  • 使用docker run参照this在类似kubectl run的k8容器中运行容器。

希望这会有所帮助。