簡體   English   中英

如何讓容器在 Kubernetes 上運行?

[英]How can I keep a container running on Kubernetes?

我現在正在嘗試在 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 會重復啟動它。

有沒有辦法讓容器在 Kubernetes 上運行,就像docker run命令中的-td選項一樣?

容器旨在運行完成。 你需要為你的容器提供一個永遠不會完成的任務。 這樣的事情應該工作:

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

您可以在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"

容器在其主進程退出時退出。 做類似的事情:

docker run -itd debian

坦率地說,保持容器打開是一種技巧,只應用於快速測試和示例。 如果您只想要一個容器進行幾分鍾的測試,我會這樣做:

docker run -d debian sleep 300

這樣做的好處是如果你忘記了容器會自動退出。 或者,您可以將類似的內容放在while循環中以使其永遠運行,或者只運行諸如top的應用程序。 所有這些在 Kubernetes 中都應該很容易做到。

真正的問題是你為什么要這樣做? 您的容器應該提供一項服務,該服務的進程將使容器在后台運行。

  1. 在你的 Dockerfile 中使用這個命令:

     CMD ["sh", "-c", "tail -f /dev/null"]
  2. 構建您的 docker 鏡像。

  3. 將它推送到你的集群或類似的,只是為了確保它的圖像可用。
  4.  kubectl run debug-container -it --image=<your-image>

為了保持 POD 運行,它應該執行某些任務,否則 Kubernetes 會發現它沒有必要,因此它會停止。 有很多方法可以讓 POD 保持運行。

當我需要一個 POD 只是為了連續運行而不做任何有用的操作時,我也遇到過類似的問題。 以下是對我有用的兩種方式:

  1. 在運行容器時啟動 sleep 命令。
  2. 在容器內運行無限循環。

盡管第一個選項比第二個選項容易並且可能滿足要求,但它不是最佳選擇。 因為,您要在 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

希望能幫助到你!

最簡單的命令,因為它可以讓 k8s pod manifest 永遠運行容器:

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

我能夠讓它與 Kubernetes 中的sleep infinity命令一起使用,這將使容器保持打開狀態。 當這不起作用時,請參閱此答案以獲取替代方案。

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

  • CMD tail -f /dev/null

我在這個問題上的幾分錢。 假設kubectl正在工作,那么與您在問題中提到的kubectl命令最接近的命令將是這樣的。

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

上面的命令將在default命名空間中創建一個Pod ,它將執行帶有infinity參數的sleep命令 - 這樣你將有一個在前台運行的進程保持容器處於活動狀態。

之后,您可以通過運行kubectl exec命令與Pod進行交互。

$ kubectl exec ubuntu -it -- bash

這種技術對於創建 Pod 資源和臨時調試非常有用。

添加:在模板中->在規范中->在容器中->在端口中和容器端口行之后

    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 6 ; done"]

就我而言,帶有 initContainer 的 pod 無法初始化。 運行docker ps -a然后docker logs exited-container-id-here給了我一條日志消息, kubectl logs podname沒有顯示。 謎團已揭開 :-)

有許多不同的方法可以實現這一點,但最優雅的方法之一是:

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

我現在正在嘗試在Kubernetes集群上運行帶有shell(/ bin / bash)的簡單容器。

我以為有一種方法可以通過使用pseudo-tty和detach選項( -td docker run命令上的-td選項)來保持容器在Docker容器上docker run

例如,

$ sudo docker run -td ubuntu:latest

Kubernetes中有這樣的選擇嗎?

我試過使用kubectl run-container命令kubectl run-container例如:

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

但是容器會退出幾秒鍾(就像使用不帶我上面提到的選項的docker run命令啟動一樣)。 然后ReplicationController反復再次啟動它。

有沒有辦法像docker docker run命令中的-td選項那樣保持容器在Kubernetes上docker run

我把它放在后台做了一個黑客:

[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

此命令可能會有所幫助

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM