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):
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 时,注意到下列错误:
此错误可以在 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
系统参数调整
配置下列参数:
#禁用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
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
依次添加剩余节点,之后所有节点会变为 NotReady 状态,这是正常现象,安装完 Antrea 后会变为 Ready 状态:
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
应用此文件到集群:
kubectl apply -f antrea.yml
检查相关 Pod 运行正常:
kubectl -n kube-system get po | grep antrea
安装后查看主机路由表信息正确
会发现,每个 Kubernetes 节点都会有去往其他节点 Pod CIDR 的路由,指向相应 Worker 节点的接口 IP:
在外部设置静态路由使得 Pod 可路由
在 10.10.50.1(2001::1)网关设备上设置路由,使得外部网络访问 Pod CIDR 时能发给相应的 Worker 节点接口 IP(同时设置 IPv4 和 IPv6 路由):
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 地址信息:
Pod 间访问测试:
集群内主机访问 Pod:
集群外主机访问 Pod(可以看到外部网络能直接访问到 Pod,中间未经过 NAT 转换):
网页访问也正常:
通过外部设备 Traceroute Pod:
双栈 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 正确获取到双栈地址:
集群内部访问测试:
集群外通过 Nodeport 访问服务:
Pod 间性能压测
TCP 测试:
UDP 测试:
本文完