Kubernetes无头服务解决了多面舱的特定接口



我有一个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流量和eth1eth0接口将是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(。

有关没有选择的服务的更多信息,您可以在此处找到。

最新更新