K8S建立ipv6集群

前言

本文讲述使用kubernetes建立纯ipv6的集群,以及ipv6网络插件该如何设置。


实验环境

我所使用的平台是VMware,在其中创建了CentOS7的虚拟机,在上面进行实验部署。在创建虚拟机的时候需要支持ipv6网络,我所设置的网络模式为NAT模式,然后在虚拟网络编辑器里选择NAT设置,如下图所示:

然后选择启用IPv6,如下图所示:

之后启动虚拟机,使用ifconfig命令可以看到ipv6地址

然后在每台虚拟机上开启ipv6转发

sysctl -w net.ipv6.conf.all.forwarding=1

部署集群

首先在充当master节点的主机上建立一个kubeadm-config.yamlkubeadm配置文件,其中的ipv6地址需要改成你自己主机的ipv6地址

apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: "fd15:4ba5:5a2b:1008:4822:2bad:440e:88d7"
  bindPort: 6443
nodeRegistration:
  kubeletExtraArgs:
    node-ip: fd15:4ba5:5a2b:1008:4822:2bad:440e:88d7
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.23.5
networking:
  podSubnet: 2001:db8:42:0::/56
  serviceSubnet: 2001:db8:42:1::/112
etcd:
  local:
    extralArgs:
      listen-metrics-urls: http://[::]:2381

然后执行如下命令

kubeadm init --config=kubeadm-config.yaml

如上所示成功建立,然后按照提示输入以下命令

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

然后在node节点的主机上建立kubeadm-config.yaml文件用于加入集群,与master节点类似,下面的node-ip需要改成自己主机的ipv6地址,apiServerEndpoint中的ip地址改成master节点的ip地址,当然你集群的令牌和 CA 证书也同样需要进行替换

apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
discovery:
  bootstrapToken:
    apiServerEndpoint: "[fd15:4ba5:5a2b:1008:4822:2bad:440e:88d7]:6443"
    token: "2m4fao.4uk9pxx229kmwgw7"
    caCertHashes:
    - "sha256:c7c2ac85d0926fae96579a8253776b82e757c3cfe7dc21b4f5d7ea70623b53b7"
nodeRegistration:
  kubeletExtraArgs:
node-ip: fd15:4ba5:5a2b:1008:d943:cd23:f1b9:65c2

网络插件

接下来我们回到master节点,进行安装网络插件

"assign_ipv4": "true",
"assign_ipv6": "true"

,我所使用的是Calico,由于我们需要部署的是ipv6的网络,我们需要对其中的配置进行修改,所以我们不能直接使用网络上的直接apply,需要下载到本地进行修改,使用如下命令下载到本地:

curl https://docs.projectcalico.org/manifests/calico.yaml -O

下载完成后输入如下命令打开文件进行修改:

gedit calico.yaml

首先我们在ipam中加入如下内容:

"assign_ipv4": "true",
"assign_ipv6": "true"

接下来把文件往下拖,在很后面接近底部的地方,有个Disable  on Kubernetes的注释,把其中的FELIX_IPV6SUPPORT的value改为true,然后加入以下内容:

- name: IP6
value: "autodetect"
- name: CALICO_IPV6POOL_CIDR
value: 2001:db8:42:0::/56

保存后,在终端中输入如下命令:

kubectl apply -f calico.yaml


验证 

我们输入以下命令,发现全部处于running状态 

kubectl get pods --all-namespaces

输入如下命令,发现节点都处于ready状态,表示成功

kubectl get nodes

然后我们输入以下命令查看master节点和node节点的ip地址以及pod地址范围

kubectl get nodes master -o go-template --template='{{range .spec.podCIDRs}}{{printf "%s\n" .}}{{end}}'
kubectl get nodes node1 -o go-template --template='{{range .spec.podCIDRs}}{{printf "%s\n" .}}{{end}}'
kubectl get nodes master -o go-template --template='{{range .status.addresses}}{{printf "%s: %s \n" .type .address}}{{end}}'
kubectl get nodes node1 -o go-template --template='{{range .status.addresses}}{{printf "%s: %s \n" .type .address}}{{end}}'

如下图所示,均符合预期结果,表示我们建立ipv6集群成功


总结 

我对本次实验的研究可以说是进行了很久很久,中间遇到过无数次错误,网上相关方面的资料又少之又少,不过最后还是成功的建立出来了,也让我对于k8s的各种知识有了更深层次的了解,在接下来的学习中,我会再接再厉继续前行。