如何用最小的代价修改K8S集群的IP

时间:2023-02-03 18:02:00

作者:李毓

因为工作原因,经常需要修改部署好的K8S集群IP。我们先用常规方法思考如何修改K8S集群的IP。

一、修改Kubernetes集群的IP地址需要重新部署集群。因为Kubernetes集群是一个分布式系统,所以修改一个节点的IP地址可能导致整个集群瘫痪。 要重新部署Kubernetes集群,请执行以下步骤: 1.备份集群的配置和数据。 2.删除集群中的所有节点。 3.使用新的IP地址重新配置每个节点。 4.使用新的配置重新启动Kubernetes集群。 注意:修改IP地址会导致所有从集群中删除的节点上的已部署的应用程序和数据丢失。请确保在修改IP地址之前备份所有重要数据。

由上可以知道,如果用常规方法去修改k8s集群的IP,代价是非常大的,如果是生产环境,造成的影响是无法预估的。

那么是否有一种方法可以代价更小的去修改集群IP呢?

我们可以用运维的角度来思考这个问题。因为网卡是可以配置多个IP的,那么能否在不改变原有网卡IP的情况下,使得用户无感知的认为集群IP已经被替换了呢? 答案是可以的。

以ubuntu为例,首先把新IP添加进master主机的网卡。这里172.23.2.6为新添加的IP。

(base) root@offline-deploy:~# cat /etc/netplan/01-netcfg.yaml 
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp2s0:
      dhcp4: no
      addresses: [192.168.1.67/22,172.23.2.6/22]
      gateway4: 192.168.1.1
      nameservers:
          addresses: [114.114.114.114, 8.8.8.8]

然后执行netplan apply 更改生效

之后执行脚本

#!/bin/bash
old_ip=192.168.1.67:443
new_ip=172.23.2.6:443
ca_dir="/etc/kubernetes/ssl"

mkdir -pv /tmp/cm

for cm_name in `kubectl get cm | grep -v NAME | awk '{print$1}'`;do echo ${cm_name};kubectl get configmaps ${cm_name} -o yaml > /tmp/cm/${cm_name}.yaml;done

echo "更换configmap的ip"

sed -i "s/"$old_ip"/"$new_ip"/g" `grep -rl "$old_ip" /tmp/cm`

echo "应用新的configmap"

kubectl apply -f /tmp/cm/./

echo "删除default命名空间下的所有pod从而使得配置生效"

kubectl delete --all pods

这是一个最原始的脚本,原脚本还涉及到https证书IP修改和数据库IP修改。防止泄露,就没有把原脚本贴出来,但是思路是一样的,可以根据不同的公司需要去编写相应的脚本。

其实还有第三种方法,甚至连IP都不用修改。在服务器前面再加一台路由器做端口映射,路由器里面是新的IP。这样最简单省事,不过要花钱采购硬件。可以根据个人选择用哪种方法。