在 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 标签的混合规则
  • 限制特定端口范围的访问

更多推荐