如何在Kubernetes上运行容器?

时间:2015-08-07 05:20:51

标签: docker containers kubernetes google-kubernetes-engine

我现在正在尝试在Kubernetes集群上运行一个带shell(/ bin / bash)的简单容器。

我认为有一种方法可以通过在pseudo-tty命令上使用-td和分离选项(docker run选项)来保持容器在Docker容器上运行。

例如,

$ sudo docker run -td ubuntu:latest

Kubernetes中有这样的选项吗?

我尝试使用kubectl run-container命令运行容器,如:

kubectl run-container test_container ubuntu:latest --replicas=1

但容器会退出几秒钟(就像使用docker run命令启动而没有上面提到的选项)。并且ReplicationController重复再次启动它。

有没有办法让Kubernetes上的容器像-td命令中的docker run选项一样运行?

13 个答案:

答案 0 :(得分:79)

容器意味着运行完成。您需要为容器提供永不完成的任务。这样的事情应该有效:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just spin & wait forever
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]

答案 1 :(得分:73)

您可以在print_r($this->create->model->getItemDetails($item_id)

中使用此CMD
Dockerfile

这将使您的容器保持活着,直到它被告知停止。使用陷阱和等待将使您的容器立即对停止请求做出反应。没有陷阱/等待停止将需要几秒钟。

对于基于busybox的图像(用于基于高山的图像),睡眠不知道无穷大论点。此解决方法为您提供了与CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait" 相同的立即响应,如上例所示:

docker stop

答案 2 :(得分:29)

当主进程退出时,容器退出。做类似的事情:

docker run -itd debian

保持容器打开坦率地说是一个只能用于快速测试和示例的黑客攻击。如果您只想要一个容器进行几分钟的测试,我会这样做:

docker run -d debian sleep 300

其优点是,如果您忘记了容器,容器将自动退出。或者,您可以在while循环中放置这样的内容以使其永久运行,或者只运行top之类的应用程序。所有这些在Kubernetes都很容易做到。

真正的问题是你为什么要这样做?您的容器应该提供服务,其过程将使容器在后台运行。

答案 3 :(得分:15)

  1. 在Dockerfile中使用此命令:

    CMD ["sh", "-c", "tail -f /dev/null"]

  2. 构建您的泊坞窗图片。

  3. 将其推送到您的群集或类似网站,只是为了确保图片可用。
  4. kubectl run debug-container -it --image=<your-image>

答案 4 :(得分:7)

为了使POD保持运行,POD应该执行某些任务,否则Kubernetes会发现它是不必要的,因此退出。保持POD运行的方法有很多。

当我需要POD来连续运行而不做任何事情时,我也遇到了类似的问题。以下是为我工作的两种方式:

  1. 在运行容器时启动睡眠命令。
  2. 在容器内运行无限循环。

尽管第一个选项比第二个选项容易,并且可能满足要求,但这不是最佳选择。另外,在睡眠命令中要分配的秒数有一个限制。 但是在其中运行无限循环的容器永远不会退出。

但是,我将描述两种方式(考虑到您正在运行busybox容器):

1。睡眠命令

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    ports:
    - containerPort: 80
    command: ["/bin/sh", "-ec", "sleep 1000"]
  nodeSelector:
    beta.kubernetes.io/os: linux

2。无限循环

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    ports:
    - containerPort: 80
    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
  nodeSelector:
    beta.kubernetes.io/os: linux

运行以下命令来运行Pod:

kubectl apply -f <pod-yaml-file-name>.yaml

希望有帮助!

答案 5 :(得分:6)

我能够使用Kubernetes中的命令sleep infinity来实现此功能,这将使容器保持打开状态。如果不起作用,请参阅this answer了解替代方案。

答案 6 :(得分:5)

最简单的命令,因为它可以使k8s pod清单永久运行容器:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just sleep forever
    command: [ "sleep" ]
    args: [ "infinity" ]

答案 7 :(得分:2)

在我的情况下,带有initContainer的pod无法初始化。运行docker ps -a然后docker logs exited-container-id-here向我发送了一条kubectl logs podname未显示的日志消息。神秘解决了: - )

答案 8 :(得分:0)

在Dockerfile中使用此命令可保持容器在K8s集群中运行:

  • CMD tail -f / dev / null

答案 9 :(得分:0)

有多种方法可以实现这一目标,但是最优雅的一种方法是:

kubectl run -i --tty --image ubuntu:latest ubuntu-test --restart=Never --rm /bin/sh

答案 10 :(得分:0)

使用Kubernetes部署和服务。

答案 11 :(得分:0)

我通过将其置于后台进行了入侵:

[root@localhost ~]# kubectl run hello -it --image ubuntu -- bash &
[2] 128461

执行{pod hello

[root@localhost ~]# kubectl exec -it hello -- whoami
root
[root@localhost ~]# kubectl exec -it hello -- hostname
hello

获取外壳

[root@localhost ~]# kubectl exec -it hello -- bash
root@hello:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

答案 12 :(得分:-1)

我在这个问题上的几分钱。假设kubectl在工作,那么与您在问题中提到的docker命令等效的最接近命令就是这样。

$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity

以上命令将在Pod命名空间中创建一个default,并且将使用sleep参数执行infinity命令-这样,您将有一个在使容器保持活动的前景。

后缀,您可以通过运行Pod命令与kubectl exec进行交互。

$ kubectl exec ubuntu -it -- bash

此技术对于创建Pod资源和临时调试非常有用。