自定义 Config Sync 系统 Pod 的节点放置

本文档介绍了如何为集群上运行的 Config Sync 系统 Pod 配置节点放置。在某些情况下,配置节点放置位置非常有用,例如出于安全目的将 Config Sync 系统 Pod 隔离到特定节点,或者出于节省费用的目的在更便宜的节点上调度 Config Sync。

关于 MutatingAdmissionPolicy

MutatingAdmissionPolicy 是 Kubernetes 1.34 版中提供的 Kubernetes 功能。如果您的集群中提供 MutatingAdmissionPolicy,您可以在有人向 Kubernetes API 写入更改时自定义行为。

在 Config Sync 的上下文中,您可以使用 MutatingAdmissionPolicy 将节点放置参数添加到在 Config Sync 系统命名空间中运行的 Pod 中。这些参数包括 Pod 规范字段,例如 nodeSelector 和 affinity。本文档提供了一个示例,说明了如何将 MutatingAdmissionPolicy 与 Config Sync 搭配使用,您可以在 Config Sync 开源代码库中找到更多示例。

设置 nodeSelector

以下示例展示了如何使用 MutatingAdmissionPolicy 自动向每个在具有标签 configmanagement.gke.io/system: "true" 的各个 Config Sync 系统命名空间中运行的 Pod 添加 nodeSelector。 Config Sync 系统命名空间包括 config-management-systemconfig-management-monitoringresource-group-system

apiVersion: admissionregistration.k8s.io/v1beta1
kind: MutatingAdmissionPolicy
metadata:
  name: "my-pod-node-selector"
spec:
  matchConstraints:
    resourceRules:
    - apiGroups:   [""]
      apiVersions: ["v1"]
      operations:  ["CREATE", "UPDATE"]
      resources:   ["pods"]
  failurePolicy: Fail
  reinvocationPolicy: IfNeeded
  mutations:
  # Basic example of adding nodeSelector: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
  # Similar mutations can be applied for affinities, tolerations, and so on
  - patchType: "JSONPatch"
    jsonPatch:
      expression: >
        [
          JSONPatch{
            op: "add", path: "/spec/nodeSelector",
            value: {
              "LABEL_KEY": "LABEL_VALUE",
            }
          }
        ]
---
apiVersion: admissionregistration.k8s.io/v1beta1
kind: MutatingAdmissionPolicyBinding
metadata:
  name: "configsync-node-selector"
spec:
  policyName: "my-pod-node-selector"
  matchResources:
    namespaceSelector:
      matchLabels:
        # This namespace selector only selects Config Sync system namespaces
        configmanagement.gke.io/system: "true"
  • LABEL_KEY 替换为节点选择器要使用的标签键。
  • LABEL_VALUE 替换为节点选择器要使用的标签值。

将此配置应用于集群后,所有 Config Sync 系统 Pod 都会调度到带有标签 LABEL_KEY=LABEL_VALUE 的节点上。