之前我们搭建的 k8s 集群只用了1台 master ,可用性不高,这两天开始搭建高可用集群,但由于之前用 kubeadm 命令创建集群时没有使用 --control-plane-endpoint 参数,无法直接升级现有集群,只能重新创建高可用(High-Availability)集群。

高可用集群的原理很简单,多台 master ,每台都保存集群数据(etcd),所有 nodes 通过专门搭建的负载均衡访问 api server ,这样当部分 master 宕机时,对集群正常运行无影响。

我们用了 3 台 master ,但是在第 1 台 master 服务器开始创建高可用的集群时,遇到了一个做梦也没想到的问题。

kubeadm init \
--kubernetes-version v1.16.3 \
--control-plane-endpoint "k8s-api:6443" --upload-certs \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=192.168.0.0/16 --v=6

为了省事,我们没有自己另外部署负载均衡,而是直接使用了阿里云内网负载均衡( 四层 tcp 转发),在 master 的 hosts 中将上面的 k8s-api 解析到阿里云负载均衡的 IP 。

但是创建集群总是失败,错误信息如下

[kubelet-check] Initial timeout of 40s passed.
I1217 08:39:21.852678 20972 round_trippers.go:443] GET https://k8s-api:6443/healthz?timeout=32s in 30000 milliseconds

排查后发现是因为阿里云四层负载均衡不支持转发请求给同一台服务器,也就是发请求的服务器与转发的后端服务器不能是同一台服务器。

后来我们采用了一个变通的方法解决了问题,在 master 服务器上不将 k8s-api 解析到负载均衡的 IP ,而是解析到 master 自己的 IP ,只在  nodes 上解析到负载均衡  IP 。

当我们搭建好高可用集群,还没来得及享受高上大的豪华邮轮,就遭遇一个奇怪的 dns 解析问题。在容器内解析主机名时速度很慢,有时解析成功,有时解析失败,不管是 k8s 的 service 名称,还是手工添加的 dns 解析记录,还是阿里云的 redis 服务,都有这个问题。dns 解析服务用的是 coredns ,pod 网络用的是 calico 。当时集群中有 3 台 maste 与 1 台 node ,开始以为是 k8s 网络的问题, 搭建这个集群时开始用的是 flannel 网络,后来改为 calico ,但折腾很长时间都无济于事,昨天晚上为此精疲力尽,一气之下在睡觉之前将集群中的所有服务器都关机。

今天开机后,又遇到了一个做梦也没想到的事情,问题竟然神奇的消失了,本以为这只是升级豪华邮轮过程中的一个小插曲。

今天下班前,又又遇到了一个做梦也没想到的事情,线上在用的之前搭建的只有 1 台 master 的非高可用集群中部分 nodes 也出现了同样的 dns 解析问题(用的是 flannel 网络),根据刚刚学到的经久不衰的绝招,将出现问题的 nodes 重启,问题立马消失。

2个不同的集群,使用的是不同的 pod 网络,而且使用的是不同的网络地址段(分别是 192.168.0.0/16 与 10.244.0.0/16),竟然出现了同样的 dns 解析问题,而且都通过重启可以解决,这个诡异的问题给我们的开船记出了一道难题。

但是由俭入奢易,由奢入俭难,豪华邮轮已经准备好了,我们再也不想开渔船了(docke swarm),不管怎么样,船还得继续开。

【更新】

12月19日 22:37:对于 dns 解析问题,根据 TianhengZhou 在评论中的建议部署了 nodelocaldns ,部署所采用的脚本如下。

sed 's/k8s.gcr.io/gcr.azk8s.cn\/google_containers/g
s/__PILLAR__DNS__SERVER__/10.96.0.10/g
s/__PILLAR__LOCAL__DNS__/169.254.20.10/g
s/__PILLAR__DNS__DOMAIN__/cluster.local/g' nodelocaldns.yaml |
kubectl apply -f -

参考资料:

* Nodelocal DNS Cache

* k8s域名解析超时问题记录

