IPv4/IPv6 双协议栈

FEATURE STATE: Kubernetes v1.16 alpha

该功能目前处于 alpha 状态,意味着:

  • 版本名称包含 alpha(例如 v1alpha1)。
  • 可能存在问题,启用该功能可能会暴露 bug。默认情况下被禁用。
  • 对该功能的支持可能在任何时候被取消,而不另行通知。
  • API 可能会在以后的软件版本中以不兼容的方式被更改,而不另行通知。
  • 建议仅在短期测试集群中使用该功能,这是因为使用该功能会增加出现 bug 的风险,而且缺乏长期支持。

IPv4/IPv6 双协议栈能够将 IPv4 和 IPv6 地址分配给 PodsPod 是 Kubernetes 的原子对象。Pod 表示您的集群上一组正在运行的容器。Services将运行在一组 {{< glossary_tooltip text=“Pods” term_id=“pod” >}} 上的应用程序公开为网络服务的抽象方法。

如果你为 Kubernetes 集群启用了 IPv4/IPv6 双协议栈网络,则该集群将支持同时分配 IPv4 和 IPv6 地址。

支持的功能

在 Kubernetes 集群上启用 IPv4/IPv6 双协议栈可提供下面的功能:

  • 双协议栈 pod 网络 (每个 pod 分配一个 IPv4 和 IPv6 地址)
  • IPv4 和 IPv6 启用的服务 (每个服务必须是一个单独的地址族)
  • Kubenet 多地址族支持(IPv4 和 IPv6)
  • Pod 的集群外出口通过 IPv4 和 IPv6 路由

先决条件

为了使用 IPv4/IPv6 双栈的 Kubernetes 集群,需要满足以下先决条件:

  • Kubernetes 1.16 版本及更高版本
  • 提供商支持双协议栈网络(云提供商或其他提供商必须能够为 Kubernetes 节点提供可路由的 IPv4/IPv6 网络接口)
  • Kubenet 网络插件
  • Kube-proxy 运行在 IPVS 模式

启用 IPv4/IPv6 双协议栈

要启用 IPv4/IPv6 双协议栈,为集群的相关组件启用 IPv6DualStack 特性门控,并且设置双协议栈的集群网络分配:

  • kube-controller-manager:
    • --feature-gates="IPv6DualStack=true"
    • --cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR> 例如 --cluster-cidr=10.244.0.0/16,fc00::/24
    • --service-cluster-ip-range=<IPv4 CIDR>,<IPv6 CIDR>
    • --node-cidr-mask-size-ipv4|--node-cidr-mask-size-ipv6 对于 IPv4 默认为 /24,对于 IPv6 默认为 /64
  • kubelet:
    • --feature-gates="IPv6DualStack=true"
  • kube-proxy:
    • --proxy-mode=ipvs
    • --cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR>
    • --feature-gates="IPv6DualStack=true"

警告:

如果命令行的 --cluster-cidr 指定大于 /24 的 IPv6 地址块,地址分配将失败。

服务

如果你的集群启用了 IPv4/IPv6 双协议栈网络,则可以使用 IPv4 或 IPv6 地址来创建 Services将运行在一组 {{< glossary_tooltip text=“Pods” term_id=“pod” >}} 上的应用程序公开为网络服务的抽象方法。 。你可以通过设置服务的 .spec.ipFamily 字段来选择服务的集群 IP 的地址族。你只能在创建新服务时设置该字段。.spec.ipFamily 字段的设置是可选的,并且仅当你计划在集群上启用 IPv4 和 IPv6 的 Services将运行在一组 {{< glossary_tooltip text=“Pods” term_id=“pod” >}} 上的应用程序公开为网络服务的抽象方法。IngressesIngress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。 。对于出口流量,该字段的配置不是必须的。

注意:

集群的默认地址族是第一个服务集群 IP 范围的地址族,该地址范围通过 kube-controller-manager 上的 --service-cluster-ip-range 标志设置。

你可以设置 .spec.ipFamily 为:

  • IPv4:API 服务器将从 service-cluster-ip-range 中分配 ipv4 地址
  • IPv6:API 服务器将从 service-cluster-ip-range 中分配 ipv6 地址

以下服务规约不包含 ipFamily 字段。Kubernetes 将从最初配置的 service-cluster-ip-range 范围内分配一个 IP 地址(也称作“集群 IP”)给该服务。

service/networking/dual-stack-default-svc.yaml IPv4/IPv6 双协议栈 - 图1
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: my-service
  5. spec:
  6. selector:
  7. app: MyApp
  8. ports:
  9. - protocol: TCP
  10. port: 80
  11. targetPort: 9376

以下服务规约不包含 ipFamily 字段。Kubernetes 将从已配置的 service-cluster-ip-range 范围内分配一个 IPv6 地址(也称作“集群 IP”)给该服务。

service/networking/dual-stack-ipv6-svc.yaml IPv4/IPv6 双协议栈 - 图2
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: my-service
  5. spec:
  6. ipFamily: IPv6
  7. selector:
  8. app: MyApp
  9. ports:
  10. - protocol: TCP
  11. port: 80
  12. targetPort: 9376

为了进行比较,将从已配置的 service-cluster-ip-range 向该服务分配以下 IPV4 地址(也称为“集群 IP”)。

service/networking/dual-stack-ipv4-svc.yaml IPv4/IPv6 双协议栈 - 图3
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: my-service
  5. spec:
  6. ipFamily: IPv4
  7. selector:
  8. app: MyApp
  9. ports:
  10. - protocol: TCP
  11. port: 80
  12. targetPort: 9376

负载均衡器类型

在支持启用了 IPv6 的外部服务均衡器的云驱动上,除了将 ipFamily 字段设置为 IPv6,将 type 字段设置为 LoadBalancer,为你的服务提供云负载均衡。

出口流量

公共路由和非公共路由的 IPv6 地址块的使用是可以的。提供底层 CNI容器网络接口 (CNI) 插件是遵循 appc/CNI 协议的一类网络插件。 的提供程序可以实现这种传输。如果你拥有使用非公共路由 IPv6 地址的 Pod,并且希望该 Pod 到达集群外目的(比如,公共网络),你必须为出口流量和任何响应消息设置 IP 伪装。ip-masq-agent 可以感知双栈,所以你可以在双栈集群中使用 ip-masq-agent 来进行 IP 伪装。

已知问题

  • Kubenet 强制 IPv4,IPv6 的 IPs 位置报告 (–cluster-cidr)

接下来