CCE 支持 IPv4 和 IPv6 双栈网络
概述
本文档介绍 CCE 支持的 IPv4/IPv6 双栈网络能力及控制台配置与访问方式。互联网协议第六版 IPv6 是互联网升级演进的必然趋势、网络技术创新的重要方向、网络强国建设的基础支撑。CCE 目前支持 IPv4/IPv6 双栈集群,包括如下特点:
- Node 同时支持 IPv4 和 IPv6 地址,集群内部支持使用两种类型地址通信。
- Pod 双栈同时支持 IPv4 和 IPv6 地址,并支持两种类型 IP 访问。
- Service 同时支持 IPv4 和 IPv6 地址,并支持通过 IPv6 对外暴露服务。
IPv6 双栈网络参考: VPC 使用 IPv6
前提条件
仅支持在 CCE 标准集群中使用 IPv4/IPv6 双栈容器网络。
- Kubernetes 版本 1.20 以上。
- cce-network 网络插件版本 2.7.7 以上。
新建 IPv4/IPv6 双栈 VPC 及子网
CCE IPv4/IPv6 双栈集群需要运行在支持 IPv6 的 VPC(私有网络) 的子网中,因此在创建双栈集群前应首先创建一个支持 IPv6 的 VPC 及其子网。
创建 VPC
导航路径:VPC 控制台->私有网络
- 点击 【创建 VPC】。
- 在创建页面填写 VPC 名称、IPv4 CIDR,打开 分配 IPv6 网段 开关。
- 点击 【确定】 完成创建。


创建子网
导航路径:VPC 控制台->子网
- 进入目标 VPC 的 【子网】 页签,点击 【创建子网】。
- 在创建页面选择 所在网络,填写 子网名称、可用区、IPv4 CIDR,并打开 分配 IPv6 网段 开关。
- 点击 【确定】 完成创建。



新建 IPv4/IPv6 双栈 K8S 集群
进入 CCE 控制台,创建双栈集群。
导航路径:CCE 控制台->集群列表
-
在 基础配置 页面选择地域,打开 IPv6 双栈网络,并在 私有网络、API Server 子网 中选择已分配 IPv6 网段的 VPC 和子网。


-
在 网络配置 区域勾选容器子网,查看系统生成的 IPv4 ClusterIP 网段与 IPv6 ClusterIP 网段。如需自定义 IPv6 ClusterIP 网段,可填写符合 RFC 4193 的 ULA 地址段,即
fd00::/8的子集。

-
填写集群名称并勾选容器子网,点击 【下一步】 进入 节点组配置,按页面提示完成 节点组配置、组件配置 和 确认配置,提交创建。


通过 IPv4 和 IPv6 访问 Pod
在 IPv4/IPv6 双栈集群中,可以为 Pod 同时分配 IPv4 地址和 IPv6 地址。
注意:后端 Pod 也需要监听 IPv6 协议栈下端口,否则会出现 Pod 被分配了 IPv6 地址但是连接被拒绝的情况
导航路径:CCE 控制台->工作负载
在 【工作负载】 页面通过 YAML 创建 Deployment,可使用以下示例 Deployment,其中所用的镜像同时在监听 IPv4 和 IPv6 协议栈的 80 端口:
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: <deployment-name>
5 labels:
6 app: nginx
7spec:
8 replicas: 2
9 minReadySeconds: 0
10 strategy:
11 type: RollingUpdate
12 rollingUpdate:
13 maxSurge: 25%
14 maxUnavailable: 25%
15 selector:
16 matchLabels:
17 app: nginx
18 template:
19 metadata:
20 labels:
21 app: nginx
22 spec:
23 restartPolicy: Always
24 containers:
25 - name: nginx
26 image: registry.baidubce.com/cce/nginx-alpine-go:ipv6
27 imagePullPolicy: Always
28 ports:
29 - containerPort: 80

