探索与调试 Kubernetes 应用程序

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将探索并调试 Kubernetes 应用程序。你将使用 Minikube 启动一个本地 Kubernetes 集群,部署一个示例应用程序,并学习各种调试技巧,例如检查应用程序配置、查看日志、在 Pod 内运行命令以及检查集群事件。这些技能对于开发和排查基于 Kubernetes 的应用程序至关重要。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["`Troubleshooting and Debugging Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/ConfigurationandVersioningGroup(["`Configuration and Versioning`"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/create("`Create`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("`Describe`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("`Exec`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/logs("`Logs`") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("`Config`") subgraph Lab Skills kubernetes/get -.-> lab-434645{{"`探索与调试 Kubernetes 应用程序`"}} kubernetes/create -.-> lab-434645{{"`探索与调试 Kubernetes 应用程序`"}} kubernetes/apply -.-> lab-434645{{"`探索与调试 Kubernetes 应用程序`"}} kubernetes/describe -.-> lab-434645{{"`探索与调试 Kubernetes 应用程序`"}} kubernetes/exec -.-> lab-434645{{"`探索与调试 Kubernetes 应用程序`"}} kubernetes/logs -.-> lab-434645{{"`探索与调试 Kubernetes 应用程序`"}} kubernetes/config -.-> lab-434645{{"`探索与调试 Kubernetes 应用程序`"}} end

启动 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

这些命令确认了以下几点:

  1. Minikube 已成功运行
  2. 本地 Kubernetes 集群已创建
  3. 集群已准备就绪
  4. 你拥有一个具备控制平面功能的单节点集群

让我们检查集群的上下文,以确保你已连接到正确的集群:

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 的主要区别:

  • 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 应用程序。

您可能感兴趣的其他 Kubernetes 教程