CCE 支持 IPv4 和 IPv6 双栈网络
CCE 支持 IPv4 和 IPv6 双栈网络
互联网协议第六版(IPv6)是互联网升级演进的必然趋势、网络技术创新的重要方向、网络强国建设的基础支撑。CCE 目前支持 IPv4/IPv6 双栈集群,包括如下特点:
1. Node 同时支持 IPv4 和 IPv6 地址,集群内部支持使用两种类型地址通信;
2. Pod 双栈同时支持 IPv4 和 IPv6 地址,并支持两种类型 IP 访问;
3. 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 端口:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example-ipv6
labels:
app: nginx
spec:
replicas: 2
minReadySeconds: 0
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: hub.baidubce.com/cce/nginx-alpine-go:ipv6
imagePullPolicy: Always
ports:
- containerPort: 80
查看 Pod IPv4/IPv6 地址:
# kubectl get pods deployment-example-64445974b7-8s6zc -o go-template --template='{{range .status.podIPs}}{{printf "%s \n" .ip}}{{end}}'
172.17.0.12
fc00::c
访问 Pod 的 IPv4 地址:
# curl 172.17.0.12
访问 Pod 的 IPv6 地址:
# curl -g [fc00::c]:80
注意 镜像 hub.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 地址:
apiVersion: v1
kind: Service
metadata:
name: service-example-ipv4
annotations:
prometheus.io/scrape: "true"
spec:
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
selector:
app: nginx
type: LoadBalancer
externalTrafficPolicy: Cluster
sessionAffinity: None
ports:
- name: nginx
protocol: TCP
port: 80
targetPort: 80
查看 IPv4 Service 详情:
# kubectl describe svc service-example-ipv4
Name: service-example-ipv4
Namespace: default
Labels: <none>
Annotations: prometheus.io/scrape: true
service.beta.kubernetes.io/cce-load-balancer-id: lb-bedc26c1
Selector: app=nginx
Type: LoadBalancer
IP: 172.16.63.112
LoadBalancer Ingress: 106.13.103.101
Port: nginx 80/TCP
TargetPort: 80/TCP
NodePort: nginx 30009/TCP
Endpoints: 172.17.0.12:80,172.17.0.13:80
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EnsuringLoadBalancer 6m56s service-controller Ensuring load balancer
Normal EnsuredLoadBalancer 6m37s service-controller Ensured load balancer
访问 IPv4 ClusterIP:
# curl 172.16.63.112
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
创建 IPv4/IPv6双栈 的 Service
指定 spec.ipFamily: IPv6 为 Service 分配 IPv6 地址:
apiVersion: v1
kind: Service
metadata:
name: service-example-ipv6
annotations:
prometheus.io/scrape: "true"
spec:
ipFamilyPolicy: PreferDualStack
ipFamilies:
- IPv6
- IPv4
selector:
app: nginx
type: LoadBalancer
externalTrafficPolicy: Cluster
sessionAffinity: None
ports:
- name: nginx
protocol: TCP
port: 80
targetPort: 80
查看 IPv6 Service 详情:
# kubectl describe svc service-example-ipv6
Name: service-example-ipv6
Namespace: default
Labels: <none>
Annotations: prometheus.io/scrape: true
service.beta.kubernetes.io/cce-load-balancer-id: lb-da9b6673
Selector: app=nginx
Type: LoadBalancer
IP: fdff:ffff:ffff:ffff:ffff:ffff:ffff:faa0
LoadBalancer Ingress: 240c:4082:1:4202::8
Port: nginx 80/TCP
TargetPort: 80/TCP
NodePort: nginx 30685/TCP
Endpoints: [fc00::c]:80,[fc00::d]:80
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EnsuringLoadBalancer 4m8s service-controller Ensuring load balancer
Normal EnsuredLoadBalancer 3m56s service-controller Ensured load balancer
访问 IPv6 ClusterIP:
# curl -g [fdff:ffff:ffff:ffff:ffff:ffff:ffff:faa0]:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
公网通过 IPv6 地址访问 Service
IPv6 网关为 VPC 内的 IPv6 地址提供公网连通性。若从公网通过 IPv6 地址访问 Service 或是使用 IPv6 地址的容器访问公网,需要 VPC 配置 IPv6 网关及相关路由。
创建 IPv6 网关
在 VPC 控制台的 『IPv6网关』标签页,点击『创建网关』
填写网关信息,其中『所在网络』选择集群所在的 VPC。
添加 IPv6 网关路由
在 VPC 控制台的 VPC 实例页面中,点击『路由表』标签页,点击『添加路由』。
填写路由表条目配置信息,其中『源网段』是 VPC 中的子网网段,目标网段为『::/0』,路由类型为『IPv6公网网关』,『下一跳实例』为上一步创建的网关。
注意 若您的集群横跨一个 VPC 中的多个子网,您需要为每个子网网段创建路由条目。
访问上述 Service IPv6 EIP:
# curl -g [240c:4082:1:4202::8]:80