kubernetes - 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 的特定接口?
解决方案
部署定义正确。你能告诉我输出:
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)。
有关没有选择器的服务的更多信息,您可以在此处找到。
推荐阅读
- dhall - 如何在 extractError 中获取更多上下文?
- git - 如何使用 Git 将父分支中的错误修复应用到子分支?
- python - 如何在多处理中与另一个脚本共享全局变量?
- python - 数组中每个元素的最小值
- php - 即使在清除缓存和更改 CSS 版本之后,CSS 文件也会被缓存
- python - 函数执行和不执行的区别(返回变量)
- c# - Xamarin Nuget Manager 现在指向 csproj 文件而不是 ProjectFolder/packages
- javascript - 使用 HTML 表单图像通过 ONNX.js 执行推理
- azure - 管道迁移工作 - 一直在使用它并收到错误没有命名的端点或同名的重复项
- python - 托管 AWS 服务(例如 Managed Airflow (MWAA))能否在完全本地的数据资源上用于云中?