我有一个Deployment
,使用CNI-Genie
:
apiVersion: "apps/v1"
kind: Deployment
metadata:
name: my-shiny-app
labels:
app: shiny-app
spec:
replicas: 1
selector:
matchLabels:
app: shiny-app
template:
metadata:
labels:
app: shiny-app
annotations:
cni: "weave, flannel"
spec:
containers:
<---snip--->
我可以看到,在POD中确实创建了两个接口,并且IP地址已分配给它。
$ kubectl describe pod my-shiny-app-65c97dfdb9-crl7q
<---snip--->
Annotations: cni: weave, flannel
multi-ip-preferences: {"multi_entry":2,"ips":{"ip1":{"ip":"10.36.0.12","interface":"eth0"},"ip2":{"ip":"10.244.1.53","interface":"eth1"}}}
Status: Running
IP: 10.36.0.12
<---snip--->
现在,我想将两个接口用于不同类型的流量。例如,HTTP流量和eth1
的eth0
接口将是UDP流量。我的应用程序将绑定并聆听这些接口上各自的流量。
到目前为止,一切都很好!
现在,我想使用两个Headless Services
将流量发送到我的应用程序。这样:
apiVersion: v1
kind: Service
metadata:
name: shiny-app-http-service
spec:
selector:
app: shiny-app
ports:
- protocol: TCP
port: 8080
name: shiny-app-http
clusterIP: None
---
apiVersion: v1
kind: Service
metadata:
name: shiny-app-udp-service
spec:
selector:
app: shiny-app
ports:
- protocol: UDP
port: 8805
name: shiny-app-udp
clusterIP: None
但是,这两种服务都解决了应用程序eth0
接口的IP地址。是否有任何可能的机制可以可靠地解决多个接口吊舱的特定接口?
部署定义是正确的。您能告诉我以下输出:
kubectl exec -it my-shiny-app -- ip addr
它将显示是否正确创建了接口,每个接口都在其CNI的子网中。
我想的是创建一个没有任何选择器的服务:
apiVersion: v1
kind: Service
metadata:
name: shiny-app-http-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
由于此服务没有选择器,因此未自动创建相应的端点对象。您可以手动添加端点对象,将服务手动映射到正在运行的网络地址和运行的端口:
apiVersion: v1
kind: Endpoints
metadata:
name: shiny-app-http-service
subsets:
- addresses:
- ip: 10.36.0.12
ports:
- port: 9376
无需选择器的服务与具有选择器相同。在上面的示例中,流量路由到YAML中定义的单端点:10.36.0.12:9376(TCP(。
因此,您可以创建两个带有两个IP地址的服务和两个端点文件,第一个IP来自Weave(10.36.0.12(,第二个IP来自Flannel(10.244.1.53(。
有关没有选择的服务的更多信息,您可以在此处找到。