Kubernetes 中的 Job、CronJob 与 NetworkPolicy 详解
·
在 Kubernetes 集群管理中,任务调度与网络安全是两个核心环节。本文将详细介绍 Kubernetes 中的 Job、CronJob 资源以及 NetworkPolicy 网络策略,帮助你更好地理解和使用这些功能来管理容器化应用。
一、Job 与 CronJob:任务调度利器
1. Job 介绍
Job 是 Kubernetes 中用于管理一次性任务的资源对象,它会创建一个或多个 Pod,并持续重试 Pod 的执行,直到指定数量的 Pod 成功终止。当任务完成后,Job 会跟踪记录成功完成的 Pod 个数,当达到指定的成功阈值时,任务结束。
Job 的主要特性:
- 确保任务可靠执行,当 Pod 失败或被删除时会自动重启
- 支持并行运行多个 Pod
- 可以设置任务的最大失败次数、超时时间等参数
- 删除 Job 会清除其创建的所有 Pod
2. CronJob 介绍
CronJob 基于 Job 实现,用于创建周期性运行的任务,类似 Unix 系统中的 crontab。它使用 Cron 表达式来定义调度规则,适用于执行备份、生成报告等周期性任务。
CronJob 的主要特性:
- 基于时间的周期性任务调度
- 可以保留指定数量的历史成功任务记录
- 自动创建和管理 Job 资源
3. 配置示例
Job 配置示例
yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
namespace: default
spec:
backoffLimit: 4 # 最大失败次数
completions: 1 # 要求完成的次数
parallelism: 1 # 并发数量
activeDeadlineSeconds: 100 # 最大运行时间
ttlSecondsAfterFinished: 20 # 任务完成后的存活时间
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
imagePullPolicy: IfNotPresent
restartPolicy: Never # 重启策略
CronJob 配置示例
yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
namespace: default
spec:
schedule: "* * * * *" # 定时配置(每分钟执行一次)
successfulJobsHistoryLimit: 3 # 保留运行完成pod的历史数量
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
4. 重启策略说明
- Never:当 Pod 失败时,Job 控制器会启动一个新的 Pod
- OnFailure:Pod 继续留在当前节点,但容器会被重新运行
二、NetworkPolicy:网络安全控制
1. NetworkPolicy 概述
NetworkPolicy 是 Kubernetes 中用于定义 Pod 之间网络通信规则的资源对象。通过它,你可以精确控制哪些 Pod 可以与其他 Pod 通信,以及使用何种方式通信,从而提高集群的安全性。
核心概念:
- Pod 选择器(PodSelector):通过标签选择器选择特定的 Pod
- namespaceSelector:通过命名空间标签选择特定命名空间
- Ingress 规则:定义允许进入被选中 Pod 的流量规则
- Egress 规则:定义允许被选中 Pod 发出的流量规则
2. NetworkPolicy 配置示例
基础网络策略示例
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: backend # 选择带有 app=backend 标签的 Pod 作为目标
ingress: # 入站规则
- from:
- podSelector:
matchLabels:
app: frontend # 允许 frontend 访问
- ipBlock:
cidr: 192.168.1.0/24 # 允许特定网段访问
ports:
- protocol: TCP
port: 8080 # 只允许访问 8080 端口
egress: # 出站规则
- to:
- podSelector:
matchLabels:
app: database # 允许访问 database
ports:
- protocol: TCP
port: 3306 # 只允许使用 3306 端口
允许相同命名空间通信
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
spec:
podSelector:
matchLabels:
app: myapp
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: myproject
egress:
- to:
- namespaceSelector:
matchLabels:
project: myproject
限制外部访问
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-external-traffic
spec:
podSelector:
matchLabels:
app: sensitive-app
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector: {} # 只允许 Pod 之间通信
egress:
- to:
- podSelector: {} # 只允许 Pod 之间通信
3. 高级用法
NetworkPolicy 还支持更复杂的配置,如:
- 网络策略的继承
- 基于表达式的高级 Pod 选择器
- 结合命名空间和 Pod 标签的混合规则
- 限制特定端口范围的访问
更多推荐

所有评论(0)