介绍
在本实验中,你将学习如何使用 Kubernetes 的 exec 命令在运行于 Kubernetes pod 中的容器内执行命令。你将从简单的示例开始,逐步过渡到更复杂的场景。
启动 Minikube 集群
在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。
导航到工作目录:
打开终端并导航到默认的项目文件夹:
cd /home/labex/project启动 Minikube:
启动 Minikube 以初始化一个 Kubernetes 集群:
minikube start- 此命令将在你的本地机器上设置一个单节点的 Kubernetes 集群。
- 根据系统性能,Minikube 可能需要几分钟才能启动。
验证 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 exec -it POD_NAME -- /bin/bash将
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 执行命令
在本步骤中,你将学习如何在容器中使用 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 集群中的问题至关重要。


