在 Kubernetes 環(huán)境中,有時(shí)候您可能需要直接與運(yùn)行中的容器交互,以便進(jìn)行故障排除或執(zhí)行管理任務(wù)。本教程將詳細(xì)介紹如何使用 kubectl exec 命令來獲取正在運(yùn)行的容器的 Shell。包括編寫 nginx 的根頁(yè)面、在容器中運(yùn)行單個(gè)命令、當(dāng) Pod 包含多個(gè)容器時(shí)打開 shell等等。
一、準(zhǔn)備
必須擁有一個(gè) Kubernetes 的集群,同時(shí)必須配置 kubectl 命令行工具與集群通信。 建議在至少有兩個(gè)不作為控制平面主機(jī)的節(jié)點(diǎn)的集群上運(yùn)行本教程。 如果還沒有集群,可以通過 Minikube 構(gòu)建一個(gè)自己的集群,或者可以使用下面的 Kubernetes 練習(xí)環(huán)境之一:
- Killercoda
- 玩轉(zhuǎn) Kubernetes
二、獲取容器的Shell
在本練習(xí)中,將創(chuàng)建包含一個(gè)容器的 Pod。容器運(yùn)行 nginx 鏡像。下面是 Pod 的配置文件:
apiVersion: v1 kind: Pod metadata: name: shell-demo spec: volumes: - name: shared-data emptyDir: {} containers: - name: nginx image: nginx volumeMounts: - name: shared-data mountPath: /usr/share/nginx/html hostNetwork: true dnsPolicy: Default
創(chuàng)建 Pod:
kubectl apply -f https://k8s.io/examples/application/shell-demo.yaml
檢查容器是否運(yùn)行正常:
kubectl get pod shell-demo
獲取正在運(yùn)行容器的 Shell:
kubectl exec --stdin --tty shell-demo -- /bin/bash
注意:雙破折號(hào) “–” 用于將要傳遞給命令的參數(shù)與 kubectl 的參數(shù)分開。
在 shell 中,打印根目錄:
# 在容器內(nèi)運(yùn)行如下命令 ls /
在 shell 中,實(shí)驗(yàn)其他命令。下面是一些示例:
# 可以在容器中運(yùn)行這些示例命令 ls / cat /proc/mounts cat /proc/1/maps apt-get update apt-get install -y tcpdump tcpdump apt-get install -y lsof lsof apt-get install -y procps ps aux ps aux | grep nginx
三、編寫nginx根頁(yè)面
再看一下 Pod 的配置文件。該 Pod 有個(gè) emptyDir 卷,容器將該卷掛載到了 /usr/share/nginx/html。
在 shell 中,在 /usr/share/nginx/html 目錄創(chuàng)建一個(gè) index.html 文件:
# 在容器內(nèi)運(yùn)行如下命令 echo 'Hello shell demo' > /usr/share/nginx/html/index.html
在 shell 中,向 nginx 服務(wù)器發(fā)送 GET 請(qǐng)求:
# 在容器內(nèi)運(yùn)行如下命令 apt-get update apt-get install curl curl http://localhost/
輸出結(jié)果顯示了在 index.html 中寫入的文本。
Hello shell demo
當(dāng)用完 shell 后,輸入 exit 退出。
exit # 快速退出容器內(nèi)的 Shell
四、容器運(yùn)行單個(gè)命令
在普通的命令窗口(而不是 shell)中,打印環(huán)境運(yùn)行容器中的變量:
kubectl exec shell-demo -- env
實(shí)驗(yàn)運(yùn)行其他命令。下面是一些示例:
kubectl exec shell-demo -- ps aux kubectl exec shell-demo -- ls / kubectl exec shell-demo -- cat /proc/1/mounts
五、打開shell
如果 Pod 有多個(gè)容器,–container 或者 -c 可以在 kubectl exec 命令中指定容器。 例如,有個(gè)名為 my-pod 的 Pod,該 Pod 有兩個(gè)容器分別為 main-app 和 healper-app。 下面的命令將會(huì)打開一個(gè) shell 訪問 main-app 容器。
kubectl exec -i -t my-pod --container main-app -- /bin/bash
注意:短的命令參數(shù) -i 和 -t 與長(zhǎng)的命令參數(shù) –stdin 和 –tty 作用相同。