use*_*mda 8 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>
Run Code Online (Sandbox Code Playgroud)
以下是入口定义:
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
Run Code Online (Sandbox Code Playgroud)
但是当我去的时候,www.myhost.com/first/path我最终会收听正在收听端口8888的服务m-svc.可能会发生什么?
另一条信息是我在两个入口之间共享服务,指向同一服务上的不同端口,这是一个问题吗?该服务上的端口8888有一个不同的入口端口,工作正常
我也在使用F5控制器
经过大量的时间调查,看起来根本原因是在F5中,看起来因为后端的名称(Kubernetes服务)是相同的,它只在池中创建一个条目并将请求路由到此后端和在F5策略中注册的一个端口.有没有解决这个问题?解决方法是为每个端口创建一个唯一的服务,但我不想进行此更改,这是否可以在F5级别?
据我所知,你没有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>
Run Code Online (Sandbox Code Playgroud)
然后在您的部署定义中:
selector:
matchLabels:
app: my-application
Run Code Online (Sandbox Code Playgroud)
或者在 Pod 中:
apiVersion: v1
kind: Pod
metadata:
annotations: { ... }
labels:
app: my-application
Run Code Online (Sandbox Code Playgroud)
您还应该能够描述您的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>
Run Code Online (Sandbox Code Playgroud)