介绍
在本实验中,你将探索并调试 Kubernetes 应用程序。你将使用 Minikube 启动一个本地 Kubernetes 集群,部署一个示例应用程序,并学习各种调试技巧,例如检查应用程序配置、查看日志、在 Pod 内运行命令以及检查集群事件。这些技能对于开发和排查基于 Kubernetes 的应用程序至关重要。
启动 Kubernetes 集群
在这一步中,你将学习如何使用 Minikube 启动并验证本地 Kubernetes 集群。这是在你本地机器上开发和测试 Kubernetes 应用程序的重要第一步。
首先,启动 Minikube 集群:
minikube start
示例输出:
😄 minikube v1.29.0 on Ubuntu 22.04
✨ Automatically selected the docker driver
📌 Using Docker driver with root permissions
🔥 Creating kubernetes in kubernetes cluster
🔄 Restarting existing kubernetes cluster
🐳 Preparing Kubernetes v1.26.1 on Docker 20.10.23 ...
🚀 Launching Kubernetes ...
🌟 Enabling addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace
现在,使用多个命令验证集群状态:
minikube status
kubectl get nodes
示例输出:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.26.1
这些命令确认了:
- Minikube 正在成功运行
- 一个本地 Kubernetes 集群已经被创建
- 该集群已准备好使用
- 你拥有一个具有控制平面(control plane)功能的单节点集群
让我们检查集群的上下文(context),以确保你连接到正确的集群:
kubectl config current-context
示例输出:
minikube
这验证了 kubectl 被配置为使用 Minikube 集群。

部署一个示例应用
在这一步中,你将学习如何使用 YAML 清单文件创建一个简单的 Kubernetes 应用并进行部署。我们将创建一个 Pod 和一个 Deployment(部署)来演示不同的应用部署方式。
首先,为你的 Kubernetes 清单文件创建一个目录:
mkdir -p ~/project/k8s-manifests
cd ~/project/k8s-manifests
创建一个简单的 NGINX Pod 清单文件:
nano nginx-pod.yaml
添加以下内容:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
按 Ctrl+X,然后按 Y,最后按 Enter 保存并退出。
现在,创建一个 Deployment(部署)清单文件:
nano nginx-deployment.yaml
添加以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
应用清单文件以创建资源:
kubectl apply -f nginx-pod.yaml
kubectl apply -f nginx-deployment.yaml
示例输出:
pod/nginx-pod created
deployment.apps/nginx-deployment created
验证已创建的资源:
kubectl get pods
kubectl get deployments
示例输出:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 1m
nginx-deployment-xxx-yyy 1/1 Running 0 1m
nginx-deployment-xxx-zzz 1/1 Running 0 1m
nginx-deployment-xxx-www 1/1 Running 0 1m
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 1m
等待 Deployment(部署)创建副本(replicas)。当所有副本都准备就绪时,READY 列应显示 3/3。
Pod 和 Deployment(部署)之间的主要区别:
- Pod:应用程序的单个实例
- Deployment(部署):管理多个副本并提供自我修复

