如何让容器在 Kubernetes 上运行?

     2023-02-15     279

关键词:

【中文标题】如何让容器在 Kubernetes 上运行?【英文标题】:How can I keep a container running on Kubernetes? 【发布时间】:2015-10-30 10:55:40 【问题描述】:

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

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

例如,

$ sudo docker run -td ubuntu:latest

在 Kubernetes 中有这样的选项吗?

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

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

但是容器会退出几秒钟(就像使用docker run 命令启动时没有我上面提到的选项一样)。 ReplicationController 会重复启动它。

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

【问题讨论】:

使用这张图片(正如Kubernetes docs 建议的那样)非常方便:kubectl run curl --image=radial/busyboxplus:curl -i --tty 这个问题已经在这个视频中提到过:Kubernetes the very hard way at Datadog,幻灯片标题为 "Cargo culting。来自***:术语 cargo cult程序员 i> 可能适用于不熟练或新手计算机程序员(或对手头问题没有经验的人)将一些程序代码从一个地方复制到另一个地方,而对它的工作原理或新职位是否需要它的了解很少或根本不了解。 【参考方案1】:

容器旨在运行完成。您需要为您的容器提供永远不会完成的任务。这样的事情应该可以工作:

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;" ]

【讨论】:

但这是最佳做法吗? @aneeshjoshi 我不会说这是最佳实践。这只是提供一个无需立即退出即可运行的 pod 的示例。最佳实践是创建你的容器来完成它们设计的工作(一个运行到完成的工作,一个永久运行的网络服务器,等等)。我将其作为示例发布,因为当您继续创建 pod 时 Kubernetes 最初会感到沮丧,但由于默认命令立即退出而消失。 谢谢你,因为我需要一个可以存活一段时间的容器,让我进入它。我试图用比ubuntu 更轻的图像做同样的事情,并尝试了bash 图像,但无法让它工作。知道如何使用bash 图像做同样的事情吗? 我知道这是一个老问题;但是,Kubernetes 开始支持临时容器。链接:kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers。这些容器有一些限制,例如资源限制,但是它们是为调试目的而设计的。 @cryanbhu 对于更轻的图像,您可以使用 alpine,容器规范可以如下所示:"name": "util", "image": "alpine", "command": [ "/bin/sh", "-c", "--" ], "args": [ "while true; do sleep 30; done;" ](只有 json,因为 yaml 不会在 cmets 中格式化。)重要的是 @ 987654327@ 而不是 /bin/bash【参考方案2】:

您可以在 Dockerfile 中使用此 CMD:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

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

对于基于 busybox 的图像(用于基于 alpine 的图像),sleep 不知道无穷大参数。此解决方法为您提供对docker stop 的相同立即响应,如上例所示:

CMD exec /bin/sh -c "trap : TERM INT; sleep 9999999999d & wait"

【讨论】:

我在 kubernetes 部署 yaml 上使用相同的方式进行调试 这给了我“睡眠:无效数字 'infinity'” @arunkjn 谢谢。您可能会遇到使用busybox 的图像(如alpine 图像)。查看更新后的答案。 使用 sleep 999999999d 代替 sleep infinity,其中 d 表示天数。 感谢您提供有关捕获TERM/INT 的信息!我不明白为什么我的容器没有正确停止,因为sleep 会从终端响应它【参考方案3】:

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

docker run -itd debian

坦率地说,保持容器打开是一种技巧,只能用于快速测试和示例。如果你只是想要一个容器来测试几分钟,我会这样做:

docker run -d debian sleep 300

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

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

【讨论】:

感谢您的回答。我现在正试图了解容器的行为,有几十个容器同时运行。无休止的循环和使用其他繁重的命令,让我不知道容器的行为是什么。这就是我需要像只运行 /bin/bash 这样的简单容器的原因。 现在,我将尝试运行不带参数的cat 以及带大量参数的topsleep sleep infinity 在很多情况下都有效(不是busybox) 这样做有很多理由。例如,您可能会使用 helm 发布和注入配置来部署您的 pod,这将使重新创建类似环境变得烦人和麻烦。但是在其他 pod 崩溃/被删除的情况下,拥有一个具有该配置的容器可能会非常有用。 @КонстантинВан 嘿,年轻的我!你想制作一个 Pod 代替!您不会将所有内容都放在一个“容器”中。【参考方案4】:

    在你的 Dockerfile 中使用这个命令:

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

    构建您的 docker 映像。

    将其推送到您的集群或类似设备,以确保它的映像可用。
    kubectl run debug-container -it --image=<your-image>
    

【讨论】:

调试容器的好技巧。 您需要sh -c 吗?我很确定你也能做到这一点:CMD ["tail", "-f", "/dev/null"] @PeterV.Mørch,我怀疑,但仍然认为,如果你在没有sh -c 的情况下编写它,它会像一个魅力一样工作。【参考方案5】:

为了让 POD 保持运行,它应该执行某些任务,否则 Kubernetes 会发现它没有必要,因此它会停止。有很多方法可以让 POD 保持运行。

