场景

出于某些原因删除了k8s-001节点,现在需要将k8s-001节点重新作为控制平面加入集群,在加入集群过程中出错

集群信息

集群版本:1.13.1

3个控制平面,2个worker节点

  • k8s-001:10.0.3.4 control plane
  • k8s-002:10.0.3.5 control plane
  • k8s-003:10.0.3.6 control plane
  • k8s-004:10.0.3.7 worker
  • k8s-005:10.0.3.8 worker
  • vip::10.0.3.9

解决

解决kubeadm加入集群时etcd健康检查失败的问题

一般直接重新加入集群的话会出现下面的问题

  1. [kubeconfig] Writing "controller-manager.conf" kubeconfig file
  2. [kubeconfig] Writing "scheduler.conf" kubeconfig file
  3. [etcd] Checking Etcd cluster health
  4. error syncing endpoints with etc: dial tcp 10.0.3.4:2379: connect: connection refused

这是因为控制平面10.0.3.4(k8s-001)已经被删除了,但是configmap:kubeadm-config中存在未删除的状态

  1. root@k8s-002:/home# kubectl get configmaps -n kube-system kubeadm-config -oyaml
  2. .
  3. .
  4. .
  5. ClusterStatus: |
  6. apiEndpoints:
  7. k8s-001:
  8. advertiseAddress: 10.0.3.4
  9. bindPort: 6443
  10. k8s-002:
  11. advertiseAddress: 10.0.3.5
  12. bindPort: 6443
  13. k8s-003:
  14. advertiseAddress: 10.0.3.6
  15. bindPort: 6443
  16. apiVersion: kubeadm.k8s.io/v1beta1
  17. kind: ClusterStatus
  18. .
  19. .
  20. .

可以看到集群信息中k8s-001仍然存在,在使用kubeadm重新加入集群时会检测节点上的etcd健康状态

因此要从配置文件中删掉k8s-001

  1. root@k8s-002:/home# kubectl edit configmaps -n kube-system kubeadm-config

删除如下的k8s-001内容,保存

  1. k8s-001:
  2. advertiseAddress: 10.0.3.4
  3. bindPort: 6443

删除失效的etcd集群成员

用kubeadm搭建的集群,如果是非手动部署etcd(kubeadm自动搭建)的话,etcd是在每个控制平面都启动一个实例的,当删除k8s-001节点时,etcd集群未自动删除此节点上的etcd成员,因此需要手动删除

首先查看etcd集群成员信息

先设置快捷方式

  1. root@k8s-002:/home# export ETCDCTL_API=3
  1. root@k8s-002:/home# alias etcdctl='etcdctl --endpoints=https://10.0.3.5:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key'

查看etcd集群成员信息

  1. root@k8s-002:/home# etcdctl member list
  2. 57b3a6dc282908df, started, k8s-003, https://10.0.3.6:2380, https://10.0.3.6:2379
  3. 58bfa292d53697d0, started, k8s-001, https://10.0.3.4:2380, https://10.0.3.4:2379
  4. f38fd5735de92e88, started, k8s-002, https://10.0.3.5:2380, https://10.0.3.5:2379

