更换service和pod网段

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

更换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.1v1.19.4docker 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网段

1 介绍及前提在内网环境里,由于网络规划的原因通常会遇到需要更换Kubernetes内部的ip网段。此文档是针对于已经存在的Kubernetes来进行网...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息