Селектор службы Kubernetes используется для выбора другой службы, а не для развертывания?

Я просто хочу знать, можно ли в определении службы Kubernetes ссылаться на службу, а не на развертывание (с использованием меток службы вместо меток развертывания)?

Я хочу сказать, что предположим, что у меня есть служба A, который предоставляет развертывание AD, и теперь я хочу определить другую службу B, но на этот раз вместо ее селектора, относящегося к развертыванию AD, я хочу, чтобы он указывал на предыдущую определенную службу, то есть службу A? Возможно ли это вообще в Kubernetes? Например, см. Сценарий ниже

**Deployment A-D**
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80

**ServiceA**
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx-1
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx

**ServiceB**
apiVersion: v1
kind: Service
metadata:
  name: my-nginx-wrapper-service
  labels:
    run: my-nginx-2
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx-1  //service label instead of deployment

ОБНОВИТЬ:

headless service
    apiVersion: v1
    kind: Service
    metadata:
      name: access-service
      annotations:
        getambassador.io/config: |
          ---
          apiVersion: ambassador/v1
          kind: Mapping
          name: productreadservice-mapping
          prefix: /Apps/ProductReadService/.*
          prefix_regex: true
          rewrite: ""
          service: access-service:80
    spec:
      clusterIP: None
      ports:
      - name: http
        port: 80
        targetPort: 8082

endpoint object
apiVersion: v1
kind: Endpoints
metadata:
  name: access-service
subsets:
- addresses:
  - ip: ip of the service i wish to access
  ports:
  - port: 8082
    protocol: TCP

person JayD    schedule 01.01.2020    source источник


Ответы (2)


Да, это возможно! Но не через селекторы.

Если у вас есть служба, указывающая на модули A-D, у вас есть IP-адрес. Вы можете создать объект Endpoints с этим IP-адресом. Затем вы можете создать headless service без селекторов с тем же именем, что и объект Endpoints.

Пример:

Скажите, что ваш служебный IP-адрес (тот, который указывает на Depoyments A-D) - 10.0.0.10. Создайте объект Endpoints:

apiVersion: v1
kind: Endpoints
metadata:
  name: my-headless-service
subsets:
- addresses:
  - ip: 10.0.0.10
  ports:
  - port: 80
    protocol: TCP

Теперь создайте безголовый сервис с тем же именем, что и Endpointsobject. Обратите внимание, что у него нет селекторов меток, поэтому он не выбирает никакой бэкэнд. Когда это происходит, запрос отправляется в DNS, и там он будет искать либо службу типа en ExternalName с тем же именем, либо объект Endpoints с тем же именем.

apiVersion: v1
kind: Service
metadata:
  name: my-headless-service
spec:
  clusterIP: None
  ports:
  - name: http
    port: 80
    targetPort: 80

Разрешение происходит в DNS, а не в iptables.

person suren    schedule 01.01.2020
comment
это работает с послом, потому что похоже, что мой безголовый сервис не обнаружен послом - person JayD; 02.01.2020
comment
Да, он должен работать во всех случаях использования. То есть от посла нельзя дозвониться до службы? Как вы делаете запрос? - person suren; 02.01.2020
comment
Я имею в виду, что в соответствии с вашим советом я создал безголовый сервис без какого-либо селектора и создал для него сопоставление с аннотациями послов, но когда я пытаюсь добраться до него, он выдает ошибку недоступности службы 503 - person JayD; 02.01.2020
comment
О, я думал, у вас есть контейнер с коляской. Не знаю, как Ambassador отправляет запрос. Это также вызывает ошибку, когда вы устанавливаете полное доменное имя службы (svc-name.namespace.svc.cluster.local)? - person suren; 02.01.2020
comment
Под послом я имел в виду собственный шлюз api kubernetes getambassador.io - person JayD; 02.01.2020
comment
Да, я тебя понял. Этот шаблон должен работать для всех случаев использования, так как это не обходной путь. Он предназначен для нацеливания на службу из другой службы. Где именно вы задаете имя безголовой службы? Что такое мэппинг с аннотациями амбассадоров? - person suren; 02.01.2020
comment
только что наткнулся на это в документации kubernetes. IP-адреса конечных точек не могут быть IP-адресами кластера других сервисов Kubernetes, потому что kube-proxy не поддерживает виртуальные IP-адреса в качестве пункта назначения. . Означает ли это, что используемый нами подход не работает? - person JayD; 02.01.2020
comment
Понятно. Я не знаю, будет ли с этой аннотацией работать так, как вы хотите. Но вы наверняка можете указать с помощью объекта конечных точек на другой IP-адрес службы. Просто проведите простой тест, чтобы убедиться, что он работает. Создайте простое развертывание и ClusterIP службу, указывающую на него. Затем выполните все конечные точки и безголовый сервис, и вы увидите, что это работает. - person suren; 02.01.2020

Это невозможно. Селектор должен выбирать только метки модулей.

person Shashank V    schedule 01.01.2020