当我需要一个 POD 来连续运行而不做任何有用的操作时,我也遇到过类似的问题。以下是对我有用的两种方式:

    在运行容器时运行 sleep 命令。 在容器内运行无限循环。

虽然第一个选项比第二个选项更容易并且可能满足要求,但它不是最佳选项。因为,您要在 sleep 命令中分配的秒数是有限制的。 但是内部运行无限循环的容器永远不会退出。

但是,我将描述这两种方式(考虑到您正在运行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"]

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"]

运行以下命令运行 pod:

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

希望对你有帮助!

【讨论】:

请问,什么是睡眠?它是 Ubuntu 内部的命令吗?还是 docker 命令? @Faraz 这是一个 linux shell 命令,不是特定于 docker 的。【参考方案6】:

让 k8s pod manifest 永远运行容器的最简单命令:

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

【讨论】:

最优雅简约的解决方案。 使用该确切代码The Pod "ubuntu" is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations) 出现错误 这意味着您正在尝试更改清单中不可变的部分(使用 kubectl apply)。尝试使用 kubectl replace 和可选的 --force 标志【参考方案7】:

我能够使用 Kubernetes 中的命令 sleep infinity 使其工作,这将使容器保持打开状态。当这不起作用时,请参阅 this answer 了解替代方案。

【讨论】:

这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review @Will 当然可以。 sleep infinity 使容器保持打开状态,提供问题所要求的相同类型的功能(对于大多数类型的容器)。它还提供了一个链接,指向该特定命令不起作用时的替代方案 这是来自审查。如果您将评论文本添加到答案中,那么这是一个高质量的答案:) 我最初的标志/评论是基于说您的评论不成功,让我认为这应该是评论。添加了快速编辑并点赞。 “...... Kubernetes 中的无限睡眠”是一个不知情的说法。表示图中没有unix,也没有docker。【参考方案8】:

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

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

上面的命令将在default 命名空间中创建一个Pod,并且它将执行带有infinity 参数的sleep 命令——这样你将有一个在前台运行的进程来保持容器的存活。

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

$ kubectl exec ubuntu -it -- bash

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

【讨论】:

效果很好。不需要--restart=Never,只需拨打kubectl run ubuntu --image=ubuntu -- sleep infinity 或者如果你想做老式的更粗的命令,你总是可以做类似kubectl run busybox --image=busybox --restart=Never -- /bin/sh -c 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done;'【参考方案9】:

在你的 Dockerfile 中使用这个命令来保持容器在你的 K8s 集群中运行:

CMD tail -f /dev/null

【讨论】:

【参考方案10】:

在我的例子中,带有 initContainer 的 pod 无法初始化。运行docker ps -a 然后docker logs exited-container-id-here 给了我一条kubectl logs podname 没有显示的日志消息。谜团解开了:-)

【讨论】:

【参考方案11】:

有许多不同的方法可以实现这一点,但最优雅的一种方法是:

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

【讨论】:

为什么你认为它是最优雅的解决方案? @mordowiciel,因为它与 docker 命令直接相关,并且不像大多数其他答案那样分为两个命令。【参考方案12】:

我把它放在后台做了一个hack:

