Вход указывает на неправильный порт службы
У меня есть сервис 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) одинаково, он создает только одну запись в пуле и направляет запросы к этому бэкэнд и один порт, который регистрируется в политике F5. можно ли это исправить? Обходной путь - создать уникальный сервис для каждого порта, но я не хочу вносить это изменение, возможно ли это на уровне F5?
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>
Ваш Service
Похоже, что это называется безголовый сервис: https://kubernetes.io/docs/concepts/services-networking/service/. Это объясняет, почему Endpoints
был создан автоматически.
Что-то не так, потому что ваш HTTP-запрос не может прийти к вам без пакетов .spec.selector
населен.
Я предлагаю удалить Service
Вы создали и удалили Endpoints
с тем же именем, а затем воссоздать Service
с type=ClusterIP
и spec.selector
правильно заселены.