简介
Kubernetes 是一个强大的容器编排平台,它有助于管理跨多个主机的容器化应用。Kubernetes 的一个重要特性是其作业管理系统,该系统允许你运行面向批处理的工作负载直至完成。在本教程中,你将学习如何监控 Kubernetes 作业的状态并分析它们的日志,这是确保你的容器化应用顺利运行的基本技能。
通过本教程,你将能够创建 Kubernetes 作业,检查它们的状态,并检查它们的日志以有效地排除问题。
设置你的 Kubernetes 环境
在我们可以监控 Kubernetes 作业之前,我们需要设置一个可用的 Kubernetes 环境。我们将使用 Minikube,这是一个在你的本地机器上创建单节点 Kubernetes 集群的工具。
安装 Minikube
Minikube 已经安装在你的虚拟机上。让我们通过检查版本来验证安装:
minikube version
你应该看到类似这样的输出:
minikube version: v1.29.0
commit: ddac20b4b34a9c8c857fc602203b6ba2679794d3
启动 Minikube
现在让我们启动 Minikube 来创建一个本地 Kubernetes 集群:
minikube start --driver=docker
此命令将需要几分钟才能完成。你将看到一系列消息,因为 Minikube 下载必要的组件并启动集群。
完成后,你应该看到类似这样的消息:
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
验证 Kubernetes 安装
让我们通过检查节点状态来验证我们的 Kubernetes 集群是否正确运行:
kubectl get nodes
你应该看到类似这样的输出:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.26.3
此外,检查核心 Kubernetes 组件是否正在运行:
kubectl get pods -n kube-system
你应该看到几个正在运行的 Pod,包括 kube-apiserver、kube-controller-manager 等组件。
现在我们有了一个正在运行的 Kubernetes 集群,我们已经准备好创建和监控作业了。
创建你的第一个 Kubernetes 作业
在这一步中,我们将创建一个简单的 Kubernetes 作业,它将运行一个容器,执行一个任务,然后完成。这将为我们在后续步骤中监控的内容提供基础。
理解 Kubernetes 作业
Kubernetes 作业是一个控制器,它创建了一个或多个 Pod,并确保它们成功终止。作业对于批处理流程、一次性任务或任何应该运行到完成而不是无限期的任务都很有用。
创建作业配置文件
让我们创建一个简单的作业配置文件。打开一个终端并在你的项目目录中创建一个名为 hello-job.yaml 的新文件:
cd ~/project
nano hello-job.yaml
将以下 YAML 内容复制并粘贴到文件中:
apiVersion: batch/v1
kind: Job
metadata:
name: hello-job
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
command: ["sh", "-c", 'echo "Hello, Kubernetes!" && sleep 5']
restartPolicy: Never
backoffLimit: 4
此配置定义了一个名为 hello-job 的作业,该作业:
- 使用
busybox:1.28容器镜像 - 运行一个打印 "Hello, Kubernetes!" 然后休眠 5 秒的命令
- 具有
Never的重启策略,这意味着它在完成后不会重启 - 具有
backoffLimit为 4,这意味着如果失败,它将重试最多 4 次
通过按 Ctrl+O,然后按 Enter 来保存文件,并使用 Ctrl+X 退出 nano。
创建作业
现在让我们在我们的 Kubernetes 集群中创建作业:
kubectl apply -f hello-job.yaml
你应该看到输出:
job.batch/hello-job created
恭喜你!你刚刚创建了你的第一个 Kubernetes 作业。在下一步中,我们将学习如何监控其状态。
监控 Kubernetes 作业状态
现在我们在 Kubernetes 集群中运行了一个作业,让我们学习如何监控其状态。监控作业状态对于理解你的作业是成功完成还是遇到错误至关重要。
使用 kubectl 检查作业状态
监控 Kubernetes 资源的主要工具是 kubectl。让我们使用它来检查我们作业的状态:
kubectl get jobs
你应该看到类似这样的输出:
NAME COMPLETIONS DURATION AGE
hello-job 1/1 10s 30s
此输出显示:
NAME:作业的名称COMPLETIONS:已完成的 Pod 数量 / 期望的完成数量DURATION:作业运行了多长时间AGE:作业创建了多长时间
如果你的作业在 COMPLETIONS 下显示 0/1,它可能仍在运行或已失败。等待几秒钟并再次运行该命令。
获取详细的作业信息
要获取有关作业的更多详细信息,请使用 describe 命令:
kubectl describe job hello-job
此命令提供了关于作业的广泛信息,包括:
- 标签和注解
- 选择器详细信息
- 并行度和完成要求
- Pod 状态
- 与作业相关的事件
在底部查找 Events 部分,它显示了重要的事件,例如 Pod 的创建和完成。
理解作业状态
作业可以有几种状态:
Active:作业仍在运行Completed:作业已成功完成Failed:作业在达到其回退限制后失败
让我们检查一下我们的作业的 Pod 是否已完成:
kubectl get pods
你应该看到类似的内容:
NAME READY STATUS RESTARTS AGE
hello-job-abcd1 0/1 Completed 0 1m
STATUS 列显示 Completed,表明我们的作业运行成功。
创建一个需要更长时间的作业
让我们创建另一个需要更长时间才能完成的作业,以便我们可以在 Active 状态下观察它:
cd ~/project
nano long-job.yaml
复制并粘贴以下 YAML 内容:
apiVersion: batch/v1
kind: Job
metadata:
name: long-job
spec:
template:
spec:
containers:
- name: long
image: busybox:1.28
command:
[
"sh",
"-c",
'echo "Starting long job..." && sleep 30 && echo "Long job completed!"'
]
restartPolicy: Never
backoffLimit: 4
保存文件并退出 nano。然后创建作业:
kubectl apply -f long-job.yaml
现在让我们立即检查其状态:
kubectl get jobs
你应该看到 long-job 显示 0/1 完成,因为它仍在运行。如果你每隔几秒钟就检查一次,你最终会看到它在大约 30 秒后变为 1/1。
这演示了如何使用 kubectl 实时监控你的作业的进度。
分析 Kubernetes 作业日志
能够查看和分析来自你的 Kubernetes 作业的日志对于调试和理解作业行为至关重要。在这一步中,我们将探讨如何访问和分析我们创建的作业的日志。
获取我们作业的 Pod 名称
在我们可以查看日志之前,我们需要知道我们的作业创建的 Pod 的名称。每个作业都会创建一个或多个 Pod,其名称包括作业名称和一个随机后缀。
让我们列出与我们的作业相关的所有 Pod:
kubectl get pods --show-labels
这将显示所有 Pod 及其标签。查找带有 job-name=hello-job 或 job-name=long-job 等标签的 Pod。
或者,你可以按作业名称过滤 Pod:
kubectl get pods -l job-name=hello-job
这将仅显示属于 hello-job 作业的 Pod。
查看作业日志
现在我们知道了我们的 Pod 名称,我们可以查看我们作业的日志。使用以下命令,将 <pod-name> 替换为你的 Pod 的实际名称:
kubectl logs <pod-name>
例如,如果你的 Pod 名为 hello-job-abcd1,你将运行:
kubectl logs hello-job-abcd1
你应该看到输出:
Hello, Kubernetes!
这是我们的作业被编程输出的消息。
我们还检查一下我们更长的作业的日志。首先,找到 Pod 名称:
kubectl get pods -l job-name=long-job
然后查看其日志:
kubectl logs <long-job-pod-name>
你应该看到:
Starting long job...
Long job completed!
查看已完成作业的日志
Kubernetes 作业的优点之一是即使作业已完成,你也可以查看日志。这对于调试和审计目的非常有用。
让我们创建一个将失败的作业,以便我们可以看到如何调试它:
cd ~/project
nano failed-job.yaml
复制并粘贴以下 YAML 内容:
apiVersion: batch/v1
kind: Job
metadata:
name: failed-job
spec:
template:
spec:
containers:
- name: failed
image: busybox:1.28
command: ["sh", "-c", 'echo "Attempting task..." && exit 1']
restartPolicy: Never
backoffLimit: 2
此作业将始终以状态码 1 退出,这表示失败。保存文件并退出 nano,然后创建作业:
kubectl apply -f failed-job.yaml
等待片刻,让作业尝试并失败几次(最多达到回退限制)。然后检查其状态:
kubectl get jobs failed-job
你应该看到它显示 0/1 完成并且已达到完成期限。
现在让我们通过检查失败 Pod 的日志来检查出了什么问题:
kubectl get pods -l job-name=failed-job
你将看到几个 Pod,所有 Pod 都处于 Error 状态。选择一个并查看其日志:
kubectl logs <failed-pod-name>
你应该看到:
Attempting task...
Pod 日志显示任务已启动,但随后以错误代码退出。此信息对于调试作业失败至关重要。
实时跟踪日志
如果你想实时跟踪正在运行的作业的日志,你可以使用 -f 标志:
kubectl logs -f <pod-name>
这对于较长时间运行的作业特别有用,你希望看到输出的实时情况。
让我们创建另一个长时间运行的作业来演示:
cd ~/project
nano counter-job.yaml
复制并粘贴以下 YAML 内容:
apiVersion: batch/v1
kind: Job
metadata:
name: counter-job
spec:
template:
spec:
containers:
- name: counter
image: busybox:1.28
command:
[
"sh",
"-c",
'for i in $(seq 1 5); do echo "Count: $i"; sleep 5; done'
]
restartPolicy: Never
保存文件并退出 nano,然后创建作业:
kubectl apply -f counter-job.yaml
现在让我们跟踪它的日志。首先,找到 Pod 名称:
kubectl get pods -l job-name=counter-job
然后跟踪它的日志:
kubectl logs -f <counter-job-pod-name>
你将看到计数每 5 秒递增一次:
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
按 Ctrl+C 停止跟踪日志。
通过了解如何访问和分析日志,你可以有效地排除故障并调试你的 Kubernetes 作业。
高级作业监控技术
现在你已经了解了监控 Kubernetes 作业的基础知识,让我们探索一些更高级的技术,这些技术可以帮助你更有效地监控作业,尤其是在生产环境中。
使用标签进行作业组织
标签是可附加到 Kubernetes 资源的键值对。它们对于组织和选择资源的子集很有用。让我们创建一个带有自定义标签的作业:
cd ~/project
nano labeled-job.yaml
复制并粘贴以下 YAML 内容:
apiVersion: batch/v1
kind: Job
metadata:
name: labeled-job
labels:
department: engineering
app: demo
environment: training
spec:
template:
spec:
containers:
- name: labeled
image: busybox:1.28
command: ["sh", "-c", 'echo "This is a labeled job" && sleep 10']
restartPolicy: Never
保存文件并退出 nano,然后创建作业:
kubectl apply -f labeled-job.yaml
现在你可以按标签过滤作业:
kubectl get jobs -l department=engineering
这将仅显示带有标签 department=engineering 的作业。
你可以使用多个标签进行更具体的过滤:
kubectl get jobs -l department=engineering,environment=training
监控作业事件
Kubernetes 会为你的作业中的各种状态更改生成事件。这些事件可以提供有关你的作业生命周期的宝贵信息。
让我们查看与我们的作业相关的事件:
kubectl get events --sort-by=.metadata.creationTimestamp
此命令显示你的命名空间中的所有事件,按时间排序。你可以过滤与特定作业相关的事件:
kubectl get events --field-selector involvedObject.name=labeled-job
这些事件可以帮助你了解作业何时以及为何被创建、启动或遇到问题。
使用 JSONPath 进行自定义输出
Kubernetes 允许你使用 JSONPath 从 kubectl 命令的输出中提取特定字段。这对于关注你的作业的特定方面很有用:
kubectl get job labeled-job -o jsonpath='{.status.succeeded}'
此命令将输出 labeled-job 的已成功 Pod 的数量。
要获取作业的创建时间:
kubectl get job labeled-job -o jsonpath='{.metadata.creationTimestamp}'
创建 CronJob 进行计划执行
对于需要按计划运行的任务,Kubernetes 提供了 CronJob。让我们创建一个简单的 CronJob:
cd ~/project
nano simple-cronjob.yaml
复制并粘贴以下 YAML 内容:
apiVersion: batch/v1
kind: CronJob
metadata:
name: simple-cronjob
spec:
schedule: "*/1 * * * *" ## 每分钟运行一次
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
command: ["sh", "-c", 'date; echo "Hello from CronJob"']
restartPolicy: Never
保存文件并退出 nano,然后创建 CronJob:
kubectl apply -f simple-cronjob.yaml
检查 CronJob 是否已创建:
kubectl get cronjobs
你应该看到类似于以下内容的输出:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
simple-cronjob */1 * * * * False 0 <none> 10s
等待一两分钟,然后检查 CronJob 创建的作业:
kubectl get jobs
你应该看到名称类似于 simple-cronjob-<timestamp> 的作业。
要查看最近的 CronJob 执行的日志,首先找到 Pod:
kubectl get pods --sort-by=.metadata.creationTimestamp
然后查看其日志:
kubectl logs <latest-cronjob-pod>
CronJob 对于在你的 Kubernetes 集群中调度重复任务非常强大,并且我们可以学习到的相同的监控技术也可以应用于它们。
清理
在我们完成之前,让我们清理我们创建的资源:
kubectl delete job hello-job long-job failed-job counter-job labeled-job
kubectl delete cronjob simple-cronjob
这将从你的集群中删除所有作业和 CronJob。
总结
在本教程中,你已经学习了如何有效地监控 Kubernetes 作业并分析它们的日志。你现在知道如何:
- 使用 Minikube 设置 Kubernetes 环境
- 使用各种配置创建 Kubernetes 作业
- 使用
kubectl get和kubectl describe监控作业状态 - 使用
kubectl logs访问和分析作业日志 - 使用高级技术,如标签、事件和 JSONPath,进行更有效的监控
- 使用 CronJob 创建计划作业
这些技能对于在 Kubernetes 环境中管理容器化应用程序至关重要,它们使你能够确保批处理流程的可靠性和性能。通过了解如何通过日志跟踪作业进度和排除故障,你可以维护高效且无错误的 Kubernetes 工作负载。
在你继续你的 Kubernetes 之旅时,请考虑探索更高级的主题,如资源管理、作业并行性以及与 Prometheus 和 Grafana 等外部监控解决方案的集成。