k8s 开船记:升级为豪华邮轮(高可用集群)与遇到奇怪故障(dns解析异常)的更多相关文章

  1. .Net Core2.1 秒杀项目一步步实现CI/CD(Centos7.2)系列一:k8s高可用集群搭建总结以及部署API到k8s

    前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署的,这个集群差不多搞了一周时间,关于k8s的知识点,我也是刚入门,这方面的知识建议参考博客园 ...

  2. 实现CI/CDk8s高可用集群搭建总结以及部署API到k8s

    实现CI/CD(Centos7.2)系列二:k8s高可用集群搭建总结以及部署API到k8s 前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署 ...

  3. [K8s 1.9实践]Kubeadm 1.9 HA 高可用 集群 本地离线镜像部署

    k8s介绍 k8s 发展速度很快,目前很多大的公司容器集群都基于该项目,如京东,腾讯,滴滴,瓜子二手车,北森等等. kubernetes1.9版本发布2017年12月15日,每是那三个月一个迭代, W ...

  4. lvs+keepalived部署k8s v1.16.4高可用集群

    一.部署环境 1.1 主机列表 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 lvs-keepal ...

  5. Centos7.6部署k8s v1.16.4高可用集群(主备模式)

    一.部署环境 主机列表: 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 master01 7.6. ...

  6. 阿里云搭建k8s高可用集群(1.17.3)

    首先准备5台centos7 ecs实例最低要求2c4G 开启SLB(私网) 这里我们采用堆叠拓扑的方式构建高可用集群,因为k8s 集群etcd采用了raft算法保证集群一致性,所以高可用必须保证至少3 ...

  7. Kubeadm 1.9 HA 高可用集群本地离线镜像部署【已验证】

    k8s介绍 k8s 发展速度很快,目前很多大的公司容器集群都基于该项目,如京东,腾讯,滴滴,瓜子二手车,易宝支付,北森等等. kubernetes1.9版本发布2017年12月15日,每三个月一个迭代 ...

  8. rabbitmq+ keepalived+haproxy高可用集群详细命令

    公司要用rabbitmq研究了两周,特把 rabbitmq 高可用的研究成果备下 后续会更新封装的类库 安装erlang wget http://www.gelou.me/yum/erlang-18. ...

  9. 配置drbd高可用集群

    前期准备: 同步时间 (两个节点) 节点一(172.16.21.6) [root@stu21 heartbeat2]# ntpdate 172.16.0.1 31 Dec 20:59:25 ntpda ...

随机推荐

  1. python:正则0

    Python3 正则表达式特殊符号及用法(详细列表) 正则表达式的强大之处在于特殊符号的应用,特殊符号定义了字符集合.子组匹配.模式重复次数.正是这些特殊符号使得一个正则表达式可以匹配字符串集合而不只 ...

  2. Grid表格的js触发事件

    没怎么接触过Grid插件: 解决的问题是:点击Grid表行里的内容触发js方法弹出模态框,用以显示选中内容的详细信息. 思路:给准备要触发的列加上一个css属性,通过这个css属性来获取元素并触发js ...

  3. 学习记录:《C++设计模式——李建忠主讲》2.面向对象设计原则

    1.课程内容: 重新认识面向对象:面向对象设计原则: 2.重新认识面向对象 1)理解隔离变化:从宏观层面来看,面向对象的构建方式更能适应软件的变化,将变化所带来的影响减为最小: 2)各司其职:从微观层 ...

  4. HTTP基础及telnet简单命令

    一.HTTP概况 20世纪90年代初期,一个主要的新兴应用即万维网(World Wide Web)登上了舞台.Web是一个引起公众注意的因特网应用.Web的应用层协议是超文本传输协议(HTTP),它是 ...

  5. [Odoo12基础教程]之开发过程中可能出现的问题

    可能出现的问题 更改代码后无变化 当你对代码进行更改之后,发现页面并没有变化,那么请尝试依次以下几种办法: 1.重启项目: 2.升级模块: 3.在开发者模式下刷新本地模块列表: 4.给data列表添加 ...

  6. pyinstaller打包python文件成exe(原理.安装.问题)

    py文件打包成exe文件的方式一共有三种:py2exe.PyInstaller和cx_Freeze 本文分四个步骤来详讲如何用PyInstaller将py文件打包成exe文件 1. PyInstall ...

  7. python中将xml格式转json格式

    一.简介 在用python写脚本时,通常需要处理xml格式的文件或字符串.由于json格式处理的方便性, 我们可将其转为json格式进行处理. 二.步骤 1.安装工具包xmltodict 在命令行输入 ...

  8. yum运行报错:File "/usr/libexec/urlgrabber-ext-down", line 28

    [root@sdw1 bin]# vim /usr/libexec/urlgrabber-ext-down 再次执行yum命令,正常下载

  9. Spring Boot2 系列教程(二十八)Spring Boot 整合 Session 共享

    这篇文章是松哥的原创,但是在第一次发布的时候,忘了标记原创,结果被好多号转发,导致我后来整理的时候自己没法标记原创了.写了几百篇原创技术干货了,有一两篇忘记标记原创进而造成的一点点小小损失也能接受,不 ...

  10. 【项目管理】Mybatis-Generator之最完美配置详解

    今天看到了一篇总结特别详细的关于Mybatis-Generator配置文件的文章,特转载进行记录学习使用. 先附上原文地址链接:张思全----全哥文章 <?xml version="1 ...