由于我看到了一些相关的帖子,但没有一个回答我的问题,我想我应该根据其他用户的建议在这里问一个新的问题。
我需要为正在运行的cronjob(负责连接到集群中的其他服务)的网络策略创建一个选择器标签,据我所知,没有一种简单直接的方法可以为job pod创建一个选择器标签,因为如果存在重复的作业标签,这将会产生问题。不知道为什么cronjob不能自己有一个选择器,然后可以应用到作业和pod。
也有可能只将这个cronjob设置在它自己的名称空间中,然后允许来自该名称空间的所有内容访问网络策略中需要的任何内容,但感觉不是解决这个问题的正确方法。
使用k8s v1.20
首先,要选择应该被NetworkPolicy
允许作为入口源或出口目的地的pod(由您的CronJob
生成),您可以为这些pod设置特定的标签。
您可以使用标签字段轻松地为CronJob
生成的Jobs
设置标签(另一个示例的解释可以在OpenShift CronJobs文档中找到):
---
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-workload
NetworkPolicy
允许从标签为namespace-name=default
的命名空间中标签为type=mysql
和workload=cronjob
(逻辑连接)的任何pod连接到mysql
命名空间中的所有pod:
注:注意使用正确的YAML(看一下这个namespaceSelector和podSelector的例子)。
---
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资源是没有效果的。
你可以在网络策略文档中了解更多关于创建KubernetesNetworkPolicies
的信息。