查看 Pod IPv4/IPv6 地址:
1kubectl get pods <pod-name> -o go-template --template='{{range .status.podIPs}}{{printf "%s \n" .ip}}{{end}}'
1<pod-ipv4>
2<pod-ipv6>
访问 Pod 的 IPv4 地址:
1curl <pod-ipv4>
访问 Pod 的 IPv6 地址:
1curl -g [<pod-ipv6>]:80
注意 镜像 registry.baidubce.com/cce/nginx-alpine-go:latest 支持 IPv4/IPv6 双栈。
通过 IPv4 或 IPv6 访问 Service
在 IPv4/IPv6 双栈集群中,可以为 Service 分配 IPv4 地址或 IPv6 地址。
通过 Service 的 .spec.ipFamilies 属性指定 Service 的 IP 地址类型,其值为 IPv4 或 IPv6。
注意
- 在未指定
.spec.ipFamilies配置的情况下, Kubernetes 将使用 kube-controller-manager 中 --service-cluster-ip-range 参数的第一段 IP 地址为 Service 分配 IP 地址。因此为了避免混淆,我们建议在双栈集群中部署 Service 时始终配置.spec.ipFamilies属性。.spec.ipFamilies是一个可变更的字段:可以通过修改这个字段的值,来控制添加或删除service的辅助IP。 但不可以修改service的主IP。- 在使用 IPv6 版的 LoadBalancer Service 时,后端 Pod 无法从网络包中获取请求的原始 IP 地址。

