我在AWS EC2实例上以kops部署了一个开发K8S集群,我最初将其部署为具有3个主节点和3个节点的HA体系结构。
现在为了节省成本,我想关闭3个主机中的2个,仅保留1个运行中
我尝试使用kubectl drain
,但是它无效,只是终止节点导致群集连接不稳定。
是否有安全的方法来删除母版?
此问题已经在Github question - HA to single master migration上进行了讨论。
已经为您准备好solution。
由于在kops 1.12中引入了etcd-manager,并且main
和events
etcd群集自动且定期地备份到S3(与KOPS_STATE_STORE
相同的存储桶)。
因此,如果您的k8s集群版本高于1.12,则可能需要执行以下步骤:
$ kops edit cluster
在etcdCluster
部分中,删除etcdMembers
项目,以便仅保留instanceGroup
和main
的一个events
。例如
etcdClusters:
- etcdMembers:
- instanceGroup: master-ap-southeast-1a
name: a
name: main
- etcdMembers:
- instanceGroup: master-ap-southeast-1a
name: a
name: events
$ kops update cluster --yes
$ kops rolling-update cluster --yes
$ kops delete ig master-xxxxxx-1b
$ kops delete ig master-xxxxxx-1c
此操作无法撤消,它将立即删除2个主节点。
现在您的3个主节点中的2个被删除,k8s etcd服务可能会失败,并且kube-api服务将无法访问。在此步骤之后,kops
和kubectl
命令不再起作用是正常的。
$ sudo systemctl stop protokube
$ sudo systemctl stop kubelet
下载etcd-manager-ctl
工具。如果使用不同的etcd-manager
版本,请相应地调整下载链接
$ wget https://github.com/kopeio/etcd-manager/releases/download/3.0.20190930/etcd-manager-ctl-linux-amd64
$ mv etcd-manager-ctl-linux-amd64 etcd-manager-ctl
$ chmod +x etcd-manager-ctl
$ mv etcd-manager-ctl /usr/local/bin/
从S3恢复备份。参见official docs
$ etcd-manager-ctl -backup-store=s3://<kops s3 bucket name>/<cluster name>/backups/etcd/main list-backups
$ etcd-manager-ctl -backup-store=s3://<kops s3 bucket name>/<cluster name>/backups/etcd/main restore-backup 2019-10-16T09:42:37Z-000001
# do the same for events
$ etcd-manager-ctl -backup-store=s3://<kops s3 bucket name>/<cluster name>/backups/etcd/events list-backups
$ etcd-manager-ctl -backup-store=s3://<kops s3 bucket name>/<cluster name>/backups/etcd/events restore-backup 2019-10-16T09:42:37Z-000001
这不会立即开始还原;您需要重新启动etcd:杀死相关容器并启动kubelet
$ sudo systemctl start kubelet
$ sudo systemctl start protokube
等待还原完成,然后kubectl get nodes
和kops validate cluster
应该正常工作。否则,您可以终止AWS控制台中其余主节点的EC2实例,Auto Scaling Groups将创建一个新的主节点,并还原etcd群集。