一次Kubernetes集群故障处理案例:etcd无法选出Leader导致Kubernetes API-Server启动失败

1. 概述

1、集群信息

Name IP Role
Node1 172.17.1.120 控制节点1
Node2 172.17.1.121 控制节点2
k8s-2 172.17.1.131 工作节点1
k8s-3 172.17.1.132 工作节点2

2、故障现象

我按照正常卸载工作节点的操作步骤,一切顺利,当时并没有什么异常。

出现错误的操作记录
1
2
3
4
root@node1:~# kubectl drain node node2 --ignore-daemonsets --delete-emptydir-data
root@node1:~# kubectl delete node node2

root@node2:~# kubeadm reset --force

故障出现原因:双控制平面Kubernetes(这个状态本身就异常,但不在本次讨论范围内)删除Node2控制节点后,另外一个控制平面无法正常工作。具体表现为ETCD启动失败,导致Kubernetes api-server 启动失败。

journalctl -u kubelet -n 100 --no-pager | less
1
Jul 22 23:17:05 node1 kubelet[3301]: E0722 23:17:05.135471    3301 controller.go:145] "Failed to ensure lease exists, will retry" err="Get \"https://172.17.1.120:6443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/node1?timeout=10s\": dial tcp 172.17.1.120:6443: connect: connection refused" interval="7s"
阅读更多

Ubuntu升级后导致的Kubernetes问题

这是 胆大心不细[My Fault系列] 的第一篇,之鲁莽升级Host OS后k8s集群故障处理。

Ubuntu 16.04 升级到22.04 能有什么坑呢。

1. cgroups 创建失败,Docker containerd Kubernetes Pod创建失败。

syslog 如下
Jan 27 16:54:58 k8s-3 kubelet[159565]: E0127 16:54:58.707563 159565 pod_workers.go:951]

“Error syncing pod, skipping” err=”failed to "CreatePodSandbox"

CreatePodSandboxError: "Failed to create sandbox for pod

rpc error: code = Unknown desc = failed to create containerd task: cgroups: cgroup mountpoint does not exist: unknown"“

Jan 27 16:55:30 k8s-3 kubelet[159565]: E0127 16:55:30.485050 159565 pod_workers.go:951]
“Error syncing pod, skipping” err=”failed to "CreatePodSandbox" for "prometheus-k8s-1_kubesphere-monitoring-system(9040c116-1ef3-4603-a74d-5e9574b260d1)" with CreatePodSandboxError:

rpc error: code = Unknown desc = failed to setup network for sandbox

plugin type=\"flannel\" failed (add): loadFlannelSubnetEnv failed: open /run/flannel/subnet.env: no such file or directory"“

阅读更多

从Dashboard鉴权认识Kubernetes的用户认证

Kubernetes 用户认证

  1. 从Dashboard鉴权认识Kubernetes的用户认证
  2. 从签发用户证书认识Kubernetes的用户认证

Kubernetes的API准入(Access Control)分为用户认证(Authenticating)鉴权(Authorization)两个部分。鉴权是对权限的控制,来控制角色(Role)、用户(User)是否能访问对象,主要通过RBAC、ABAC实现,你大概率听说过这两种鉴权控制策略。当然鉴权不是本片讨论的重点,下面内容我们主要讨论认证部分。

阅读更多

使用UDEV处理k3s节点路由异常问题

一、出了什么问题

去年弄了一堆轻量应用服务器,搭建了一个k3s(Rancher发布的轻量版kubebernets)。k3s默认的Flannel的CNI,这个网络插件的好处就是简单,坏处就是过于简陋。每当设置网卡重启的时候flannel路由丢失(相关ISSUE),导致节点失联。

阅读更多

使用CoreDNS作为内网域名解析服务器

CoreDNS 是Kubernetes默认也是最常用的DNS工具。
内网环境下我们经常会使用一些特殊结尾的域名来却分访问环境,这些域名往往是不存在或者我们自己不是持有人,最常见的使用方案是我们在内网DNS上做解析或者公网DNS解析成内网地址。

阅读更多

kubernetes配置私有仓库证书

目录


公司内部有个Kubernetes集群,镜像服务使用私有化部署的Harbor,突然一天发现域名没有续费… 接下来面临的问题就是TLS证书过期无法通过权威CA证书机构签发新证书,但如果更换域名CI/CD、K8s workload 都需要修改,修改量比较大。有没有简单处理方案呢,当然有,改由本地DNS解析域名,自己签发证书。下面的内容就是操作步骤,相对还算是简单的。

一、 OpenSSL 生成证书

  1. 生成根证书
阅读更多

基于Wireguard组网Kubernetes(k3s)集群搭建

背景

Wireguard能让处于不同网络的主机组成一个子网,是一种高性能的廉价组网方案。
K3S、Microk8s、kind、MiniKube等是Kubernetes的轻量实现版本,本篇采用k3s做为集群方案。

目录

阅读更多