检查应用程序配置
在这一步中,你将学习如何使用各种 kubectl 命令检查和检索 Kubernetes Deployment 和 Pod 的配置详细信息。了解如何检查资源配置对于排查问题和理解应用程序的设置至关重要。
首先,让我们检索上一步中创建的 Pod 的 YAML 配置:
kubectl get pod nginx-pod -o yaml
示例输出(部分):
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: default
labels:
app: nginx
spec:
containers:
- image: nginx:latest
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
现在,让我们检查 Deployment 的配置:
kubectl get deployment nginx-deployment -o yaml
示例输出(部分):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
使用 kubectl describe 获取资源的更详细信息:
kubectl describe pod nginx-pod
kubectl describe deployment nginx-deployment
describe pod 的示例输出(部分):
Name: nginx-pod
Namespace: default
Priority: 0
Node: minikube/172.17.0.2
Start Time: [timestamp]
Labels: app=nginx
Annotations: <none>
Status: Running
IP: 172.17.0.5
Containers:
nginx:
Container ID: docker://[container-id]
Image: nginx:latest
Image ID: docker-pullable://nginx@[image-digest]
Port: 80/TCP
Host Port: 0/TCP
State: Running
Ready: True
Restart Count: 0
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
你也可以使用 JSON 输出来获取更机器可读的格式:
kubectl get pod nginx-pod -o json
检查配置时需要关注的关键点:
- 资源元数据(名称、标签、命名空间)
- 容器镜像和端口
- 副本数量(针对 Deployment)
- 资源状态和条件
查看应用程序日志
在这一步中,你将学习如何使用 kubectl logs 查看和检查 Kubernetes Pod 的日志。查看日志对于理解应用程序行为、调试问题以及监控应用程序性能至关重要。
首先,列出可用的 Pod,以确保你正在操作正确的资源:
kubectl get pods
示例输出:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 20m
nginx-deployment-xxx-yyy 1/1 Running 0 20m
nginx-deployment-xxx-zzz 1/1 Running 0 20m
nginx-deployment-xxx-www 1/1 Running 0 20m
查看特定 Pod 的日志:
## 查看 nginx-pod 的日志
kubectl logs nginx-pod
示例输出:
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
...
2023/xx/xx [notice] xxxx#x: signal process started
查看 Deployment 中 Pod 的日志:
## 查看 Deployment 中某个特定 Pod 的日志
POD_NAME=$(kubectl get pods -l app=nginx | grep nginx-deployment | head -n 1 | awk '{print $1}')
kubectl logs $POD_NAME
探索更多日志查看选项:
## 查看最后 50 行日志
kubectl logs nginx-pod --tail=50
## 实时跟踪日志
kubectl logs -f nginx-pod
实时跟踪日志的示例:
[实时日志输出将显示在此处]
按下 Ctrl + C 退出实时日志查看。
对于多容器 Pod,指定容器名称:
## 如果 Pod 有多个容器
kubectl logs nginx-pod -c nginx
关键的日志查看技巧:
- 查看完整的日志历史
- 限制日志行数
- 实时跟踪日志
- 在多容器 Pod 中指定容器
使用 kubectl exec 进行调试
在这一步中,你将学习如何使用 kubectl exec 在 Kubernetes Pod 内运行命令,这对于调试和调查容器环境至关重要。
首先,验证可用的 Pod:
kubectl get pods
示例输出:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 30m
nginx-deployment-xxx-yyy 1/1 Running 0 30m
nginx-deployment-xxx-zzz 1/1 Running 0 30m
nginx-deployment-xxx-www 1/1 Running 0 30m
在 nginx-pod 中运行一个交互式 shell:
kubectl exec -it nginx-pod -- /bin/bash
在 Pod 内的示例交互:
## 检查 nginx 配置
cat /etc/nginx/nginx.conf
## 验证已安装的包
apt update && apt list --installed
## 退出 Pod 的 shell
exit
确保使用 exit 退出交互式 shell 以返回到 shell 提示符。
无需进入交互式 shell 即可运行特定命令:
## 检查 nginx 版本
kubectl exec nginx-pod -- nginx -v
## 列出 web 根目录中的文件
kubectl exec nginx-pod -- ls /usr/share/nginx/html
对于 Deployment 中的 Pod,选择一个特定的 Pod:
## 从 Deployment 中获取一个 Pod 名称
POD_NAME=$(kubectl get pods -l app=nginx | grep nginx-deployment | head -n 1 | awk '{print $1}')
## 在 Deployment 的 Pod 中运行命令
kubectl exec -it $POD_NAME -- /bin/bash
关键的 kubectl exec 技巧:
- 运行交互式 shell
- 执行特定命令
- 调查 Pod 内部
- 调试容器配置
使用 kubectl describe 进行故障排查
在这一步中,你将学习如何使用 kubectl describe 来诊断和排查 Kubernetes 资源问题,提供有关 Pod、Deployment 和集群组件状态的详细信息。
首先,让我们创建一个有问题的 Deployment 来演示调试过程:
cd ~/project/k8s-manifests
nano problematic-deployment.yaml
添加以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: debug-deployment
spec:
replicas: 2
selector:
matchLabels:
app: debug
template:
metadata:
labels:
app: debug
spec:
containers:
- name: debug-container
image: non-existent-image:latest
ports:
- containerPort: 80
应用该 Deployment:
kubectl apply -f problematic-deployment.yaml
现在,使用 kubectl describe 来调查该 Deployment:
kubectl describe deployment debug-deployment
示例输出:
Name: debug-deployment
Namespace: default
CreationTimestamp: [timestamp]
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=debug
Replicas: 2 desired | 0 available | 2 total | 2 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
Progressing False ProgressDeadlineExceeded
OldReplicaSets: <none>
NewReplicaSet: debug-deployment-xxx (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedCreate 1m deployment-controller Failed to create pod
Normal ScalingReplicaSet 1m deployment-controller Scaled up replica set
描述 Pod 以获取更多详细信息:
kubectl describe pods -l app=debug
示例输出:
Name: debug-deployment-xxx-yyy
Namespace: default
Priority: 0
Node: minikube/172.17.0.2
Start Time: [timestamp]
Labels: app=debug
Annotations: <none>
Status: Pending
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedCreatePodSandBox 1m kubelet Failed to create pod sandbox
Warning Failed 1m kubelet Failed to pull image
描述节点资源:
kubectl describe nodes minikube
关键的故障排查技巧:
- 识别 Deployment 和 Pod 的状态
- 查看详细的错误信息
- 理解资源未运行的原因
- 检查节点和集群条件
检查集群事件(kubectl get events)以获取线索和时间线
在这一步中,你将学习如何使用 kubectl get events 来调查集群范围内的事件,了解系统活动,并诊断 Kubernetes 环境中的问题。
首先,查看所有集群事件:
kubectl get events
示例输出:
LAST SEEN TYPE REASON OBJECT MESSAGE
10m Warning FailedCreate deployment/debug-deployment Failed to create pod
5m Normal Scheduled pod/nginx-pod Successfully assigned default/nginx-pod to minikube
3m Normal Pulled pod/nginx-deployment-xxx-yyy Container image "nginx:latest" already present on machine
按命名空间过滤事件:
kubectl get events -n default
使用更详细的事件查看选项:
## 实时监控事件
kubectl get events -w
## 按时间戳排序获取事件
kubectl get events --sort-by='.metadata.creationTimestamp'
创建一个自定义的事件生成场景:
cd ~/project/k8s-manifests
nano event-test-deployment.yaml
添加以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: event-test
spec:
replicas: 3
selector:
matchLabels:
app: event-test
template:
metadata:
labels:
app: event-test
spec:
containers:
- name: nginx
image: nginx:latest
resources:
limits:
cpu: "100m"
memory: "50Mi"
应用 Deployment 并检查事件:
kubectl apply -f event-test-deployment.yaml
kubectl get events
高级事件过滤:
## 按事件类型过滤
kubectl get events --field-selector type=Warning
## 按特定资源过滤
kubectl get events --field-selector involvedObject.kind=Deployment
关键的事件检查技巧:
- 查看集群范围内的事件
- 按命名空间过滤事件
- 实时监控事件
- 识别警告和错误事件
总结
在本实验中,你学习了如何使用 Minikube 启动并验证一个本地 Kubernetes 集群,这是在本地机器上开发和测试 Kubernetes 应用程序的关键第一步。你还学习了如何使用 YAML 清单文件创建并部署一个简单的 Kubernetes 应用程序,包括 Pod 和 Deployment。此外,你探索了各种命令来检查配置、查看日志、调试和排查应用程序问题,从而更好地理解了如何管理和监控 Kubernetes 应用程序。


