我正在尝试在本地使用 NodePort 公开服务裸机 Kubernetes(1.17)集群(Calico 用于 CNI 和CRI-O 1.17)
- 所有节点(Ubuntu 18.04)都具有 IPv4 和 IPv6 地址,并且可以通过两种方式访问(例如 ssh)
- 已使用 kubeadm 和 IPv4 启动 Kubernetes
- nginx 测试部署正在运行,并且可以使用带有 nodeport 的服务进行访问
我可以使用 IPv4 成功卷曲服务,但不能使用 IPv6(连接已建立但未传输任何内容)。
kubectl describe svc/example-service
Name: example-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=helloworld
Type: NodePort
IP: 10.97.69.135
Port: <unset> 5000/TCP
TargetPort: 5000/TCP
NodePort: <unset> 32042/TCP
Endpoints: 10.10.166.132:5000
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
在运行此部署的主机上:
netstat -tulpen|grep ':32042'
tcp6 0 0 :::32042 :::* LISTEN 0 10276301 2314/kube-proxy
kube-proxy 显然绑定到 tcp6(具有 tcp4 兼容模式) - 因此可以建立连接 - 但是没有使用 tcp6(curl -6)传输数据,tcp4(curl -4)按预期工作。
是否必须将集群配置为双栈或 IPv6 模式才能接收 IPv4 和 IPv6 请求(例如通过 NodePort)?
答案1
是的,这就是双栈的用途。它允许分配IPv6
和IPv4
地址。没有它,pod 和服务将无法通过一个或另一个 IP 协议访问。如果无法处理 IP 协议,DNS 解析不足以实现正确的网络连接。
根据Kubernetes文档:
IPv4/IPv6 双栈
特征状态:
Kubernetes v1.16
αIPv4/IPv6 双栈允许同时分配 IPv4 和 IPv6 地址 Pod 和 服务。
如果您为 Kubernetes 集群启用 IPv4/IPv6 双栈网络,则该集群将支持同时分配 IPv4 和 IPv6 地址。
请注意,这是一个 alpha 功能,不适用于生产环境。
替代方法是使用IPv6
终止模型。IPv6
流量通过代理发送到集群网络内的 IPv4 后端。例子来自 GCP 文档。
更新:
可以IPv6
不IPv4
与 calico 一起使用。但是有一些限制。
根据印花布文档:
- 目前,Kubernetes 一次仅支持一个 IP 堆栈版本。这意味着如果您为 IPv6 配置 Kubernetes,则 Calico 应配置为仅分配 IPv6 地址。
- 此处的步骤和设置尚未针对现有 IPv4 集群进行测试,仅适用于新集群。
IPv6
要仅在 kubernetes 集群中启用,请使用以下命令指导。
希望能帮助到你。