CCE 支持 IPv4 和 IPv6 双栈网络
CCE 支持 IPv4 和 IPv6 双栈网络
互联网协议第六版(IPv6)是互联网升级演进的必然趋势、网络技术创新的重要方向、网络强国建设的基础支撑。CCE 目前支持 IPv4/IPv6 双栈集群,包括如下特点:
11. Node 同时支持 IPv4 和 IPv6 地址,集群内部支持使用两种类型地址通信;
22. Pod 双栈同时支持 IPv4 和 IPv6 地址,并支持两种类型 IP 访问;
33. 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,并开启『分配IPv6网段』。

创建子网
在 VPC 中创建子网,并开启『分配IPv6网段』。

新建 IPv4/IPv6 双栈 K8S 集群
进入 CCE 控制台,创建双栈集群,如下所示:
- 在『基础配置』页面
选择开启『IPv6双栈网络』,并选择一个支持 IPv6 的 VPC 和其子网。 

- 在『网络配置』页面
系统会自动推荐合适的 IPv4/IPv6 ClusterIP 网段并显示在下方。 IPv6网段支持用户手动指定符合RFC 4193定义的唯一本地地址(Unique Local Addresses,ULA),地址范围是
fd00::/8的子集。 

- 后续按提示进行,完成集群的创建。
 
通过 IPv4 和 IPv6 访问 Pod
在 IPv4/IPv6 双栈集群中,可以为 Pod 同时分配 IPv4 地址和 IPv6 地址。
注意:后端 Pod 也需要监听 IPv6 协议栈下端口,否则会出现 Pod 被分配了 IPv6 地址但是连接被拒绝的情况
通过 CCE 控制台的『工作负载』页面,创建示例 Deployment,可以使用以下示例 Deployment,其中所用的镜像同时在监听 IPv4 和 IPv6 协议栈的 80 端口:
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: deployment-example-ipv6
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 地址:
1# kubectl get pods deployment-example-64445974b7-8s6zc  -o go-template --template='{{range .status.podIPs}}{{printf "%s \n" .ip}}{{end}}'
2172.17.0.12
3fc00::c
            访问 Pod 的 IPv4 地址:
1# curl 172.17.0.12
            访问 Pod 的 IPv6 地址:
1# curl -g [fc00::c]: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
指定 spec.ipFamily: 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
指定 spec.ipFamily: IPv6 为 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 网关
在 VPC 控制台的 『IPv6网关』标签页,点击『创建IPv6网关』

填写网关信息,其中『所在网络』选择集群所在的 VPC。

添加 IPv6 网关路由
在 VPC 控制台的 VPC 实例页面中,点击『路由表』标签页,可以选择创建新路由表或者使用default 路由表。

选择需要配置的路由表进入,点击『添加路由』,填写路由表条目配置信息,其中『源网段』是 VPC 中的子网网段,目标网段为『::/0』,路由类型为『IPv6公网网关』,『下一跳实例』为上一步创建的网关。
注意 若您的集群横跨一个 VPC 中的多个子网,您需要为每个子网网段创建路由条目。

访问上述 Service IPv6 EIP:
1# curl -g [240c:4082:1:4202::8]:80
            