0
点赞
收藏
分享

微信扫一扫

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群

1.概述

本文概要介绍下如何快速通过 kubeadm 部署一个 IPv4/IPv6 双栈集群,此处使用下列软件组合:

  • RHEL 7.9
  • Docker 20.10.17
  • kubernetes 1.22.11
  • ​​Antrea CNI 商业版 1.4.0​​​(对应开源版本为 ​​1.5.2​​)

网络拓扑如下,使用 Antrea No-encap 模式配合外部路由器实现 Pod 可路由(即外部可以直接通过 Pod IP 访问到 Pod,中间不会经过任何 NAT):

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_IPv4/IPv6


2.基础环境准备

RHEL 安装 docker-ce

yum install -y yum-utils
yum-config-manager \
--add-repo \
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

参考资料:​​https://download.docker.com/linux/centos/docker-ce.repo​​


在通过官方的方式安装 Docker 时,注意到下列错误:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_IPv4/IPv6_02

此错误可以在 docker-ce.repo 中添加下列行启用 centos-extras 库来解决:

vi /etc/yum.repos.d/docker-ce.repo
# 在前面添加下列行
[centos-extras]
name=Centos extras - $basearch
baseurl=http://mirror.centos.org/centos/7/extras/x86_64
enabled=1
gpgcheck=1
gpgkey=http://centos.org/keys/RPM-GPG-KEY-CentOS-7

为了快速拉取进行,进行下列 Docker 相关配置,设置 cgroup driver、镜像加速等配置:

vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"registry-mirrors": ["https://ajmumh9n.mirror.aliyuncs.com"]
}

重启服务,并设置开机启动:

systemctl enable docker
systemctl daemon-reload
systemctl restart docker

通过 ​​docker info​​​ 确认 Cgroup Driver 为 systemd

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_IPv4/IPv6_03

系统参数调整

配置下列参数:

#禁用swap
swapoff -a

vi /etc/fstab
#禁用防火墙

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

#调整内核参数
vi /etc/sysctl.conf
net.ipv6.conf.all.forwarding=1
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
net.bridge.bridge-nf-call-iptables = 1

安装 kubeadm

参考文档:​​https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3fac1b11bDQTZZ​​

运行下列命令,添加 Kubernetes 国内源:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

通过下列命令查看可以安装的版本号信息:

yum list kubeadm --showduplicates|sort -r

通过下列命令安装指定版本的 kubeadm、kubelet 和 kubectl

yum install -y --nogpgcheck kubelet-1.22.11-0 kubeadm-1.22.11-0 kubectl-1.22.11-0
systemctl enable kubelet && systemctl start kubelet


3.安装 Kubernetes Master 节点

参考链接:​​https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/dual-stack-support/​​

默认 Kubernetes 下每个 node 使用 /24 掩码为 Pod 分配 IPv4 地址,使用 /64 掩码为 Pod 分配 IPv6 地址。可以通过 Controller-manager 参数调整掩码大小,本文会将 IPv4 掩码调整为 /25,IPv6 掩码调整为 /80。

注意:(k8s 强制限制 node 掩码不能比 CIDR 掩码小 16 以上,因此当 IPv6 CIDR 使用 /64 得掩码时,node 掩码不能大于 /80)

创建下列 kubeadm-config.yaml 文件:

# cat kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
networking:
podSubnet: 10.39.0.0/16,2001::/64
serviceSubnet: 10.96.0.0/16,2002::/110
controllerManager:
extraArgs:
"node-cidr-mask-size-ipv4": "25"
"node-cidr-mask-size-ipv6": "80"
imageRepository: "registry.cn-hangzhou.aliyuncs.com/google_containers"
clusterName: "rhel-k8scluster"
kubernetesVersion: "v1.22.11"
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: "10.10.50.171"
bindPort: 6443
nodeRegistration:
kubeletExtraArgs:
node-ip: 10.10.50.171,2000::171

通过下列命令创建集群:

kubeadm init --cnotallow=kubeadm-config.yaml

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_容器双栈_04

4.将 Worker 加入 master

记录 master 输出的命令:

