集群IP变更操作说明

更新时间: 2023-10-12 19:31:30

使用方法

  1. 在集群IP发生变更之前,也就是在家里发布软件版本时,需准备好etcd的快照,使用如下命令:

mv /home/snapshot.db /home/snapshot.db-`date +%s`
/usr/local/bin/etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /home/snapshot.db

若没有提前备份,可以使用Trident自带周期性的etcd备份工具,找到最新到的etcd快照,保存至对应目录。

cp /backup/etcd/snapshots/snapshot-latest.db /home/snapshot.db
  1. 更新trident二进制和change-ip.sh。

通过trident version查看trident版本,分以下情况讨论:

  1. =1.12.0,请将master0的/usr/bin/trident更新为1.12.0。点击下载

  2. 替换 workspace/ecp/kube-current/shell/change-ip.sh 中 change_ip_master 函数。

change_ip_master() {
  perl -pe "s#${old_ip}\s+apiserver.cluster.local#${new_ip} apiserver.cluster.local#g" -i /etc/hosts
  perl -pe "s#KUBELET_CONFIG_ARGS=--node-ip=${old_ip}#KUBELET_CONFIG_ARGS=--node-ip=${new_ip}#g" -i /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

  OLD_IFS=$IFS
  IFS="!"

  for rs_pair in ${rs_replace_pairs}; do
    old_rs=${rs_pair%%,*}
    new_rs=${rs_pair##*,}
    perl -pe "s#${old_rs}:2379#${new_rs}:2379#g" -i /etc/kubernetes/manifests/kube-apiserver.yaml
    perl -pe "s#${old_rs}:6443#${new_rs}:6443#g" -i /etc/kubernetes/manifests/kube-apiserver.yaml
    perl -pe "s#--advertise-address=${old_rs}#--advertise-address=${new_rs}#g" -i /etc/kubernetes/manifests/kube-apiserver.yaml
    perl -pe "s#host: ${old_rs}#host: ${new_rs}#g" -i /etc/kubernetes/manifests/kube-apiserver.yaml
  done

  for rs_pair in ${rs_replace_pairs}; do
    old_rs=${rs_pair%%,*}
    new_rs=${rs_pair##*,}
    perl -pe "s#${old_rs}:2379#${new_rs}:2379#g" -i /etc/kubernetes/manifests/etcd.yaml
    perl -pe "s#${old_rs}:2380#${new_rs}:2380#g" -i /etc/kubernetes/manifests/etcd.yaml
  done

  for rs_pair in ${rs_replace_pairs}; do
    old_rs=${rs_pair%%,*}
    new_rs=${rs_pair##*,}
    perl -pe "s#${old_rs}:2379#${new_rs}:2379#g" -i /root/.bashrc
  done

  #      TODO: update reg.docker.alibaba-inc.com IP
  #    for rs_pair in ${rs_replace_pairs};do
  #        old_rs=${rs_pair%%,*}
  #        new_rs=${rs_pair##*,}
  #        sed -i "s#${old_rs}#${new_rs}#g"  /etc/hosts
  #    done

  mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
  mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
  mv /etc/kubernetes/manifests/etcd.yaml /tmp/
  mv /tmp/etcd.yaml /etc/kubernetes/manifests/
  echo "change ip for master done"
}
  1. 使用 trident change-ip 命令恢复集群。

trident change-ip --origin-file origin-file.yaml --new-file new-file.yaml

origin-file.yaml 样例。

apiVersion: oecp.io/v1
kind: Cluster
metadata:
  name: myk8s
  labels:
    trident: v1
spec:
  ssh:
    user: root
    passwd: "xxxx"
  network:
    cniName: calico
    svcCIDR: 10.96.0.0/16
    podCIDR: 100.64.0.0/16
    dnsDomain: cluster.local
  apiServerVIP: 10.103.97.2
  masters:
    ipList:
    - 192.168.0.206
    - 192.168.0.207
    - 192.168.0.208
  nodes:
    ipList:
    - 192.168.0.209
    - 192.168.0.210
    - 192.168.0.211
  addons:
  - name: l-zero
  - name: l-zero-library

new-file.yaml只需将ipList改为对应节点变更后的IP,注意对应关系,new-file ipList 需要按照顺序一一对应origin-file的节点

几个注意事项:

  • 我们目前依赖于通过默认路由的机制,来找到k8s、网络插件使用的网卡,所以这里的限制是,需要确保更改前后的ip,都绑定在默认网卡上(即默认路由指向的网卡)

  • 客户侧的MTU可能和家里开发环境不一致,需要注意

  • 节点的Hostname作为Node的标志,不应该变化,且多个节点不能有重合。

阿里云首页 云原生应用交付平台 相关技术圈