更换service和pod网段
1 介绍及前提
在内网环境里,由于网络规划的原因通常会遇到需要更换Kubernetes内部的ip网段。此文档是针对于已经存在的Kubernetes来进行网段更换的操作。操作期间会短时间内中断向外提供的服务;需提前发布停机通告。
Kubernetes内部的ip网段也分为两类,一个是service的ip地址段,也称为ClusterIP(service的ip强烈不建议修改,虽然此文档提供了修改教程,但是手动修改的地方很多,操作不当会引起集群无法使用,而且发布此文档时并没有在所有的版本上进行过测试)。还有一类是pod的ip地址段,也称为cidr,由网络插件来分配和管理,用于pod和pod之间的通信。
测试环境参考:
操作系统/内核版本 | Calico版本 | K8S版本(kubeadm安装) | 容器版本 |
centos7.9/3.10+ | 3.17.1 | v1.19.4 | docker 19 .03 |
注意:以下操作使用的用户均为root;不是root用户的自行识别添加sudo,并且所有的操作均在k8s-master节点。
2 更换pod网段
1. 获取calico的ip池并导出到yaml文件。
# kubectl get ippool
# kubectl get ippool -o yaml > k8s-ippool.yaml
2. cidr修改为想要修改的网段。
推荐修改为B类地址,也就是16位子网掩码(C类也可,但不推荐,会影响后期pod数量扩展)。
# vi k8s-ippool.yaml
3. 删除旧的ippool。
# kubectl delete ippool default-ipv4-ippool
4. 创建新的ippool。
kubectl apply -f k8s-ippool.yaml
5. 查看验证。
# kubectl get ippool -o yaml | grep cidr
6. 重建全部pod。
# kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(\S+)\s+(\S+).*/kubectl --namespace \1 delete pod \2/e'
#这步操作是将拥有"旧ip地址"的容器进行重建,然后会获得"新ip地址"
7. 第6步操作全部操作完成之后,查看一下是否全部pod-ip更换为新的地址。
3 更换service网段
1. 获取当前所有service的yaml。
# 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 '/clusterIP: 10/d' > ~/all_svc.yaml
#上面命令有局限性,针对于10.开头的service-ip段,如果不是,需要自行再修改下。
2. 修改apiserver配置参数。
# vi /etc/kubernetes/manifests/kube-apiserver.yaml
推荐修改为B类地址,也就是16位子网掩码(C类也可,但不推荐,会影响后期pod数量扩展)。
3. 修改controller-manager配置参数。
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
推荐修改为B类地址,也就是16位子网掩码(C类也可,但不推荐,会影响后期pod数量扩展)。
4. 删除所有存在的service。
kubectl get svc --all-namespaces | awk '$4 !~ /None|CLUSTER/{print "kubectl delete svc -n "$1" " $2}' | bash
5. 将刚才获取的yaml,apply生成新的service。
kubectl apply -f ~/all_svc.yaml
注意:如果出现如下报错,重启所有的master和node节点,这是新的虚拟网桥没有建立起来的报错
Error from server (InternalError): error when creating "/root/all_svc.yaml": Internal error occurred: failed to allocate a serviceIP: the provided range does not match the current range
6. 查看创建的svc的地址段是否是新地址。
# kubectl get svc --all-namespaces
7. 重新生成apiserver 的证书,因为内部组件和apiserver通信用的是内部cluster-ip地址,重建之后,cluster-ip会变化
# kubectl get svc --all-namespaces | grep kubernetes
# vi /etc/kubernetes/kubeadm-config.yaml
#移除旧的crt和key文件(必须移除它们才能颁发新证书):
# mv /etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/apiserver.crt.bak
# mv /etc/kubernetes/pki/apiserver.key /etc/kubernetes/pki/apiserver.key.bak
#重新颁发API服务器的证书:
# kubeadm init phase \
certs apiserver --config=/etc/kubernetes/kubeadm-config.yaml
# ls /etc/kubernetes/pki/apiserver.*
然后将上面所生成的新的/etc/kubernetes/pki/apiserver.crt和/etc/kubernetes/pki/apiserver.key分发至其他的所有master节点上的/etc/kubernetes/pki/ 目录下
8. 此时,DNS停止解析群集中的域名。发生这种情况是因为现有的Pod /etc/resolv.conf仍然具有旧的CoreDNS(kube-dns)地址,而kube-proxy已经使用新的子网而不是旧的子网更改了iptables的规则。
#查看dns服务的service-ip地址
# kubectl get svc --all-namespaces | grep dns
# kubectl -n kube-system get cm | grep kubelet
kubelet-config-1.19 1 110m
# kubectl -n kube-system edit cm kubelet-config-1.19
#用新的地址替换掉;修改clusterDNS,修改后保存退出(和vim用法一样)
9. 由于kube-dns地址已更改,因此需要在所有节点上更新kubelet配置:
# kubeadm upgrade node phase kubelet-config && systemctl restart kubelet
10. 重启全部pod。
# kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(\S+)\s+(\S+).*/kubectl --namespace \1 delete pod \2/e'
进行到这里更换k8s集群service- IP段就完成了,最后测试下服务访问是否正常。
更换service和pod网段
本文2024-09-23 01:11:00发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144303.html