• kubernetes集群如何更改所有节点IP


    情景描述

    我有三台服务器,想要将其组成了一个kubernetes集群,在部署之前,我就对其进行了固定IP的操作,然后成功的部署好了kubernetes集群,并且在上面部署了我需要的很多应用;
    过一段时间后,我需要对这三台服务器的网络进行更改,也就是这三台服务器所在的网络的的网段要更改,那么这几台服务的IP肯定也要更改,直接更改的话,肯定会导致这个kubernetes集群不可用了,那么该如何解决这个问题呢?

    假设我原来的网段是192.168.0.0/24,现在需要更改为10.98.99.0/24网段

    现在的IP更改后的IP
    master192.168.0.4110.98.99.140
    node1192.168.0.4210.98.99.141
    node2192.168.0.4310.98.99.142

    更换IP前的准备工作

    经多次测试后发现,pv中的IP地址无法直接更改,IP字段属于不可更改的资源,为了使数据完整,那么必须要将pv删除重构,在pv中指定新的IP;如果需要重构pv,那么涉及的deployment也需要先删除(我这里的pv是删除后依然保留数据的那种模式)

    1.截图保留每个pod是工作在哪个节点上的,方便后续恢复(可不做)
    2.停掉所有人为创建的服务资源,包括所有服务的deployment、svc、ingress、pvc、pv以及ingress和flannel资源(configmap、secret资源可不删除)

    kubectl delete -f XX.yaml
    

    删除完所有的pod后,kubernetes集群应该只剩下以下几个资源(可参考下图)
    在这里插入图片描述
    3.更换IP地址

    更换IP后的工作–master

    1.备份要更改的文件,在更改每个配置文件前,最好先备份

    cp /etc/hosts{,.bak}
    cp -r /etc/kubernetes{,.bak}
    cp -r ~/.kube{,.bak}
    

    2.更改/etc/hosts文件,将master跟node指向新的IP地址
    3.更改/etc/kubernetes中master的IP

    cd /etc/kubernetes
    oldip=192.168.0.41
    newip=10.98.99.140
    #查看之前的IP
    find . -type f | xargs grep $oldip
    #更改为新的IP
    find . -type f | xargs sed -i "s/$oldip/$newip/"
    #查看新的IP
    find . -type f | xargs grep $newip
    

    4.更新/etc/kubernetes/pki涉及到旧IP的证书(不同证书涉及到旧IP证书不会完全相同,需要实际查看)

    cd /etc/kubernetes/pki
    #使用OpenSSL查看证书的详细信息,里面会涉及到IP,然后保存为同名的txt文件
    for f in $(find -name "*.crt"); do   openssl x509 -in $f -text -noout > $f.txt; done
    #查看/etc/kubernetes/pki目录下包括旧IP的证书(这里很重要),后续删除证书就是删除这里过滤出来的证书
    grep -Rl $oldip .
    #过滤出来的内容为: ./etcd/peer.crt.txt  ./etcd/server.crt.txt   ./apiserver.crt.txt
    #删除txt文件
    for f in $(find -name "*.crt"); do rm $f.txt; done
    #删除过滤出来的包含旧IP的证书并且重新生成
    rm apiserver.crt apiserver.key etcd/peer.key etcd/peer.crt etcd/server.crt etcd/server.key
    kubeadm init phase certs apiserver
    kubeadm init phase certs etcd-peer
    kubeadm init phase certs etcd-server
    

    5.重新生成kubeconfig文件,将原来配置文件中涉及到新增的地方添加过来(主要是/etc/kubernetes.bak/manifests/kube-apiserver.yaml)

    cd /etc/kubernetes
    rm -f admin.conf kubelet.conf controller-manager.conf scheduler.conf
    kubeadm init phase kubeconfig all
    #覆盖默认的配置文件
    cp /etc/kubernetes/admin.conf $HOME/.kube/config
    #此时kubectl命令已经可以使用了,刚刚更换IP的时候kubectl命令不可用
    

    6.修改configmap里面涉及到旧IP的为新IP

    kubectl edit cm kube-proxy -n kube-system
    kubectl edit cm cluster-info -n kube-public
    

    7.重启docker和kubelet

    systemctl daemon-reload
    systemctl restart docker
    systemctl restart kubelet
    

    8.删除node
    因为node节点更改IP后涉及到证书问题,比较麻烦,所以我这里直接将node节点先delete,然后重新加入,那么证书也会重新从master节点签发过去,比较简单

    kubectl delete node node1
    kubectl delete node node2
    

    更换IP后的工作–node节点

    1.备份要更改的文件,在更改每个配置文件前,最好先备份

    cp /etc/hosts{,.bak}
    cp -r /etc/kubernetes{,.bak}
    cp -r /var/lib/kubelet{,.bak}
    

    2.更改/etc/hosts文件,将master跟node指向新的IP地址
    3.重置kubernetes配置

    kubeadm reset -f
    

    4.重启服务器

    reboot
    

    5.重新加入master节点所在的kubernetes集群(因为node节点的证书问题处理起来有点麻烦,所以直接重新加入简单点)

    #先在master节点生成加入口令
    kubeadm token create --print-join-command
    #在node节点上执行kuberadm join命令
    kubeadm join 10.98.99.140:6443 --token ne2dbu.74etnc2273wx6ysg --discovery-token-ca-cert-hash sha256:bd373617bc307f5192cb38ab0d0ccd261d95d6aa4c64a97d4c1acf1f7ffa02cd 
    

    重新部署之前那些服务

    1.先重启master服务器,再部署服务

    reboot
    

    2.在重新部署服务之前,需要先部署ingress以及flannel,待这两个没问题了再apply服务
    3.需要先重新部署一个默认的storageclass,部署storageclass
    4.重新apply服务,顺序为pv–pvc–deployment–svc–ingress,记得,部署每个服务前都需要修改pv.yaml中的IP地址

    cd /k8s
    oldip=192.168.0.41
    newip=10.98.99.140
    #查看之前的IP
    find . -type f | xargs grep $oldip
    #更改为新的IP
    find . -type f | xargs sed -i "s/$oldip/$newip/"
    #查看新的IP
    find . -type f | xargs grep $newip
    

    参考链接:https://cloud.tencent.com/developer/article/2008321?pos=comment

  • 相关阅读:
    需求工程方法的学习
    【云原生】-Docker安装部署分布式数据库 OceanBase
    信息系统项目管理师---第八章 项目质量管理
    React Hooks概述及常用的React Hooks介绍
    Selenium Web自动化测试 —— 高级控件交互方法!
    【字符编码系列一】ASCII编码是什么?
    postgresql简单导出数据与手动本地恢复(小型数据库)
    网络协议学习:第一天
    MySQL - 利用存储过程生成数据
    【LeetCode】136. 只出现一次的数字
  • 原文地址:https://blog.csdn.net/weixin_43880061/article/details/140265391