介绍
在本实验中,你将学习如何使用 Kubernetes 的 exec
命令在运行于 Kubernetes pod 中的容器内执行命令。你将从简单的示例开始,逐步过渡到更复杂的场景。
在本实验中,你将学习如何使用 Kubernetes 的 exec
命令在运行于 Kubernetes pod 中的容器内执行命令。你将从简单的示例开始,逐步过渡到更复杂的场景。
在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。
导航到工作目录:
打开终端并导航到默认的项目文件夹:
cd /home/labex/project
启动 Minikube:
启动 Minikube 以初始化一个 Kubernetes 集群:
minikube start
验证 Minikube 是否正在运行:
检查 Minikube 集群的状态:
minikube status
kubelet
和 apiserver
等组件是否显示为 Running
。minikube start
。如果启动 Minikube 时遇到问题,可以使用 minikube delete
重置环境(如有需要)。
kubectl exec
命令kubectl exec
命令用于直接在 pod 中的容器内执行命令。它在调试和检查容器环境时特别有用。
运行以下命令以查看 kubectl exec
的可用选项:
kubectl exec -h
你将看到以下输出:
在容器中执行命令。
示例:
## 从 pod mypod 中运行 'date' 命令并获取输出,默认使用第一个容器
kubectl exec mypod -- date
## 从 pod mypod 的 ruby-container 容器中运行 'date' 命令并获取输出
kubectl exec mypod -c ruby-container -- date
## 切换到原始终端模式;将 stdin 发送到 pod mypod 的 ruby-container 容器中的 'bash'
## 并将 'bash' 的 stdout/stderr 发送回客户端
kubectl exec mypod -c ruby-container -i -t -- bash -il
## 列出 pod mypod 的第一个容器中 /usr 目录的内容并按修改时间排序
## 如果你想在 pod 中执行的命令有任何共同的标志(例如 -i),
## 你必须使用两个破折号(--)来分隔命令的标志/参数
## 另外请注意,不要用引号包围命令及其标志/参数,
## 除非这是你通常执行它的方式(即,执行 ls -t /usr,而不是 "ls -t /usr")
kubectl exec mypod -i -t -- ls -t /usr
## 从部署 mydeployment 的第一个 pod 中运行 'date' 命令并获取输出,默认使用第一个容器
kubectl exec deploy/mydeployment -- date
## 从服务 myservice 的第一个 pod 中运行 'date' 命令并获取输出,默认使用第一个容器
kubectl exec svc/myservice -- date
在本步骤中,你将学习如何在运行于 pod 中的容器内执行命令。
首先创建一个包含一个副本和 Nginx 容器的部署:
kubectl create deployment nginx --image=nginx --replicas=1
等待 pod 变为就绪状态:
kubectl wait --for=condition=Ready pod -l app=nginx
使用 kubectl exec
命令在 Nginx 容器内执行命令:
kubectl -it /bin/bash < pod_name > --
将 <pod_name>
替换为步骤 1 中创建的 pod 的名称,你可以通过 kubectl get pod -l app=nginx
命令获取 <pod_name>
。
在本步骤中,你将学习如何在运行多个容器的 pod 中执行特定容器内的命令。
创建一个包含两个容器(Nginx 和 BusyBox)的 pod:
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: nginx-busybox
spec:
containers:
- name: nginx
image: nginx
- name: busybox
image: busybox
command:
- sleep
- "3600"
EOF
等待 pod 变为就绪状态:
kubectl wait --for=condition=Ready pod nginx-busybox
使用 kubectl exec
命令在 BusyBox 容器内执行命令:
kubectl exec nginx-busybox -c busybox -- ls /bin
在本步骤中,你将学习如何在容器中使用 tty 执行命令。
使用 kubectl exec
命令并添加 -it
选项以通过 tty 执行命令:
kubectl exec -it nginx-busybox -- /bin/sh
进入容器 shell 后,运行以下命令:
echo "Hello, world!"
退出容器 shell:
exit
在本步骤中,你将学习如何在容器内使用环境变量执行命令。
创建一个包含一个副本和带有环境变量的 Nginx 容器的部署:
kubectl run nginx-env --image=nginx --env="MY_VAR=my-value"
等待 pod 变为就绪状态:
kubectl wait --for=condition=Ready pod -l run=nginx-env
使用 kubectl exec
命令在 Nginx 容器内执行命令以输出环境变量:
kubectl exec nginx-env -- sh -c 'echo $MY_VAR'
将 nginx-env
替换为步骤 1 中创建的 pod 的名称。
恭喜你,你已成功完成 Kubernetes exec 命令实验!在本实验中,你学习了如何使用 kubectl exec
命令在运行于 Kubernetes pod 中的容器内执行命令。你还学习了如何在特定容器中执行命令、使用 tty 执行命令以及使用环境变量执行命令。这些技能对于调试 Kubernetes 集群中的问题至关重要。