Вы можете использовать мутирующий webhook, чтобы изменить входящий запрос модуля из указанного c пространства имен, чтобы добавить сходство узлов или селектор узла в модуле c.
Пример nodeSelector
контроллера доступа здесь . Полное руководство о том, как его использовать.
Подготовка API-сервера
Если ваш кластер был развернут с помощью kubeadm, kube-apiserver.yaml файл - это манифест конфигурации для сервера API Kubernetes. Он находится в / etc / kubernetes / manifest. Добавьте контроллер допуска PodNodeSelector в --admission-control = flag
Затем добавьте метку к узлу
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
}