集群IP变更操作说明
使用方法
在集群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
更新trident二进制和change-ip.sh。
通过trident version查看trident版本,分以下情况讨论:
=1.12.0,请将master0的/usr/bin/trident更新为1.12.0。点击下载
替换 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"
}
使用 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的标志,不应该变化,且多个节点不能有重合。