首页 > 解决方案 > Kubernetes Cronjob 标记

问题描述

由于我看到的相关帖子很少,但没有人回答我的问题,我想我也会根据其他用户的建议在这里提出一个新问题。

我需要为正在运行的 cronjob 的网络策略制作一个选择器标签,该 cronjob 负责连接到集群中的一些其他服务,据我所知,没有简单直接的方法来为作业制作选择器标签pod,因为如果它们存在重复的工作标签,那将是一个问题。不知道为什么 cronjob 本身不能有选择器,然后可以应用于作业和 pod。

也有可能只是将此 cronjob 设置在它自己的名称空间中,然后允许从该名称空间中的所有内容到网络策略中所需的任何内容,但感觉不是克服该问题的正确方法。

使用k8s v1.20

标签: kubernetes

解决方案


首先,要选择作为入口源或出口目的地CronJob应该允许的 pod(由 your 生成)NetworkPolicy,您可以为这些 pod 设置特定标签。

您可以使用标签字段轻松设置Jobs生成的CronJob标签(可以在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.
...

由此产生的 PodCronJob将具有标签type=mysqlworkload=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允许mysql从任何带有标签的 podtype=mysqlworkload=cronjob(逻辑连接)在带有标签的命名空间中连接到命名空间中的所有 pod namespace-name=default
注意:小心使用正确的 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 资源将无效。

NetworkPolicies您可以在网络策略文档中了解有关创建 Kubernetes的更多信息。


推荐阅读