目前环境是k8s 1.20.11 使用flannel作为cni插件
calico可以参考https://club.kdcloud.com/article/253621747767767552
一 首先需要修改配置文件参数
1.controller 需要修改
--cluster-cidr=10.1.0.0/16 \
2.kube-proxy需要修改
clusterCIDR: 10.1.0.0/16
3.然后重启controller以及kube-proxy
systemctl daemon-reload && systemctl restart kube-controller-manager.service kube-proxy.service
4.然后需要修改的就是flannel的configmap里面的pod cidr了
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.1.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
这里需要修改Network 然后重启所有flanneld 这里估计大概率起不来 不要担心
kubectl get pod -n kube-system | grep flann | awk '{print $1}' | xargs kubectl delete pod -n kube-system
二 修改node的cidr
这里我们需要删除node节点并且通过yaml的方式添加因为我们需要修改pod的cidr
精简以后的node yaml为
apiVersion: v1
kind: Node
metadata:
labels:
beta.kubernetes.io/arch: amd64
beta.kubernetes.io/os: linux
k8s_cluster: alibj-dingdd-online-01
kubernetes.io/arch: amd64
kubernetes.io/hostname: HOSTNAME
kubernetes.io/os: linux
name: HOSTNAME
spec:
podCIDR: clusterCIDR/24
podCIDRs:
- clusterCIDR/24
这里需要注意每一个node的yaml会包含vni 这个不能复制之前的我们要删除 他会重新创建
批量替换脚本为
#!/bin/bash
hostname=$1
ip=$2
podcidr=$(kubectl get node ${hostname} -o yaml | grep -iw podCIDR | grep -v 'f:' | awk '{print $2}' | sed 's/7/1/g'| awk -F/ '{print $1}')
cp n-1 ${hostname}
sed -i "s/IP/${ip}/g" ${hostname}
sed -i "s/HOSTNAME/${hostname}/g" ${hostname}
sed -i "s/clusterCIDR/${podcidr}/g" ${hostname}
kubectl delete node ${hostname}
kubectl apply -f ${hostname}
#我们还需要在对应的节点执行
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
systemctl restart kubelet docker
我们全部重新替换完成node以后通过route -n 以及ifconfig 看一下flanneld的网卡以及路由 会发生变化
然后如果pod还有问题 那么就查看controller日志
如果日志如下 因为部分原因日志不方便放出来,类似于下面的日志这种的 会出现nodeipam或者网段问题的现象
大概率是因为我们更换的node节点中有部分节点ip没换对 我们需要看一下
kubectl get node -o yaml | grep -i cidr | grep -v 'apiVersion' | grep -v 'f:' | grep -v 'podCIDRs'
或者通过etcdctl查看
get /registry/minions/nodename
通过etcd的这个key来看
然后我们批量删除pod 重新启动 podip就会变成我们新规划的pod cidr了
三 修改svc的cidr
1.证书添加
修改svc的cidr我们首先考虑到的就是需要在证书里面添加coredns的可信任ip
修改完毕后重启所有组件
2.修改配置
apiserver
--service-cluster-ip-range=10.2.0.0/16 \
kube-controller
--service-cluster-ip-range=10.2.0.0/16 \
kubelet
clusterDNS:
- 10.2.0.2
修改完毕后重启服务
这里分为两种情况
(1)如果我们从24位掩码更换为16 那么这里不需要做操作
(2)如果我们换了ip地址段
我们需要重新创建svc
kubectl get svc --all-namespaces | grep -v -w kubernetes| awk '$4 !~ /None|CLUSTER/{print "kubectl get svc -n "$1" " $2 " -o yaml && echo ---"}' | bash | sed 's/10.8/10.2/' > all.yaml
kubectl get svc --all-namespaces | awk '$4 !~ /None|CLUSTER/{print "kubectl delete svc -n "$1" " $2}' | bash
kubectl apply -f all.yaml