Kubernetes 命名空间的专用节点

Kubernetes 命名空间的专用节点,kubernetes,Kubernetes,在Kubernetes中,我们有多个环境,由不同的名称空间分隔。我希望确保一组节点仅由特定的命名空间/环境使用 特定标签的节点应该拒绝所有不属于名称空间的POD 来自特定命名空间的POD应始终选择配置了标签的节点 实现这一目标的途径是什么?听说过变异webhook准入控制器,任何人都有一个示例,看看它是如何工作的。您可以使用变异webhook来变异来自特定命名空间的传入pod请求,以添加或添加到pod规范中 节点选择器接纳控制器示例。完全了解如何使用它 准备API服务器 假设您的集群已经部署了k

在Kubernetes中,我们有多个环境,由不同的名称空间分隔。我希望确保一组节点仅由特定的命名空间/环境使用

  • 特定标签的节点应该拒绝所有不属于名称空间的POD
  • 来自特定命名空间的POD应始终选择配置了标签的节点

  • 实现这一目标的途径是什么?听说过变异webhook准入控制器,任何人都有一个示例,看看它是如何工作的。

    您可以使用变异webhook来变异来自特定命名空间的传入pod请求,以添加或添加到pod规范中

    节点选择器
    接纳控制器示例。完全了解如何使用它

    准备API服务器

    假设您的集群已经部署了kubeadm,那么kube-apiserver.yaml文件就是Kubernetes API服务器的配置清单。它位于/etc/kubernetes/manifests中。在--acmission control=标志中添加PodNodeSelector准入控制器

    然后将标签添加到节点

    kubectl label node kubeprod01 env=production
    
    然后在名称空间的注释中使用该标签

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
        scheduler.alpha.kubernetes.io/node-selector: env=production
    
    通过变异webhook添加节点亲和力的示例

    func mutatePods(ar v1beta1.AdmissionReview, o *options) *v1beta1.AdmissionResponse {
        var reviewResponse = &v1beta1.AdmissionResponse{
            Allowed: true,
        }
    
        podResource := metav1.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}
        if ar.Request.Resource != podResource {
            glog.Errorf("expect resource to be %s", podResource)
            return nil
        }
    
        raw := ar.Request.Object.Raw
        pod := v1.Pod{}
        // glog.V(2).Infof("Object: %v", string(raw))
        if err := json.Unmarshal(raw, &pod); err != nil {
            glog.Error(err)
            return nil
        }
    
        addPodAffinityPatch := fmt.Sprintf(`[
             {"op":"add","path":"/spec/affinity","value":{"nodeAffinity":{"preferredDuringSchedulingIgnoredDuringExecution":[{"preference":{"matchExpressions":[{"key":"%s","operator":"NotIn","values":["%s"]}]},"weight":1}]}}}
        ]`, o.PodAffinityKey, o.PodAffinityValue)
    
        glog.V(2).Infof("patching pod")
        reviewResponse.Patch = []byte(addPodAffinityPatch)
        pt := v1beta1.PatchTypeJSONPatch
        reviewResponse.PatchType = &pt
    
        return reviewResponse
    }
    

    这可以通过名称空间中的节点选择器注释来完成,请参见一个示例

    我最近公开了一个变异的webhook,它可以开箱即用:)