kubeadm join 10.10.50.171:6443 --token 6cv6ip.a5okwpm509t01hz5 \
--discovery-token-ca-cert-hash sha256:2bfcacdf73f0b2d0969c6906481b306e093d77405fa72431185ed6209c5070ca

创建下列 kubeadm-config.yaml,其中 token 和 caCertHashes 通过上述的 Master 输出获取:

apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
discovery:
bootstrapToken:
apiServerEndpoint: 10.10.50.171:6443
token: "6cv6ip.a5okwpm509t01hz5"
caCertHashes:
- "sha256:2bfcacdf73f0b2d0969c6906481b306e093d77405fa72431185ed6209c5070ca"
# change auth info above to match the actual token and CA certificate hash for your cluster
nodeRegistration:
kubeletExtraArgs:
node-ip: 10.10.50.172,2000::172

通过下列命令将节点加入 Master:

kubeadm join --cnotallow=kubeadm-config.yaml

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_容器双栈_05

依次添加剩余节点,之后所有节点会变为 NotReady 状态,这是正常现象,安装完 Antrea 后会变为 Ready 状态:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_IPv4/IPv6_06


5.安装 Antrea

从 github 下载下列 yaml 文件:

​​https://github.com/antrea-io/antrea/releases/download/v1.5.2/antrea.yml​​

修改 antrea.yml 文件:

# 第 4193 行,禁用 Overlay 封装模式以及 SNAT 模式
trafficEncapMode: noEncap
noSNAT: true

# 第 4237 行,为 Service 配置 IPv4 和 IPv6 地址段,需要和未来初始化 Kubernetes 集群时配置一致
serviceCIDR: 10.96.0.0/16
serviceCIDRv6: 2002::/110

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_VMware_07

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_Antrea_08

应用此文件到集群:

kubectl apply -f antrea.yml

检查相关 Pod 运行正常:

kubectl -n kube-system get po | grep antrea

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_Kubernetes_09

安装后查看主机路由表信息正确

会发现,每个 Kubernetes 节点都会有去往其他节点 Pod CIDR 的路由,指向相应 Worker 节点的接口 IP:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_Kubernetes_10

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_IPv4/IPv6_11

在外部设置静态路由使得 Pod 可路由

在 10.10.50.1(2001::1)网关设备上设置路由,使得外部网络访问 Pod CIDR 时能发给相应的 Worker 节点接口 IP(同时设置 IPv4 和 IPv6 路由):

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_Kubernetes_12

6.安装后测试

IPv6 访问测试

部署下列 Deployment 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: avi-demo
name: avi-demo
spec:
replicas: 2
selector:
matchLabels:
app: avi-demo
template:
metadata:
labels:
app: avi-demo
spec:
containers:
- name: avi-demo
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: http
protocol: TCP

Pod 地址信息:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_Kubernetes_13

Pod 间访问测试:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_VMware_14

集群内主机访问 Pod:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_Kubernetes_15

集群外主机访问 Pod(可以看到外部网络能直接访问到 Pod,中间未经过 NAT 转换):

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_IPv4/IPv6_16

网页访问也正常:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_VMware_17

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_IPv4/IPv6_18

通过外部设备 Traceroute Pod:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_VMware_19


双栈 Service 测试

参考文档:​​https://kubernetes.io/docs/concepts/services-networking/dual-stack/​​

Kubernetes Service 的 IPv4 family 支持下列选项,默认为 IPv4 SingleStack:

  • SingleStack
  • PreferDualStack
  • RequireDualStack

通过下列 yaml 文件来创建双栈 Service:

# service.yaml
apiVersion: v1
kind: Service
metadata:
name: avi-demo-v6
spec:
selector:
app: avi-demo
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
ipFamilyPolicy: RequireDualStack

创建完成后查看状态正常,Service 正确获取到双栈地址:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_IPv4/IPv6_20

集群内部访问测试:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_Antrea_21

集群外通过 Nodeport 访问服务:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_Antrea_22


Pod 间性能压测

TCP 测试:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_VMware_23

UDP 测试:

如何搭建一个 IPv4/IPv6 双栈 Kubernetes 集群_VMware_24

本文完

举报

相关推荐

0 条评论