Выделенные узлы для пространства имен - PullRequest
1 голос
/ 24 апреля 2020

В Kubernetes у нас есть несколько сред, разделенных различным пространством имен. Я хочу убедиться, что один набор узлов используется только указанным c пространством имен / средой.

  1. Узлы указанных c меток должны отклонять все модули, которые не принадлежат namespace
  2. Модули из указанного c пространства имен должны всегда выбирать узлы с настроенными метками.

Каким образом это можно сделать? Слышал о мутирующих контроллерах доступа webhook, у кого-нибудь есть образец, чтобы посмотреть, как он работает.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Вы можете использовать мутирующий 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
}
1 голос
/ 24 апреля 2020

Это можно сделать с помощью аннотации выбора узла в пространстве имен, см. Пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...