一、概述

在实际使用kubernetes集群的过程中,我们会涉及到集群的扩/缩容,也就是增减集群的节点。

 

二、给集群添加节点

比如我们要给集群里面增加一个节点A,ip是192.168.1.100, 要做以下这些操作:

step1:

给节点192.168.1.100 安装以下组件,如果节点已经有如下组件,请忽略。

  • kubectl / kubeadm / kubelet
  • docker
  • nfs-utils

安装之前确认自己的kubernetes版本号:

在集群的master上执行

[root@scm-master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:36:53Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:27:17Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

Server Version中的GitVersion字段即是kubernetes版本号,例如我的kubernetes版本是1.16.0

确定了kubernetes的版本号之后,请在以下指令中选择适合自己k8s版本的那一条,并在node 192.168.1.100上执行。

以下示例是以某个特定的k8s版本为基础进行安装,大家在执行时记得更改成自己的k8s版本号

1.16系列的版本请参考 1.16.2的安装命令,1.17系列的版本请参考1.17.7的安装命令,以此类推。

1.16.2版本:

curl -sSL https://kuboard.cn/install-script/v1.16.2/install-kubelet.sh | sh

1.17.7版本:

curl -sSL https://kuboard.cn/install-script/v1.17.x/install_kubelet.sh | sh -s 1.17.7

1.18.9版本:

curl -sSL https://kuboard.cn/install-script/v1.18.x/install_kubelet.sh | sh -s 1.18.9

1.19.2版本:

curl -sSL https://kuboard.cn/install-script/v1.19.x/install_kubelet.sh | sh -s 1.19.2

 

其他版本的安装方式可以在这里查询:https://kuboard.cn/install/install-k8s.html,感谢kuboard社区的贡献者。

 

step2:

安装好step1中需要的软件之后,请确认节点192.168.1.100的/etc/hosts中是否包含了以下内容:

${MASTER_IP}    ${APISERVER_NAME}

master_ip是集群master的ip地址,apiserver_name是集群创建时定义的一个名称,例如安装教程中提到的:

如果实在不确定应该怎么配置,可以参考下集群中现存节点的 /etc/hosts文件。

 

step3:

使新节点加入kubernetes集群的命令是:

kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

那么有两个值需要获取,一个是token,一个是hash值

执行以下命令获取token:

kubeadm token create

执行以下命令获取hash值:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

以上两个值获取到之后,就可以执行命令使得节点加入集群了:

kubeadm join --token ${token} 192.168.1.101:6443 --discovery-token-ca-cert-hash sha256:${hash}

${token} 和 ${hash} 以及 192.168.1.101:6443 请大家替换为自己的token、hash、集群master的ip

 

二、从集群中移除节点

step1:

在kubernetes集群 master上执行以下操作:

1.查看集群中节点的状态:

[root@scm-master ~]# kubectl get node
NAME              STATUS   ROLES    AGE   VERSION
scm-master        Ready    master   34d   v1.16.0
scm-node-prd-01   Ready    <none>   19h   v1.16.0
scm-node-prd-02   Ready    <none>   18h   v1.16.0
scm-node01        Ready    <none>   34d   v1.16.0
scm-node02        Ready    <none>   34d   v1.16.0

例如我们要移除节点 scm-node-prd-01

2.我们需要通知集群停止对这个节点的调度,并且驱逐已经部署在该节点上的pod,执行:

kubectl drain scm-node-prd-01 --delete-local-data --force --ignore-daemonsets

执行结果:

[root@scm-master ~]# kubectl drain scm-node-prd-01 --delete-local-data --force --ignore-daemonsets
node/scm-node-prd-01 cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-79495, kube-system/kube-proxy-f54c6, kubesphere-logging-system/fluent-bit-qsgjz, kubesphere-monitoring-system/node-exporter-294jb
node/scm-node-prd-01 drained

step2:

在kubernetes集群 master上执行以下操作:

1. 删除节点

[root@scm-master ~]# kubectl delete node scm-node-prd-01
node "scm-node-prd-01" deleted

2. 删除节点后,再查看当前节点情况:

[root@scm-master ~]# kubectl get nodes
NAME              STATUS   ROLES    AGE   VERSION
scm-master        Ready    master   34d   v1.16.0
scm-node-prd-02   Ready    <none>   19h   v1.16.0
scm-node01        Ready    <none>   34d   v1.16.0
scm-node02        Ready    <none>   34d   v1.16.0

可以看到scm-node-prd-01已经从集群中移除了。

step3:

在已经移除的节点 scm-node-prd-01上执行 kubeadm reset

kubeadm reset的作用:运行此命令,以恢复 kubeadm init和 kubeadm join对该主机所做的任何更改。

[root@scm-node-prd-01:~ ]# kubeadm reset
[reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
[preflight] Running pre-flight checks
W0923 10:05:44.514401   29110 removeetcdmember.go:79] [reset] No kubeadm config, using etcd pod spec to get data directory
[reset] No etcd config found. Assuming external etcd
[reset] Please, manually reset etcd to prevent further issues
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]
[reset] Deleting contents of stateful directories: [/var/lib/kubelet /etc/cni/net.d /var/lib/dockershim /var/run/kubernetes /var/lib/cni]

The reset process does not reset or clean up iptables rules or IPVS tables.
If you wish to reset iptables, you must do so manually by using the "iptables" command.

If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)
to reset your system's IPVS tables.

The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.

到这里节点移除的工作已经结束了。

 

Logo

开源、云原生的融合云平台

更多推荐