Kubernetes kube apiserver无法创建存储后端
我按照官方指南建立了一个高可用性Kubernetes集群。它是一个实验性集群,用于探索内部部署高可用性的可行性,因此,我在托管在VMware Workstation上的六美分OS 7虚拟机上创建了该集群—三个主节点和三个工作节点 在初始设置之后,它运行良好,但在我昨晚关闭所有东西并在今天早上重新启动所有虚拟机之后,kube apiserver不再在任何主节点上启动。它在所有节点上都失败,并显示一条消息,说明它“无法创建存储后端(超出了上下文截止日期)”: 尽管昨晚所有这些都很好地协同工作,为了排除版本冲突,我尝试将Kubernetes kube apiserver无法创建存储后端,kubernetes,Kubernetes,我按照官方指南建立了一个高可用性Kubernetes集群。它是一个实验性集群,用于探索内部部署高可用性的可行性,因此,我在托管在VMware Workstation上的六美分OS 7虚拟机上创建了该集群—三个主节点和三个工作节点 在初始设置之后,它运行良好,但在我昨晚关闭所有东西并在今天早上重新启动所有虚拟机之后,kube apiserver不再在任何主节点上启动。它在所有节点上都失败,并显示一条消息,说明它“无法创建存储后端(超出了上下文截止日期)”: 尽管昨晚所有这些都很好地协同工作,为了排
--storage backend=etcd3
添加到kube-apiserver.yaml清单文件中,并将Docker降级到17.03.2-ce。两者都没有帮助
我还禁用了firewalld,以确保它不会阻塞任何etcd流量。同样,这没有帮助(我也没有看到任何断开连接的证据)
我不知道如何深入挖掘kube apiserver无法创建其存储后端的原因。到目前为止,我的高可用性实验是失败的。错误消息末尾的详细信息(
上下文截止日期已过期
),表明超时(Go’s用于处理超时)。但是,当我通过etcdctl直接访问etcd集群时,我没有看到任何缓慢,所以我设置了一个tcpdump捕获,看看它是否能告诉我更多关于kube apiserver和etcd之间发生的事情。我在端口2379上进行了筛选,该端口是etcd的客户端请求端口:
tcpdump -i any port 2379
起初我并没有看到任何活动,所以我通过etcdctl直接查询etcd来强制活动。这起作用了,它显示了到2379港的预期流量
在这一点上,我仍然被卡住了,因为kube apiserver似乎根本没有调用etcd。但随后tcpdump的输出中出现了一些神秘的条目:
18:04:30.912541 IP master0.34480 > unallocated.barefruit.co.uk.2379: Flags [S], seq 1974036339, win 29200, options [mss 1460,sackOK,TS val 4294906938 ecr 0,nop,wscale 7], length 0
18:04:32.902298 IP master0.34476 > unallocated.barefruit.co.uk.2379: Flags [S], seq 3960458101, win 29200, options [mss 1460,sackOK,TS val 4294908928 ecr 0,nop,wscale 7], length 0
18:04:32.910289 IP master0.34478 > unallocated.barefruit.co.uk.2379: Flags [S], seq 2100196833, win 29200, options [mss 1460,sackOK,TS val 4294908936 ecr 0,nop,wscale 7], length 0
什么是unallocated.barefruit.co.uk?为什么主节点上的进程试图向其发出etcd客户端请求
谷歌快速搜索发现unallocated.barefruit.co.uk是一个DNS“增强”服务,可以重定向错误的DNS查询
我的节点没有在DNS中注册,因为这只是一个实验集群。我在/etc/hosts中有它们的条目,但仅此而已。显然,kube apiserver中有东西试图解析我的etcd节点名(例如master0.localdomain),并在/etc/hosts之前查询DNS(我一直认为/etc/hosts优先)。我的ISP(Verizon FIOS)没有拒绝无效的名称,而是使用这种“增强”DNS服务,重定向到unallocated.barefruit.co.uk,令人惊讶的是,它没有为我运行etcd群集
我编辑了主节点上的网络配置以证明我的假设,添加了指向谷歌服务器8.8.8.8和8.8.4.4的显式DNS设置,这些服务器没有“增强”。然后我重新启动了,集群立即启动
那么从昨晚到今天到底发生了什么变化?我的实验集群在我的笔记本电脑上运行,昨天我在办公室工作(没有FIOS),而今天我在家工作(连接到FIOS)。啊。谢谢Verizon
我仍然不确定为什么kube apiserver似乎优先考虑DNS而不是/etc/hosts。但我想教训是,要么确保节点名称具有有效的DNS条目,要么通过IP地址指定所有内容。有人认为哪种做法是最佳做法吗?我遇到了这个问题,通过删除主机操作系统上的/etc/kubernetes目录并重新安装k8s解决了这个问题。(使用Rancher)要查看证书上的DNS条目,您可以使用:
openssl x509-in/etc/kubernetes/ssl/kube etcd-$IP.pem-noout-text | grep DNS
tcpdump -i any port 2379
18:04:30.912541 IP master0.34480 > unallocated.barefruit.co.uk.2379: Flags [S], seq 1974036339, win 29200, options [mss 1460,sackOK,TS val 4294906938 ecr 0,nop,wscale 7], length 0
18:04:32.902298 IP master0.34476 > unallocated.barefruit.co.uk.2379: Flags [S], seq 3960458101, win 29200, options [mss 1460,sackOK,TS val 4294908928 ecr 0,nop,wscale 7], length 0
18:04:32.910289 IP master0.34478 > unallocated.barefruit.co.uk.2379: Flags [S], seq 2100196833, win 29200, options [mss 1460,sackOK,TS val 4294908936 ecr 0,nop,wscale 7], length 0