目前环境是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

查看原文