kubernetes 命名空间的专用节点

nhaq1z21  于 2022-12-03  发布在  Kubernetes
关注(0)|答案(3)|浏览(128)

在Kubernetes中,我们有多个环境,由不同的名称空间分隔。我想确保一组节点只由特定的名称空间/环境使用。
1.具有特定标签的节点应拒绝不属于命名空间的所有pod
1.特定名称空间中的单元应始终选择已配置标签的节点。
实现它的方法是什么?听说过变异webhook准入控制器,任何人都有一个样本,看看它是如何工作的。

9vw9lbht

9vw9lbht1#

您可以使用变更webhook来变更来自特定名称空间的传入pod请求,以便在pod规范中添加节点关联或节点选择器。
nodeSelector准入控制器here.guide的一个例子如何使用它。

准备API服务器

假设您的集群已部署了kubeadm,则kube-apiserver.yaml文件是Kubernetes API服务器的配置清单。它位于/etc/kubernetes/manifests中。在--admission-control= flag中添加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
}
hjqgdpho

hjqgdpho2#

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

xoshrz7s

xoshrz7s3#

要确保一组节点专用于命名空间中的资源,您应该使用以下组合:

  • podSelector * 仅在集合的节点上强制调度资源 *
  • taint * 用于拒绝调度不在该集合 * 的节点上的命名空间中的任何其他资源

如何创建专用于仅使用一组节点的命名空间:https://stackoverflow.com/a/74617601/5482942
此外,我发现阅读使用名称空间的动机也很有用。
实际上,通常不建议在同一个k8s集群中有多个环境(开发、测试、暂存、生产)。
最佳做法是为每个环境使用专用群集。
要保存成本,您可以使用以下各项:

  • 1个群集:开发、测试、转移
  • 1个集群:生产

相关问题