[英]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 中都應該很容易做到。
真正的問題是你為什么要這樣做? 您的容器應該提供一項服務,該服務的進程將使容器在后台運行。
在你的 Dockerfile 中使用這個命令:
CMD ["sh", "-c", "tail -f /dev/null"]
構建您的 docker 鏡像。
kubectl run debug-container -it --image=<your-image>
為了保持 POD 運行,它應該執行某些任務,否則 Kubernetes 會發現它沒有必要,因此它會停止。 有很多方法可以讓 POD 保持運行。
當我需要一個 POD 只是為了連續運行而不做任何有用的操作時,我也遇到過類似的問題。 以下是對我有用的兩種方式:
盡管第一個選項比第二個選項容易並且可能滿足要求,但它不是最佳選擇。 因為,您要在 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 集群中運行:
我在這個問題上的幾分錢。 假設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.