вход указывает на неправильный порт службы

У меня есть служба Kubernetes, которая предоставляет два порта следующим образом.

Name:              m-svc
Namespace:         m-ns
Labels:            
Annotations:       <none>
Selector:          app=my-application
Type:              ClusterIP
IP:                10.233.43.40
Port:              first  8080/TCP
TargetPort:        8080/TCP
Endpoints:         10.233.115.178:8080,10.233.122.166:8080
Port:              second  8888/TCP
TargetPort:        8888/TCP
Endpoints:         10.233.115.178:8888,10.233.122.166:8888
Session Affinity:  None
Events:            <none>

И вот определение входа:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: f5
    virtual-server.f5.com/http-port: "80"
    virtual-server.f5.com/ip: controller-default
    virtual-server.f5.com/round-robin: round-robin
  creationTimestamp: 2018-10-05T18:54:45Z
  generation: 2
  name: m-ingress
  namespace: m-ns
  resourceVersion: "39557812"
  selfLink: /apis/extensions/v1beta1/namespaces/m-ns
  uid: 20241db9-c8d0-11e8-9fac-0050568d4d4a
spec:

  rules:
  - host: www.myhost.com
    http:
      paths:
      - backend:
          serviceName: m-svc
          servicePort: 8080
        path: /first/path
      - backend:
          serviceName: m-svc
          servicePort: 8080
        path: /second/path
status:
  loadBalancer:
    ingress:
    - ip: 172.31.74.89

Но когда я перехожу к www.myhost.com/first/path, я оказываюсь в службе, которая прослушивает порт 8888 из m-svc. Что может происходить?

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

Также я использую контроллер F5

После долгого изучения этого, похоже, что основная причина находится в F5s, похоже, потому что имя бэкэнда (служба Kubernetes) такое же, он создает только одну запись в пуле и направляет запросы к этому backend и один порт, который регистрируется в политике F5. можно ли это исправить? Обходной путь — создать уникальную службу для каждого порта, но я не хочу вносить это изменение, возможно ли это на уровне F5?


person user_mda    schedule 05.10.2018    source источник
comment
Не могли бы вы предоставить некоторые шаги, чтобы воссоздать проблему? Я мог бы проверить, происходит ли это в моей лабораторной среде.   -  person aurelius    schedule 08.10.2018
comment
Разверните приложение с двумя открытыми портами, создайте одну службу с двумя открытыми портами, как в вопросе, а затем создайте входной путь, как в вопросе.   -  person user_mda    schedule 08.10.2018


Ответы (2)


Насколько я вижу, у вас нет поля Selector в вашем сервисе. Без него он не будет переадресовываться ни на какой бэкэнд или модуль. С чего вы взяли, что это порт 8888? Странно, что у вас есть Endpoints в оказание услуг. Вы их вручную создавали?

Служба должна быть примерно такой:

Name:              m-svc
Namespace:         m-ns
Labels:            
Annotations:       <none>
Selector:          app=my-application
Type:              ClusterIP
IP:                10.233.43.40
Port:              first  8080/TCP
TargetPort:        8080/TCP
Endpoints:         10.233.115.178:8080,10.233.122.166:8080
Port:              second  8888/TCP
TargetPort:        8888/TCP
Endpoints:         10.233.115.178:8888,10.233.122.166:8888
Session Affinity:  None
Events:            <none>

Затем в вашем определении развертывания:

selector:
  matchLabels:
    app: my-application

Или в стручке:

apiVersion: v1
kind: Pod
metadata:
  annotations: { ... }
  labels:                                
    app: my-application

Вы также должны быть в состоянии описать свой Endpoints:

$ kubectl describe endpoints m-svc
Name:         m-svc
Namespace:    default
Labels:       app=my-application
Annotations:  <none>
Subsets:
  Addresses:          x.x.x.x
  NotReadyAddresses:  <none>
  Ports:
    Name    Port  Protocol
    ----    ----  --------
    first   8080  TCP
    second  8081  TCP

Events:  <none>
person Rico    schedule 05.10.2018
comment
Спасибо, к сожалению, он показывает тот же результат с селекторами, и я не устанавливал эндооинты вручную. - person user_mda; 06.10.2018
comment
Я думаю, что это указывает на порт 8888, потому что, когда я нажимаю на входной хост из браузера, он показывает мне службу, которая прослушивает порт 8888, а не 8080. - person user_mda; 06.10.2018
comment
Нужно ли мне поле селектора в определении входа? - person user_mda; 09.10.2018
comment
Не совсем так. Кстати, я попробовал это на своей установке, и у меня это работает с контроллером входа nginx. - person Rico; 09.10.2018
comment
Является ли ваш балансировщик нагрузки f5 балансировщиком нагрузки уровня 4 или уровня 7? - person Rico; 09.10.2018
comment
Я создал службу для каждого порта, это ограничение F5, которое создает запись для службы только один раз, поэтому второй порт скомпрометирован. - person user_mda; 18.10.2018

Похоже, что ваш Service представляет собой то, что называется безголовым сервисом: https://kubernetes.io/docs/concepts/services-networking/service/#headless-services. Это объясняет, почему Endpoints был создан автоматически.

Что-то не так, потому что ваш HTTP-запрос должен быть невозможен для ваших модулей без заполнения .spec.selector.

Я предлагаю удалить созданный вами Service и удалить Endpoints с тем же именем, а затем заново создать Service с type=ClusterIP и правильно заполненным spec.selector.

person mpalumbo7    schedule 06.10.2018
comment
Привет, я обновил вопрос, чтобы иметь селектор, который, похоже, не решает проблему, что вы подразумеваете под конечными точками с тем же именем? - person user_mda; 07.10.2018