创建 IPv4 单栈的 Service
导航路径:CCE 控制台->集群->服务
指定 spec.ipFamilies 为 IPv4,为 Service 分配 IPv4 地址:
1apiVersion: v1
2kind: Service
3metadata:
4 name: service-example-ipv4
5 annotations:
6 prometheus.io/scrape: "true"
7spec:
8 ipFamilies:
9 - IPv4
10 ipFamilyPolicy: SingleStack
11 selector:
12 app: nginx
13 type: LoadBalancer
14 externalTrafficPolicy: Cluster
15 sessionAffinity: None
16 ports:
17 - name: nginx
18 protocol: TCP
19 port: 80
20 targetPort: 80
查看 IPv4 Service 详情:
1# kubectl describe svc service-example-ipv4
2Name: service-example-ipv4
3Namespace: default
4Labels: <none>
5Annotations: prometheus.io/scrape: true
6 service.beta.kubernetes.io/cce-load-balancer-id: lb-bedc26c1
7Selector: app=nginx
8Type: LoadBalancer
9IP: 172.16.63.112
10LoadBalancer Ingress: 106.13.103.101
11Port: nginx 80/TCP
12TargetPort: 80/TCP
13NodePort: nginx 30009/TCP
14Endpoints: 172.17.0.12:80,172.17.0.13:80
15Session Affinity: None
16External Traffic Policy: Cluster
17Events:
18 Type Reason Age From Message
19 ---- ------ ---- ---- -------
20 Normal EnsuringLoadBalancer 6m56s service-controller Ensuring load balancer
21 Normal EnsuredLoadBalancer 6m37s service-controller Ensured load balancer
访问 IPv4 ClusterIP:
1# curl 172.16.63.112
2
3<!DOCTYPE html>
4<html>
5<head>
6<title>Welcome to nginx!</title>
7<style>
8 body {
9 width: 35em;
10 margin: 0 auto;
11 font-family: Tahoma, Verdana, Arial, sans-serif;
12 }
13</style>
14</head>
15<body>
16<h1>Welcome to nginx!</h1>
17<p>If you see this page, the nginx web server is successfully installed and
18working. Further configuration is required.</p>
19
20<p>For online documentation and support please refer to
21<a href="http://nginx.org/">nginx.org</a>.<br/>
22Commercial support is available at
23<a href="http://nginx.com/">nginx.com</a>.</p>
24
25<p><em>Thank you for using nginx.</em></p>
26</body>
27</html>
创建 IPv4/IPv6 双栈的 Service
导航路径:CCE 控制台->集群->服务
在 spec.ipFamilies 中同时指定 IPv6 和 IPv4,并将 ipFamilyPolicy 设置为 PreferDualStack,为 Service 分配 IPv6 地址:
1apiVersion: v1
2kind: Service
3metadata:
4 name: service-example-ipv6
5 annotations:
6 prometheus.io/scrape: "true"
7spec:
8 ipFamilyPolicy: PreferDualStack
9 ipFamilies:
10 - IPv6
11 - IPv4
12 selector:
13 app: nginx
14 type: LoadBalancer
15 externalTrafficPolicy: Cluster
16 sessionAffinity: None
17 ports:
18 - name: nginx
19 protocol: TCP
20 port: 80
21 targetPort: 80
查看 IPv6 Service 详情:
1# kubectl describe svc service-example-ipv6
2Name: service-example-ipv6
3Namespace: default
4Labels: <none>
5Annotations: prometheus.io/scrape: true
6 service.beta.kubernetes.io/cce-load-balancer-id: lb-da9b6673
7Selector: app=nginx
8Type: LoadBalancer
9IP: fdff:ffff:ffff:ffff:ffff:ffff:ffff:faa0
10LoadBalancer Ingress: 240c:4082:1:4202::8
11Port: nginx 80/TCP
12TargetPort: 80/TCP
13NodePort: nginx 30685/TCP
14Endpoints: [fc00::c]:80,[fc00::d]:80
15Session Affinity: None
16External Traffic Policy: Cluster
17Events:
18 Type Reason Age From Message
19 ---- ------ ---- ---- -------
20 Normal EnsuringLoadBalancer 4m8s service-controller Ensuring load balancer
21 Normal EnsuredLoadBalancer 3m56s service-controller Ensured load balancer
访问 IPv6 ClusterIP:
1# curl -g [fdff:ffff:ffff:ffff:ffff:ffff:ffff:faa0]:80
2
3<!DOCTYPE html>
4<html>
5<head>
6<title>Welcome to nginx!</title>
7<style>
8 body {
9 width: 35em;
10 margin: 0 auto;
11 font-family: Tahoma, Verdana, Arial, sans-serif;
12 }
13</style>
14</head>
15<body>
16<h1>Welcome to nginx!</h1>
17<p>If you see this page, the nginx web server is successfully installed and
18working. Further configuration is required.</p>
19
20<p>For online documentation and support please refer to
21<a href="http://nginx.org/">nginx.org</a>.<br/>
22Commercial support is available at
23<a href="http://nginx.com/">nginx.com</a>.</p>
24
25<p><em>Thank you for using nginx.</em></p>
26</body>
27</html>
公网通过 IPv6 地址访问 Service
IPv6 网关为 VPC 内的 IPv6 地址提供公网连通性。若从公网通过 IPv6 地址访问 Service 或是使用 IPv6 地址的容器访问公网,需要 VPC 配置 IPv6 网关及相关路由。
创建 IPv6 网关
注意: 创建 IPv6 网关会产生费用,请确保账号具备购买公网资源权限并保持余额充足。
导航路径:VPC 控制台->IPv6 网关
- 点击 【创建 IPv6 网关】。
- 在创建页面填写 网关名称,选择 所在网络,按需设置 公网带宽计费方式、带宽峰值 与 释放保护。
- 点击 【确定】 并完成订单确认。



添加 IPv6 网关路由
导航路径:VPC 控制台->路由表
- 在目标 VPC 实例页面进入 【路由表】 页签。
- 选择目标路由表并点击 【添加路由】。
- 配置 源网段 为 VPC 中的子网网段,目标网段 为
::/0,路由类型 选择 IPv6 公网网关,下一跳实例 选择已创建的 IPv6 网关。
注意: 若您的集群横跨一个 VPC 中的多个子网,需为每个子网网段创建路由条目。
访问上述 Service IPv6 EIP:
1curl -g [<service-ipv6-eip>]:80
参考文档
评价此篇文章
