在Kubernetes中,我们有多个环境,由不同的名称空间分隔。我想确保一组节点仅由特定的名称空间/环境使用。
实现它的方法是什么?听说过有关更改Webhook接纳控制器的知识,任何人都有一个示例,以了解其工作原理。
您可以使用mutation webhook来更改来自特定名称空间的传入pod请求,以在pod spec中添加节点相似性或节点选择器。
这里的nodeSelector
准入控制器示例。有关如何使用它的完整指南。
准备API服务器
假设您的集群已经使用kubeadm进行了部署,则kube-apiserver.yaml文件是Kubernetes API服务器的配置清单。它位于/ etc / kubernetes / manifests中。在--admission-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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句