[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

【讨论】:

Kubernetes:如何从 Docker 容器 A 在 Docker 容器 B 上运行 Bash 命令

】Kubernetes:如何从Docker容器A在Docker容器B上运行Bash命令【英文标题】:Kubernetes:HowtorunaBashcommandonDockercontainerBfromDockercontainerA【发布时间】:2016-11-2622:58:41【问题描述】:我已经基于Docker-Multinode搭建了一个简单的Kubernetes测试环境... 查看详情

1kubernetes的特点组件功能

kubernetes核心特点1、kubernetes是以应用为中心的容器编排工具2、面向平台的平台,支持强大的扩展能力。容器编排容器生命周期管理:容器创建、运行、监控、终止、为容器运行提供支撑(卷编排、网络编排)容器关系管理:超... 查看详情

使用 Kubernetes 在不同的机器上运行 Docker 容器

】使用Kubernetes在不同的机器上运行Docker容器【英文标题】:RunDockerContainersonDifferentMachineswithKubernetes【发布时间】:2018-08-0719:16:16【问题描述】:Kubernetes新手,但想在不同机器上快速运行一些Docker容器,例如,节点1(物理机1)... 查看详情

kubernetes 在容器中获取端点

】kubernetes在容器中获取端点【英文标题】:kubernetesgetendpintinthecontainers【发布时间】:2021-05-1322:38:23【问题描述】:在kubernetesvm上运行,例如:kubectlgetendpoints如何在pod内获得相同的输出,我应该在pod内运行什么?我知道有一个ku... 查看详情

如何在kubernetes上部署安装php+nginx多容器应用(代码片段)

引言Kubernetes是一个开源的容器编排系统。它允许你创建、更新和扩展容器,而无需担心停机。要运行一个PHP应用程序,Nginx充当PHP-FPM的代理。将此设置打包到单个容器中可能是一个繁琐的过程,但Kubernetes将帮助在不... 查看详情

如何在kubernetes上部署php应用程序(代码片段)

引言Kubernetes是一个开源的容器编排系统。它允许你创建、更新和扩展容器,而无需担心停机。要运行一个PHP应用程序,Nginx充当PHP-FPM的代理。将此设置打包到单个容器中可能是一个繁琐的过程,但Kubernetes将帮助在不... 查看详情

为啥 Kubernetes 的容器在 runsc (gVisor) 上作为 Docker 中的运行时运行时会失败?

】为啥Kubernetes的容器在runsc(gVisor)上作为Docker中的运行时运行时会失败?【英文标题】:WhydoKubernetes\'containersfailwhenranonrunsc(gVisor)asaruntimeinDocker?为什么Kubernetes的容器在runsc(gVisor)上作为Docker中的运行时运行时会失败?【发布时间... 查看详情

kubernetes平台上更安全的构建容器镜像工具-kaniko

背景在云原生趋势下,用容器的方式来进行软件产品交付越来越普通,对于云原生的DevOps,它的CICD环境完全运行在容器中,镜像的构建也是在容器中完成的。而我们不仅要考虑如何在容器中成功构建镜像,也需要考虑如何以更... 查看详情

如何使用 Jenkins 将 Docker 容器从 Amazon ECR 自动部署到 Kubernetes

】如何使用Jenkins将Docker容器从AmazonECR自动部署到Kubernetes【英文标题】:HowtoautodeployDockercontainersfromAmazonECRtoKubernetesusingJenkins【发布时间】:2018-09-1405:15:39【问题描述】:这是我们的环境:我有一个在Amazon上运行的Kubernetes集群。... 查看详情

在 Kubernetes 上暴露多个容器端口

】在Kubernetes上暴露多个容器端口【英文标题】:Exposingmultipleportsofcontaineronkubernetes【发布时间】:2018-05-2222:03:31【问题描述】:我正在尝试在我的本地minkube集群上运行我的自定义marklogic图像。Marklogic为管理(8001)和查询(8000)公开... 查看详情

如何配置 kubernetes 从托管在同一集群/内部的注册表中提取容器映像

】如何配置kubernetes从托管在同一集群/内部的注册表中提取容器映像【英文标题】:Howtoconfigurekubernetestopullcontainerimagesfromaregistryhostedinthesamecluster/insideitself【发布时间】:2018-09-1620:28:46【问题描述】:我正在尝试让我的kubernetes集... 查看详情

如何在 Kubernetes 中的容器上指定 cpu 或内存资源

】如何在Kubernetes中的容器上指定cpu或内存资源【英文标题】:Howdoyouspecifycpuormemoryresourceoncontainerinkurbenetes【发布时间】:2015-01-1501:35:35【问题描述】:pod的定义取自https://github.com/mesosphere/kubernetes-mesos/blob/master/examples/pod-nginx.json"... 查看详情

Zeppelin+Spark+Kubernetes:让 Zeppelin Job 在现有的 Spark 集群上运行

】Zeppelin+Spark+Kubernetes:让ZeppelinJob在现有的Spark集群上运行【英文标题】:Zeppelin+Spark+Kubernetes:LetZeppelinJobrunonexistingSparkCluster【发布时间】:2020-11-2919:13:37【问题描述】:在k8s集群中。如何配置zeppelin以在现有spark集群中运行spark... 查看详情

kubernetes:在现有集群内启动一个容器,以运行cron作业(代码片段)

我正在Kubernetes集群上工作,我想在其中运行运行cron作业的单个容器。在同一集群中,我将部署3个其他运行应用程序代码的容器。仅在同一集群中添加不同类型的容器需要进行哪些更改?service.yaml:apiVersion:v1kind:Servicemetadata:label... 查看详情

kubernetes三小时攻克kubernetes!:为每个服务创建容器镜像(代码片段)

容器是什么Kubernetes是容器管理平台。可想而知我们需要容器去管理它们。但是容器是什么?Docker官方文档的最佳答案如下:容器映像是轻量级的、独立的、可执行软件包,包含所有可运行的东西:代码、运行时、系统工具、系... 查看详情

Kubernetes 在容器之间共享数据

】Kubernetes在容器之间共享数据【英文标题】:Kubernetessharedatabetweencontainers【发布时间】:2021-10-0400:22:44【问题描述】:我在K8S上锻炼,我需要在POD内的容器之间共享一些数据,我遇到的问题是我需要让容器从其他容器中获得一... 查看详情

访问在 Kubernetes 中随机端口上运行的应用程序

】访问在Kubernetes中随机端口上运行的应用程序【英文标题】:AccessanapplicationrunningonarandomportinKubernetes【发布时间】:2022-01-0223:48:49【问题描述】:我的应用程序在kubernetes集群的pod容器中运行。每次在容器中启动时,它都会分配... 查看详情

如何让 CoreDNS 在我的 Raspberry Pi Kubernetes 集群上解析?

】如何让CoreDNS在我的RaspberryPiKubernetes集群上解析?【英文标题】:HowcanIgetCoreDNStoresolveonmyRaspberryPiKubernetescluster?【发布时间】:2021-02-2411:46:40【问题描述】:我遵循了许多在线教程,在四个RaspberryPi4上设置了Kubernetes集群。我最... 查看详情