8

我有一个 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 级别是否可行?

4

2 回答 2

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

或者在一个 pod 中:

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>
于 2018-10-05T22:01:55.617 回答
0

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

.spec.selector有些事情不对劲,因为您的 HTTP 请求应该不可能在没有填充的情况下到达您的 pod 。

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

于 2018-10-06T16:12:48.850 回答