修复一个kubernetes集群
前几天有个朋友把他们的kubernetes集群搞挂了,让我帮忙恢复一下,由于很多现场都没有了,这里提供一下解决思路。
环境问题
该环境有一个master节点,即控制面pod(etcd、scheduler等)也都只有一个pod
问题起因是他们的服务访问出了点问题,为修复该问题,他:
- 备份了etcd数据(数据是3天前的)
- 重启了docker
- 将etcd数据恢复(数据是3天前的)
然后访问服务依然不通。
问题诊断
deployment reversion不匹配
首先看到pod并非running状态,直接删除pod,让其重建,查看pod创建过程,发现pod并没有分配到node。
问题分析
首先怀疑可能kube-scheduler出现了问题:
- 删除kube-scheduler pod发现无法重建该pod
- 最后通过将
/etc/kubernetes/manifests/kube-scheduler.yaml文件移出再移入的方式创建出scheduler pod
此时仍然无法调度pod,因此怀疑是在scheduler之前出现了问题,查看api-server的日志,发现有很多reversion版本不匹配的错误,应该是集群中的资源版本和etcd中的资源版本不匹配导致的:
使用etctctl检查etcd的状态,发现etcd一切正常
etcdctl endpoint health
etcdctl endpoint status --write-out=table
使用
kubectl rollout history deployment/<deployment_name>查看etcd中保存的的deployment的版本,然后执行kubectl rollout undo daemonset/<deployment_name> --to-revision=<version>回滚到与etcd匹配的版本。回滚之前可以通过
kubectl rollout history daemonset/<deployment_name> --revision=<version>对比etcd和环境中的配置区别回滚之后发现pod可以正常创建出来
Iptables丢失问题
pod起来之后,服务访问仍然不通。使用kubectl describe命令查看服务的service,发现没有找到service对应的endpoints,一开始还以为是service的yaml的问题,debug了大半天发现绝大部分services都没有endpoints。。。
问题分析
service找不到endpoints,体现在系统中就是可能没有创建出iptables规则:
- 使用
iptables-save命令查看,发现果然没有kubernetes的iptables规则 - 该环境使用的是ipvs模式,使用
ipvsadm -l -n也发现service的cluster IP没有对应的pod IP - 查看kube-proxy日志,并未发现任何异常
此时想到的方式有:
- 重新创建pod和对应的service,刷新iptables:尝试失败,重建之后并未生成iptables
- 重建节点:所有节点都存在问题,无法通过
kubectl drain迁移pod - 手动添加iptables:太过复杂,即便成功,也会污染节点的iptables规则。
- 重新创建kube-proxy pod:重启kube-proxy pod之后也并未创建iptables规则
最后怀疑kube-proxy也可能出现问题,需要重新初始化kube-proxy,恰好kubeadm有如下命令可以重新初始化kube-proxy:
kubeadm init phase addon kube-proxy --kubeconfig ~/.kube/config --apiserver-advertise-address <api-server-ip>
在重新初始化kube-proxy之后发现iptables规则创建成功,删除并创建pod和service之后可以正确创建出对应的iptables规则,此时service也有了endpoints。
CNI连接错误
在上一步重启pod之后,发现有一个webhook对应的pod没有重启成功,用kubectl describe 该pod发现如下错误:
networkPlugin cni failed to set up pod "webhook-1" network: Get "https://[10.233.0.1]:443/api/v1/namespaces/volcano-system": dial tcp 10.233.0.1:443: i/o timeout
该集群使用的是calico CNI,查看该CNI对应的daemonset,发现只有5个pod是ready的。
删除"webhook-1" pod所在的节点的"calico-node" pod,发现该"calico-node" pod启动失败。
问题分析
在上述错误中,"10.233.0.1"为kubernetes apiserver的service cluster IP,由于"clico-node" pod使用的是hostnetwork,因此可以直接在node上测试联通性,使用telnet 10.233.0.1 443测试,发现果然不通。
calico的/etc/cni/net.d/10-calico.conflist配置文件中定义了连接apiserver所需的kubeconfig文件:
{
"name": "cni0",
"cniVersion":"0.3.1",
"plugins":[
{
...
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
}
},
...
]
}
而/etc/cni/net.d/calico-kubeconfig中就定义了连接apiserver所需的地址和端口,因此只需将该地址端口换成apiserver pod的地址和端口应该就可以解决该问题:
# cat /etc/cni/net.d/calico-kubeconfig
# Kubeconfig file for Calico CNI plugin.
apiVersion: v1
kind: Config
clusters:
- name: local
cluster:
server: https://[10.233.0.1]:443
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0...
users:
- name: calico
user:
token: eyJhbGciOiJSUzI1NiIsImtpZC...
contexts:
- name: calico-context
context:
cluster: local
user: calico
Calico提供了如下两个环境变量用于修改生成的kubeconfig中的apiserver的地址和端口,将如下环境变量加入calico的daemonset,重新创建calico-node pod即可:
- name: KUBERNETES_SERVICE_HOST
value: <api-server-pod-ip>
- name: KUBERNETES_SERVICE_PORT
value: "6443"
至此,问题基本解决。由于错误的操作,该集群出现了大量问题,后续可以通过驱逐节点pod的方式,重新初始化整个节点,逐步重置集群节点配置。
修复一个kubernetes集群的更多相关文章
- kubeadm部署一个Kubernetes集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具.这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm in ...
- 第3章:快速部署一个Kubernetes集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点$ kubeadm in ...
- K8S学习笔记之二进制的方式创建一个Kubernetes集群
0x00 单节点搭建和简述 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. 官方地址: ...
- Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群
前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...
- 快速部署一个Kubernetes集群
官方提供的三种部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用. 部署地址:https:// ...
- 使用 Kubeadm+Containerd 部署一个 Kubernetes 集群
本文独立博客阅读地址:https://ryan4yin.space/posts/kubernetes-deployemnt-using-kubeadm/ 本文由个人笔记 ryan4yin/knowle ...
- 阿里云上万个 Kubernetes 集群大规模管理实践
点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 汤志敏,阿里 ...
- Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从
1. kubernetes介绍 1.1 kubernetes简介 kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理.目的是实现资源管理的自动 ...
- 快速安装与配置kubernetes集群搭
Kubernetes是什么? 首先,它是一个全新的基于容器技术的分布式架构领先方案.这个方案尽然很新,但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要成果.确切地说,kubernete ...
- kubernetes集群部署
鉴于Docker如此火爆,Google推出kubernetes管理docker集群,不少人估计会进行尝试.kubernetes得到了很多大公司的支持,kubernetes集群部署工具也集成了gce,c ...
随机推荐
- vue之es6语法
1.背景 2.let与var与const的区别 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- [CSP-S 2023] 消消乐 & CF1223F 题解
LG9753 CF1223F 我们称一个字符串是可消除的,当且仅当可以对这个字符串进行若干次操作,使之成为一个空字符串.其中每次操作可以从字符串中删除两个相邻的相同字符,操作后剩余字符串会拼接在一起. ...
- 圣诞节快乐,教你用shell脚本实现一颗圣诞树。【小酷炫】
前言 圣诞节到了! 一口君在这祝各位粉丝朋友圣诞节快乐! 祝各位考研的同学金榜题名! 祝找工作的朋友offer接到爆! 祝各位老板新年大发财源! 在此一口君特地用shell脚本画了一个圣诞树! 先来看 ...
- 官网使用conda&pip安装PyTorch命令总结(包含各版本)
原网页https://pytorch.org/get-started/previous-versions/ 因为有时访问该网站比较慢,所以本博客记录该网页内容 Installing previous ...
- MFC树形控件加载Access数据库数据
研究了好几天,今天终于弄好了,下面是代码 [dlg.cpp] 在初始函数OnInitDialog()中加 HICON hIcon[3]; HTREEITEM hRoot; //加载三个图标 hIcon ...
- Managing Difficulties
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define FOR(i,n,m) for(int i=n;i<=m;i++) ...
- 多队列网卡-虚拟机Linux系统设置
多队列网卡配置 作者使用的是ubuntu 20.04,VMWARE 首先查看系统上的网卡 ip a # 查看网卡信息 查看ens33是否支持多队列网卡,如果是下图这种情况就是不支持多队列网卡. cat ...
- java_基本类型
1. 所有的基本类型都是小写 例如 int 2. 所有的类 类型首字母大写 例如String
- 在 Windows 中启用 Administrator 帐户
打开管理员终端. 启用: net user administrator /active:yes 关闭: net user administrator /active:no
- Redis解读(3):Redis分布式锁、消息队列、操作位图进阶应用
Redis 做分布式锁 分布式锁也算是 Redis 比较常见的使用场景 问题场景: 例如一个简单的用户操作,一个线城去修改用户的状态,首先从数据库中读出用户的状态,然后 在内存中进行修改,修改完成后, ...