虽然看起来集群很健康,但实际上k8s-001已经不存在了,如果这时加入集群,就会报如下错误

  1. [kubeconfig] Writing "admin.conf" kubeconfig file
  2. [kubeconfig] Writing "controller-manager.conf" kubeconfig file
  3. [kubeconfig] Writing "scheduler.conf" kubeconfig file
  4. [etcd] Checking Etcd cluster health
  5. [kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.13" ConfigMap in the kube-system namespace
  6. [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
  7. [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
  8. [kubelet-start] Activating the kubelet service
  9. [tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...
  10. [patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "k8s-001" as an annotation
  11. error creating local etcd static pod manifest file: etcdserver: unhealthy cluster

删除失效成员(k8s-001)

  1. root@k8s-002:/home# etcdctl member remove 58bfa292d53697d0
  2. Member 58bfa292d53697d0 removed from cluster f06e01da83f7000d
  1. root@k8s-002:/home# etcdctl member list
  2. 57b3a6dc282908df, started, k8s-003, https://10.0.3.6:2380, https://10.0.3.6:2379
  3. f38fd5735de92e88, started, k8s-002, https://10.0.3.5:2380, https://10.0.3.5:2379

再次使用kubeadm加入控制平面

一切正常

  1. root@k8s-002:/home# kubectl get pod --all-namespaces
  2. NAMESPACE NAME READY STATUS RESTARTS AGE
  3. kube-system calico-node-4956t 1/1 Running 0 128m
  4. kube-system calico-node-hkcmq 1/1 Running 0 5h58m
  5. kube-system calico-node-lsqsg 1/1 Running 0 5h58m
  6. kube-system calico-node-q2zpt 1/1 Running 0 5h58m
  7. kube-system calico-node-qdg49 1/1 Running 0 5h58m
  8. kube-system coredns-89cc84847-sl2s5 1/1 Running 0 6h3m
  9. kube-system coredns-89cc84847-x57kv 1/1 Running 0 6h3m
  10. kube-system etcd-k8s-001 1/1 Running 0 39m
  11. kube-system etcd-k8s-002 1/1 Running 1 3h8m
  12. kube-system etcd-k8s-003 1/1 Running 0 3h7m
  13. kube-system kube-apiserver-k8s-001 1/1 Running 0 128m
  14. kube-system kube-apiserver-k8s-002 1/1 Running 1 6h1m
  15. kube-system kube-apiserver-k8s-003 1/1 Running 2 6h
  16. kube-system kube-controller-manager-k8s-001 1/1 Running 0 128m
  17. kube-system kube-controller-manager-k8s-002 1/1 Running 1 6h1m
  18. kube-system kube-controller-manager-k8s-003 1/1 Running 0 6h
  19. kube-system kube-proxy-5stnn 1/1 Running 0 5h59m
  20. kube-system kube-proxy-92vtd 1/1 Running 0 6h1m
  21. kube-system kube-proxy-sz998 1/1 Running 0 5h59m
  22. kube-system kube-proxy-wp2jx 1/1 Running 0 6h
  23. kube-system kube-proxy-xl5nn 1/1 Running 0 128m
  24. kube-system kube-scheduler-k8s-001 1/1 Running 0 128m
  25. kube-system kube-scheduler-k8s-002 1/1 Running 0 6h1m
  26. kube-system kube-scheduler-k8s-003 1/1 Running 1 6h
  1. root@k8s-002:/home# etcdctl member list
  2. 57b3a6dc282908df, started, k8s-003, https://10.0.3.6:2380, https://10.0.3.6:2379
  3. f38fd5735de92e88, started, k8s-002, https://10.0.3.5:2380, https://10.0.3.5:2379
  4. fc790bd58a364c97, started, k8s-001, https://10.0.3.4:2380, https://10.0.3.4:2379

一些注意点

每次k8s-001执行kubeadm join失败后,需要执行kubeadm reset重置节点状态,重置状态后,如果要重新作为控制平面加入集群的话,需要从其它健康的控制平面节点的/etc/kubernetes/pki目录下向k8s-001拷贝证书,具体证书如下:

  • ca.crt
  • ca.key
  • sa.pub
  • sa.key
  • front-proxy-ca.crt
  • front-proxy-ca.key
  • etcd/ca.crt
  • etcd/ca.key

打印加入集群的kubeadm join命令

  1. root@master:~# kubeadm token create --print-join-command
  2. kubeadm join your.k8s.domain:6443 --token xxxxxx.xxxxxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

作为普通节点加入集群

  1. kubeadm join your.k8s.domain:6443 --token xxxxxx.xxxxxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

作为控制平面加入集群

  1. kubeadm join your.k8s.domain:6443 --token xxxxxx.xxxxxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --experimental-control-plane

注意,--experimental-control-plane参数在1.15+版本需要替换为--control-plane

用kubeadm创建高可用kubernetes集群后,如何重新添加控制平面的更多相关文章

  1. 使用Kubeadm搭建高可用Kubernetes集群

    1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...

  2. 高可用Kubernetes集群原理介绍

    ■ 文/ 天云软件 云平台开发工程师 张伟 1. 背景 Kubernetes作为容器应用的管理中心,对集群内部所有容器的生命周期进行管理,结合自身的健康检查及错误恢复机制,实现了集群内部应用层的高可用 ...

  3. 搭建高可用kubernetes集群(keepalived+haproxy)

    序 由于单master节点的kubernetes集群,存在master节点异常之后无法继续使用的缺陷.本文参考网管流程搭建一套多master节点负载均衡的kubernetes集群.官网给出了两种拓扑结 ...

  4. 高可用Kubernetes集群-16. ansible快速部署

    说明 本文档指导采用二进制包的方式快速部署高可用kubernetes集群. 脚本托管:k8s-ansible(持续更新) 参考:高可用kubernetes集群 组件版本 组件 版本 备注 centos ...

  5. 高可用Kubernetes集群-3. etcd高可用集群

    五.部署高可用etcd集群 etcd是key-value存储(同zookeeper),在整个kubernetes集群中处于中心数据库地位,以集群的方式部署,可有效避免单点故障. 这里采用静态配置的方式 ...

  6. kubeadm部署高可用K8S集群(v1.14.2)

    1. 简介 测试环境Kubernetes 1.14.2版本高可用搭建文档,搭建方式为kubeadm 2. 服务器版本和架构信息 系统版本:CentOS Linux release 7.6.1810 ( ...

  7. 基于Containerd安装部署高可用Kubernetes集群

    转载自:https://blog.weiyigeek.top/2021/7-30-623.html 简述 Kubernetes(后续简称k8s)是 Google(2014年6月) 开源的一个容器编排引 ...

  8. Kubeadm部署高可用K8S集群

    一 基础环境 1.1 资源 节点名称 ip地址 VIP 192.168.12.150 master01 192.168.12.48 master02 192.168.12.242 master03 1 ...

  9. hype-v上centos7部署高可用kubernetes集群实践

    概述 在上一篇中已经实践了 非高可用的bubernetes集群的实践 普通的k8s集群当work node 故障时是高可用的,但是master node故障时将会发生灾难,因为k8s api serv ...

随机推荐

  1. Dijkstra含权图最短路径;审判,不要错过枚举退款保证不会重复;国际象棋八皇后问题

    求两节点的最短通路.对于无权图,能够通过图的广度优先遍历求解.含权图一般通过Dijkstra算法求解. import java.util.ArrayList; import java.util.Has ...

  2. 毫秒数据字符串转换为DateTime

    思路:取出毫秒结果,在1970年1月1日 00:00:00的基础上,加上毫秒数 string date = "/Date(1486363695453)/"; date = date ...

  3. WPF HeaderedContentControl两个内容属性 Header和Content

    <Window x:Class="XamlTest.Window2"        xmlns="http://schemas.microsoft.com/winf ...

  4. MVC 组件之间的关系

    View和Controller都可以直接请求Model 但是Model不依赖View和controller lController可以直接请求View来显示具体页面 View不依赖Controller ...

  5. 微信小程序把玩(十一)icon组件

    原文:微信小程序把玩(十一)icon组件 这些是提供的所支持的图标样式,根据需求在此基础上去修改大小和颜色. 主要属性: 使用方式: wxml <!--成功图标--> <icon t ...

  6. oracle延迟块清除

    oracle在执行一些DML操作时,会在block上有活动事务的标志,如果一个事务commit后,由于某些block在commit之前已经写回datafile, 或者事务影响到的block数过多,则c ...

  7. CLSRSC-400: A system reboot is required to continue installing.

    I try to install oracle database 12c RAC on the RedHat 7.3,when I execute the script '/u01/app/12.2. ...

  8. 毕设(五)ListView

    ListView 控件可使用四种不同视图显示项目.通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本. 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成 ...

  9. Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)

    模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口.非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框. 如果从线程角度来讲,模态对话 ...

  10. 代理Delegate的小应用(使用setModelData设置下拉日期对话框)

    前言 在平时关于表格一类的的控件使用中,不可避免需要修改每个Item的值,通过在Item中嵌入不同的控件对编辑的内容进行限定,然而在表格的Item中插入的控件始终显示,当表格中item项很多的时候,会 ...