我有一个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级别进行?
答案 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=ClusterIP
和spec.selector
。