首页 > 解决方案 > Kubernetes Headless Service 解析为多接口 Pod 的特定接口

问题描述

我有一个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--->

现在我想将这两个接口用于不同类型的流量。例如,eth0用于 HTTP 流量的接口eth1将是 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 地址。是否有任何可能的机制可以让 Headless Service 可靠地解析为多接口 pod 的特定接口?

标签: kubernetes

解决方案


部署定义正确。你能告诉我输出:

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

由于该 Service 没有选择器,因此不会自动创建相应的 Endpoint 对象。您可以通过手动添加 Endpoint 对象,手动将服务映射到其运行的网络地址和端口:

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),第二个来自 Flannel (10.244.1.53)。

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


推荐阅读