入口指向服务上的错误端口

时间:2018-10-05 20:09:23

标签: kubernetes kubernetes-ingress kubernetes-service

我有一个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控制器

经过大量时间调查后,似乎根本原因在于F5,因为后端(Kubernetes服务)的名称相同,所以它仅在池中创建一个条目并将其路由向此后端的请求以及在F5策略中注册的一个端口。有解决办法吗?一种解决方法是为每个端口创建唯一的服务,但是我不想进行此更改,是否可以在F5级别进行?

2 个答案:

答案 0 :(得分:4)

据我所知,您的服务中没有Selector字段。没有它,它将不会转发到任何后端或Pod。是什么让您认为它将进入端口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>

答案 1 :(得分:0)

您的Service似乎是无头服务:https://kubernetes.io/docs/concepts/services-networking/service/#headless-services。这可以解释为什么Endpoints是自动创建的。

有些事情不对劲,因为如果没有填充.spec.selector,HTTP请求就不可能到达您的Pod。

我建议删除您创建的Service,并删除具有相同名称的Endpoints,然后重新创建Service,并正确填充type=ClusterIPspec.selector