介绍
在本实验中,你将探索并调试 Kubernetes 应用程序。你将使用 Minikube 启动一个本地 Kubernetes 集群,部署一个示例应用程序,并学习各种调试技巧,例如检查应用程序配置、查看日志、在 Pod 内运行命令以及检查集群事件。这些技能对于开发和排查基于 Kubernetes 的应用程序至关重要。
在本实验中,你将探索并调试 Kubernetes 应用程序。你将使用 Minikube 启动一个本地 Kubernetes 集群,部署一个示例应用程序,并学习各种调试技巧,例如检查应用程序配置、查看日志、在 Pod 内运行命令以及检查集群事件。这些技能对于开发和排查基于 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
这些命令确认了以下几点:
让我们检查集群的上下文,以确保你已连接到正确的集群:
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 创建副本。当所有副本准备就绪时,READY
列应显示 3/3
。
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
检查配置时需要关注的关键点:
在这一步中,你将学习如何使用 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
关键的日志查看技巧:
在这一步中,你将学习如何使用 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
技巧:
在这一步中,你将学习如何使用 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
关键的故障排查技巧:
在这一步中,你将学习如何使用 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 应用程序。