首先,要选择 NetworkPolicy 应允许作为入口源或出口目的地的 pod(由您的 CronJob 生成),您可以为这些 pod 设置特定标签。
您可以使用标签字段轻松为CronJob 生成的Jobs 设置标签(可以在OpenShift CronJobs documentation 中找到另一个带有解释的示例):
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: mysql-test
spec:
...
jobTemplate:
spec:
template:
metadata:
labels:
workload: cronjob # Sets a label for jobs spawned by this CronJob.
type: mysql # Sets another label for jobs spawned by this CronJob.
...
由此 CronJob 生成的 Pod 将具有标签 type=mysql 和 workload=cronjob,使用此标签您可以创建/自定义您的 NetworkPolicy:
$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
mysql-test-1615216560-tkdvk 0/1 Completed 0 2m2s ...,type=mysql,workload=cronjob
mysql-test-1615216620-pqzbk 0/1 Completed 0 62s ...,type=mysql,workload=cronjob
mysql-test-1615216680-8775h 0/1 Completed 0 2s ...,type=mysql,workload=cronjob
$ kubectl describe pod mysql-test-1615216560-tkdvk
Name: mysql-test-1615216560-tkdvk
Namespace: default
...
Labels: controller-uid=af99e9a3-be6b-403d-ab57-38de31ac7a9d
job-name=mysql-test-1615216560
type=mysql
workload=cronjob
...
例如,mysql-workloadNetworkPolicy 允许从标签为 type=mysql 和 workload=cronjob(逻辑合取)的标签在标签为 namespace-name=default 的命名空间中的任何 pod 连接到 mysql 命名空间中的所有 pod:
注意:小心使用正确的 YAML(看看这个namespaceSelector and podSelector example)。
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: mysql-workload
namespace: mysql
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
namespace-name: default
podSelector:
matchLabels:
type: mysql
workload: cronjob
要使用网络策略,您必须使用支持 NetworkPolicy 的网络解决方案:
网络策略由网络插件实现。要使用网络策略,您必须使用支持 NetworkPolicy 的网络解决方案。在没有实现它的控制器的情况下创建 NetworkPolicy 资源将无效。
您可以在Network Policies documentation 中了解有关创建 Kubernetes NetworkPolicies 的更多信息。