文章目录
-
- @[toc]
- 一、重新添加master
-
- 1)驱逐VIP
- 2)设置为不可调度
- 3)驱逐master
- 4)删除master3
- 5)清理etcd集群
- 6)卸载master节点
- 7)配置域名解析
- 8)master2生成join命令
- 二、node节点添加到集群
-
- 1)禁止调度
- 2)允许调度
- 3)驱逐节点
- 4)卸载node节点
- 5)配置域名解析
- 6)master2生成join命令
- 7)加入集群
- 8)删除驱逐恢复可调度
- 9)测试部署
一、重新添加master
1)驱逐VIP
#查看是否存在VIP
[root@k8s-master3 ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:89:72:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.120/24 brd 192.168.4.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet 192.168.4.100/24 scope global secondary ens160
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe89:7213/64 scope link
valid_lft forever preferred_lft forever
#防止VIP在本节点
systemctl restart keepalived.service
systemctl restart nginx.service
2)设置为不可调度
[root@k8s-master1 ~]# kubectl cordon k8s-master3
node/k8s-master3 cordoned
[root@k8s-master1 ~]# kubectl get nodes|grep master3
k8s-master3 Ready,SchedulingDisabled control-plane 55m v1.25.0
3)驱逐master
root@k8s-master3 ~]# kubectl drain k8s-master3 --delete-emptydir-data --force --ignore-daemonsets
node/k8s-master3 cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/calico-node-q6hp2, kube-system/kube-proxy-6kkhh
node/k8s-master3 drained
[root@k8s-master3 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane 44m v1.25.0
k8s-master2 Ready control-plane 37m v1.25.0
k8s-master3 Ready,SchedulingDisabled control-plane 38m v1.25.0
k8s-node1 Ready 41m v1.25.0
k8s-node2 Ready 40m v1.25.0
k8s-node3 Ready 40m v1.25.0
4)删除master3
[root@k8s-master3 ~]# kubectl delete nodes k8s-master3
node "k8s-master3" deleted
5)清理etcd集群
#登录master2清理master3
[root@k8s-master3 ~]# kubectl get pods -n kube-system |grep etcd
etcd-k8s-master1 1/1 Running 1 45m
etcd-k8s-master2 1/1 Running 0 38m
#登录maste2
[root@k8s-master3 ~]# kubectl exec -it -n kube-system etcd-k8s-master2 -- sh
#查看etcd
sh-5.1# etcdctl --endpoints=127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member lis
9a59a57a652f8e2a, started, k8s-master3, https://192.168.4.120:2380, https://192.168.4.120:2379, false
c23408f409942c06, started, k8s-master2, https://192.168.4.119:2380, https://192.168.4.119:2379, false
c3509e57d5f53562, started, k8s-master1, https://192.168.4.114:2380, https://192.168.4.114:2379, false
#删除命令etcdctl --endpoints=127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member remove ID号
#删除master3的etcd
sh-5.1# etcdctl --endpoints=127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member remove 9a59a57a652f8e2a
Member 9a59a57a652f8e2a removed from cluster 366c96818b1e6d49
#查看
sh-5.1# etcdctl --endpoints=127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member lis
c23408f409942c06, started, k8s-master2, https://192.168.4.119:2380, https://192.168.4.119:2379, false
c3509e57d5f53562, started, k8s-master1, https://192.168.4.114:2380, https://192.168.4.114:2379, false
6)卸载master节点
kubeadm reset -f
rm -f $HOME/.kube/config
rm -rf /etc/kubernetes/
rm -rf /var/lib/kubelet/
systemctl restart kubelet
7)配置域名解析
[root@k8s-master3 ~]# cat /etc/hosts
192.168.4.114 k8s-master1
192.168.4.119 k8s-master2
192.168.4.120 k8s-master3
192.168.4.115 k8s-node1
192.168.4.116 k8s-node2
192.168.4.118 k8s-node3
192.168.4.100 jiawenchaovip.com
8)master2生成join命令
#生成证书将会被上传到集群,并存储在指定的 Secret 中,供其他节点使用
[root@k8s-master2 ~]# kubeadm init phase upload-certs --upload-certs
I0201 15:24:39.539360 17846 version.go:256] remote version is much newer: v1.29.1; falling back to: stable-1.25
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
67c903efd1b70d4040815fe7fccf96c2d75324823dea25b9040b334e8811dddd
- Storing the certificates in Secret “kubeadm-certs” in the “kube-system” Namespace:这部分表示将证书存储在 kube-system 命名空间下的名为 kubeadm-certs 的 Secret 中。Secret 是 Kubernetes 中用于存储敏感信息,如证书、令牌等的机制。
- Using certificate key: 67c903efd1b70d4040815fe7fccf96c2d75324823dea25b9040b334e8811dddd:这部分表示使用了密钥 67c903efd1b70d4040815fe7fccf96c2d75324823dea25b9040b334e8811dddd 来加密和解密存储的证书。
#生成节点加入到主控节点的命令
[root@k8s-master2 ~]# kubeadm token create --print-join-command
kubeadm join jiawenchaovip.com:6443 --token wc2wqq.sh4lpek38q5pga3j --discovery-token-ca-cert-hash sha256:c3b39675b78c612ceee3bb73c520f1565be57ada4a0cf7576787a0c6a89e75b0
- kubeadm join jiawenchaovip.com:6443:这部分表示要将节点加入到名为 “jiawenchaovip.com” 的 Kubernetes 主控节点,该主控节点的地址是 jiawenchaovip.com,端口是 6443。这部分是通过 kubeadm init 命令在主控节点上生成的。
- –token wc2wqq.sh4lpek38q5pga3j:这部分是指定用于身份验证的令牌(token),节点需要使用这个令牌来与主控节点建立连接并加入集群。每个令牌都有一定的有效期,过期后需要重新生成。
- –discovery-token-ca-cert-hash sha256:c3b39675b78c612ceee3bb73c520f1565be57ada4a0cf7576787a0c6a89e75b0:这部分是表示主控节点的证书摘要信息,节点需要通过这个信息来验证主控节点的身份。这个摘要信息是通过 kubeadm init 命令在主控节点上生成的。
#修改为master节点添加命令,添加--control-plane --certificate-key并执行
kubeadm join jiawenchaovip.com:6443 --token wc2wqq.sh4lpek38q5pga3j --discovery-token-ca-cert-hash sha256:c3b39675b78c612ceee3bb73c520f1565be57ada4a0cf7576787a0c6a89e75b0 \
--control-plane --certificate-key 67c903efd1b70d4040815fe7fccf96c2d75324823dea25b9040b334e8811dddd
- kubeadm join jiawenchaovip.com:6443:表示将节点加入指定地址为 jiawenchaovip.com,端口为 6443 的 Kubernetes 控制平面。
- –token wc2wqq.sh4lpek38q5pga3j:该部分表示节点使用的加入令牌(token),节点需要使用这个令牌来与控制平面节点建立连接并加入集群。
- –discovery-token-ca-cert-hash sha256:c3b39675b78c612ceee3bb73c520f1565be57ada4a0cf7576787a0c6a89e75b0:这部分是关于发现令牌的 CA 证书的哈希值,节点需要通过这个哈希值来验证控制平面节点的身份。
- –control-plane:表示将节点加入到控制平面中,即作为主控节点。
- –certificate-key 67c903efd1b70d4040815fe7fccf96c2d75324823dea25b9040b334e8811dddd:指定的证书密钥,用于加密和解密存储的证书信息。
#检查节点
[root@k8s-master3 ~]# kubectl get nodes|grep master3
k8s-master3 Ready control-plane 93s v1.25.0
#查看证书
[root@k8s-master3 ~]# kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Jan 08, 2124 07:32 UTC 99y ca no
apiserver Jan 08, 2124 07:32 UTC 99y ca no
apiserver-etcd-client Jan 08, 2124 07:32 UTC 99y etcd-ca no
apiserver-kubelet-client Jan 08, 2124 07:32 UTC 99y ca no
controller-manager.conf Jan 08, 2124 07:32 UTC 99y ca no
etcd-healthcheck-client Jan 08, 2124 07:32 UTC 99y etcd-ca no
etcd-peer Jan 08, 2124 07:32 UTC 99y etcd-ca no
etcd-server Jan 08, 2124 07:32 UTC 99y etcd-ca no
front-proxy-client Jan 08, 2124 07:32 UTC 99y front-proxy-ca no
scheduler.conf Jan 08, 2124 07:32 UTC 99y ca no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Jan 08, 2124 06:09 UTC 99y no
etcd-ca Jan 08, 2124 06:09 UTC 99y no
front-proxy-ca Jan 08, 2124 06:09 UTC 99y no
二、node节点添加到集群
1)禁止调度
#禁止节点调度
[root@k8s-master1 ~]# kubectl cordon k8s-node3
node/k8s-node3 cordoned
[root@k8s-master1 ~]# kubectl get nodes|grep node3
k8s-node3 Ready,SchedulingDisabled 111m v1.25.0
#n此时pod还在,如果新部署将不能调度到这个节点。
[root@k8s-master1 ~]# kubectl get pod -o wide|grep node3
nginx-deployment-cd55c47f5-5jjbd 1/1 Running 0 99s 10.244.107.195 k8s-node3
- kubectl cordon:这个命令用于标记一个节点为不可调度状态。当使用 kubectl cordon 命令时,Kubernetes 不会在该节点上调度新的 Pod,但已经在节点上运行的 Pod 不会受到影响。这个命令一般用于暂时阻止新的 Pod 被调度到某个节点,例如,当需要对节点进行维护或排障时。
- kubectl drain:这个命令用于优雅地驱逐一个节点上的 Pod,并标记该节点为不可调度状态。当使用 kubectl drain 命令时,Kubernetes 会按照优雅退出的方式终止节点上的所有 Pod,并在其它节点上重新调度这些 Pod。通常搭配 --force 参数可以用来强制执行这个流程。
2)允许调度
#允许节点调度
kubeclt uncordon k8s-node3
3)驱逐节点
#驱逐node3上的pod
[root@k8s-master1 ~]# kubectl drain k8s-node3 --delete-emptydir-data --force --ignore-daemonsets
node/k8s-node3 already cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/calico-node-zxwtf, kube-system/kube-proxy-k5h7f
evicting pod default/nginx-deployment-cd55c47f5-5jjbd
pod/nginx-deployment-cd55c47f5-5jjbd evicted
node/k8s-node3 drained
#发现pod已经从node3节点飘到node2节点
[root@k8s-master1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-cd55c47f5-gsjvv 1/1 Running 0 5m7s 10.244.36.67 k8s-node1
nginx-deployment-cd55c47f5-kl6m2 1/1 Running 0 5m7s 10.244.169.131 k8s-node2
nginx-deployment-cd55c47f5-r24zl 1/1 Running 0 37s 10.244.36.68 k8s-node1
- –force 当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者StatefulSet 管理的时候就需要用–force来强制执行 (例如:kube-proxy)
- –ignore-daemonsets 无视DaemonSet管理下的Pod。即–ignore-daemonsets往往需要指定的,这是因为deamonset会忽略unschedulable标签(使用kubectl drain时会自动给节点打上不可调度标签),因此deamonset控制器控制的pod被删除后可能马上又在此节点上启动起来,这样就会成为死循环.因此这里忽略daemonset。
- –delete-local-data 如果有mount local volumn的pod,会强制杀掉该pod。
4)卸载node节点
kubeadm reset -f
rm -rf /etc/kubernetes/
rm -rf /var/lib/kubelet/
systemctl restart kubelet
5)配置域名解析
[root@k8s-master3 ~]# cat /etc/hosts
192.168.4.114 k8s-master1
192.168.4.119 k8s-master2
192.168.4.120 k8s-master3
192.168.4.115 k8s-node1
192.168.4.116 k8s-node2
192.168.4.118 k8s-node3
192.168.4.100 jiawenchaovip.com
6)master2生成join命令
#生成节点加入到主控节点的命令
[root@k8s-master2 ~]# kubeadm token create --print-join-command
kubeadm join jiawenchaovip.com:6443 --token wc2wqq.sh4lpek38q5pga3j --discovery-token-ca-cert-hash sha256:c3b39675b78c612ceee3bb73c520f1565be57ada4a0cf7576787a0c6a89e75b0
- kubeadm join jiawenchaovip.com:6443:这部分表示要将节点加入到名为 “jiawenchaovip.com” 的 Kubernetes 主控节点,该主控节点的地址是 jiawenchaovip.com,端口是 6443。这部分是通过 kubeadm init 命令在主控节点上生成的。
- –token wc2wqq.sh4lpek38q5pga3j:这部分是指定用于身份验证的令牌(token),节点需要使用这个令牌来与主控节点建立连接并加入集群。每个令牌都有一定的有效期,过期后需要重新生成。
- –discovery-token-ca-cert-hash sha256:c3b39675b78c612ceee3bb73c520f1565be57ada4a0cf7576787a0c6a89e75b0:这部分是表示主控节点的证书摘要信息,节点需要通过这个信息来验证主控节点的身份。这个摘要信息是通过 kubeadm init 命令在主控节点上生成的。
7)加入集群
kubeadm join jiawenchaovip.com:6443 --token wc2wqq.sh4lpek38q5pga3j --discovery-token-ca-cert-hash sha256:c3b39675b78c612ceee3bb73c520f1565be57ada4a0cf7576787a0c6a89e75b0
8)删除驱逐恢复可调度
#master操作
kubectl uncordon k8s-node3
#node3节点重启
systemctl restart kubelet
#查看
[root@k8s-master1 ~]# kubectl get nodes|grep node3
k8s-node3 Ready 132m v1.25.0
9)测试部署
[root@k8s-master1 ~]# kubectl apply -f nginx.yaml
deployment.apps/nginx-deployment created
service/nginx-service created
[root@k8s-master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-cd55c47f5-966bz 1/1 Running 0 7s 10.244.36.69 k8s-node1
nginx-deployment-cd55c47f5-wf872 1/1 Running 0 7s 10.244.107.196 k8s-node3
nginx-deployment-cd55c47f5-xp9rg 1/1 Running 0 7s 10.244.169.132 k8s-node2