【问题标题】:Kubernetes Cronjob labelingKubernetes Cronjob 标记
【发布时间】:2021-03-04 15:25:51
【问题描述】:

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

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

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

使用 k8s v1.20

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    首先,要选择 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=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-workloadNetworkPolicy 允许从标签为 type=mysqlworkload=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 的更多信息。

    【讨论】:

    • 感谢您提供这条信息@matt_j 我不确定网络策略匹配标签是否真的与您的示例中的workload: mysql 匹配,我认为您将两件事混合在一起标签和选择器标签。我认为这是问题所在,您是否真的尝试过上述操作?我做了,但事先没有用
    • 看起来我们不在同一个页面上:您能否详细说明您的设置中当前哪些工作/不工作?是的,我已经测试了我的示例,它按预期工作。请注意,此 NetworkPolicy 允许从标签为 workload=mysql 的命名空间中标签为 namespace-name=default 的任何 pod 连接到 mysql 命名空间中的所有 pod(您需要标记特定命名空间:kubectl label ns <NAMESPACE_NAME> namespace-name=default)跨度>
    • @Waheed 你能分享一下你的NetworkPolicy 规范吗?
    • 实际上这似乎现在可以工作了,我错过了一个额外的网络策略来允许从 cronjob pod 到 mysql 数据库服务,我想我对选择器之间的区别有点困惑(并且仍然)标签和元数据标签,但只要它与元数据标签一起使用,一切都很好:)。再次非常感谢。
    • 太好了 :) 我更一般地更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 2021-08-27
    • 2021-07-05
    • 2019-03-17
    • 2018-04-18
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多