Какова цель селектора подстановки кубернетов?

Я не понимаю, зачем kubernetes нужен селектор pod в операторе развертывания, который может содержать только один шаблон pod? Не стесняйтесь рассказать мне, почему инженеры kubernetes внедрили оператор выбора в определении развертывания вместо автоматического выбора модуля из шаблона?

---
apiVersion: v1
kind: Service
metadata:
  name: grpc-service

spec:
  type: LoadBalancer
  ports:
  - name: grpc
    port: 8080
    targetPort: 8080
    protocol: TCP
  selector:
    app: grpc-test

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: grpc-deployment

spec:
  replicas: 1
  revisionHistoryLimit: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0

  selector:
    matchLabels:
      app: grpc-test

  template:
    metadata:
      labels:
        app: grpc-test

    spec:
      containers:
      ...

Почему бы просто не определить что-то подобное?

---
apiVersion: v1
kind: Service
metadata:
  name: grpc-service

spec:
  type: LoadBalancer
  ports:
  - name: grpc
    port: 8080
    targetPort: 8080
    protocol: TCP
  selector:
    app: grpc-test

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: grpc-deployment

spec:
  replicas: 1
  revisionHistoryLimit: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0

  template:
    metadata:
      labels:
        app: grpc-test

    spec:
      containers:
      ...

Ответ 1

Ах! Забавно, я однажды попробовал обернуть голову вокруг концепции селекторов меток, а также раньше. Итак, вот оно...

Прежде всего, к какому черту эти метки используются? Ярлыки внутри кубернетов являются основным средством идентификации объектов. Контроллер управляет контейнерами на основе их ярлыка вместо имени. В этом конкретном случае они, например, предназначены для идентификации модулей, принадлежащих набору реплик развертываний.

Фактически вам не приходилось неявно определять .spec.selector при использовании расширений v1beta1. В этом случае значение по умолчанию .spec.template.labels. Однако, если вы этого не сделаете, вы можете столкнуться с проблемами с kubectl apply один или несколько меток, которые используются для выбора изменений, потому kubeclt apply будет рассматривать kubectl.kubernetes.io/last-applied-configuration при сравнении изменений и этой аннотации будет содержать только пользовательский ввод, когда он создал ресурс, и ни одно из полей по умолчанию. Вы получите ошибку, потому что она не может рассчитать diff как:

spec.template.metadata.labels: Invalid value: {"app":"nginx"}: 'selector' does not match template 'labels'

Как вы можете видеть, это довольно большой недостаток, поскольку это означает, что вы не можете изменить ни одну из меток, которые используются в качестве метки выбора, или полностью разрушит поток развертывания. Он был "исправлен" в apps/v1beta2, требуя, чтобы селекторы были явно определены, запрещая мутацию в этих полях.

Таким образом, в вашем примере вам фактически не нужно их определять! Создание будет работать и будет использовать ваши .spec.template.labels по умолчанию. Но да, в ближайшем будущем, когда вам нужно будет использовать v1beta2, поле будет обязательным. Надеюсь, этот вопрос ответит на ваш вопрос, и я не стал его запутывать;)

Ответ 2

Насколько мне известно, селектор в развертывании является необязательным свойством.

Шаблон является единственным обязательным полем спецификации.

Таким образом, вам не нужно использовать селектор ярлыков в развертывании, и в вашем примере я не понимаю, почему вы не могли использовать последнюю часть?