Sunday, August 31 2025

dnsmasq ipv6 域名解析踩坑

近来把 K8S 节点的操作系统升级了下,结果有个容器起不来了,日志报错:

File "/usr/lib/python3.12/site-packages/requests/adapters.py", line 700, in send raise ConnectionError(e, request=request) requests.exceptions.ConnectionError: HTTPConnectionPool(host='es1', port=9200): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f>: Failed to establish a new connection: Errno -3 Try again'))

不能建立新连接,也没说具体哪里不行,问了下 GPT 才知道 Errno -3 不是 urllib 的报错,是 getaddrinfo 定义的,-3 就是域名解析不了。 ( urllib3 v2.0 之后会提示 Failed to resolve )

同节点的容器都运行的好好的,怎么会有解析问题,直接抓包,实际ipv4解析都是成功的,只是ipv6无结果,没毛病啊,咱还没用上 ipv6 呢。

将容器调度到没升级的节点上,顺利启动,抓包看了下解析一模一样,怎么在新节点上就报无法解析了呢?突然发现 ipv6 解析结果有个 refused 标记:

Standard query response 0xfe14 Refused AAAA es1 OPT

看来可能和 ipv6 解析有关系,突然想起 alpine 镜像存在这个毛病,因为它用的是 musl libc (未实现Happy Eyeballs) ,解析域名时会优先把 ipv6 解析排在前面。 赶紧看下容器的基础镜像,果然是 alpine 啊,可是我们没有用 ipv6 啊,进入容器来看,发现升级后的节点,容器里 ipv6 被启用了!怎么回事? 此时想起升级操作系统后, docker 的版本也升级了,从 v20 -> v 27,好家伙,据说 docker 从 v26开始默认启用 ipv6了,官方给的禁用办法是加启动参数:

--sysctl net.ipv6.conf.all.disable_ipv6=1

这很不优雅,想来想去,去其他集群上抓包,ipv6解析返回虽然是空,但是没看到Refsued标记:

Standard query response 0x0181 AAAA es1 OPT

可能是这个拒绝标记捣鬼,马上实验相同容器条件,结果启动成功,看来只要去掉这个拒绝标记就行了。 我们DNS服务是用的dnsmasq,对比了下两个集群的配置,发现有 Refused 标记的少一个配置:

--domain-needed

Tells dnsmasq to never forward A or AAAA queries for plain names, without dots or domain parts, to upstream nameservers. If the name is not known from /etc/hosts or DHCP then a "not found" answer is returned.

明白了,没有点的域名,如 es1 这样的开启这个配置,就不会发给上游,并返回无结果。配上参数再试,果然就没有 Refsued 标记了!

那正常有点的域名如 es1.com 就会发给上游了?结果会 Refused 吗。但是我们内网dnsmasq全是没有上游的啊,两个集群的 dnsmasq 测试结果居然还不一样,一个拒绝,一个无拒绝。 还得问 GPT ,原来 dnsmasq v2.86 实现了 RFC-8914 extended DNS errors (EDE) , 所以这个版本之后都会拒绝,日志里也能看到:

dnsmasq: config error is REFUSED (EDE: not ready)

小于这个版本的就不会有拒绝,是正常的空(实际是NOERROR):

dnsmasq: config es1.com is NODATA-IPv6

嗯,先这样吧,看来要好好学习下 ipv6 了。

Wednesday, February 26 2025

PKI根证书轮转

为了方便,自己弄了个私有的PKI,没想到多年过去,根证书快要到期了,还好看过 Let's Encrypt 更新证书,要平滑轮转的话: 用老根证书 OldCA 把新根证书 NewCA 当作中间证书给签一下得到证书 NewCA2 用 NewCA 签发所有需要的证书文件 example.com.crt 将 example.com.crt 和 NewCA2 合并到一起更新到 nginx 上 此时,无论客户端有 OldCA 还是 NewCA 都可以正常访问 接下来给所有客户端安装新的根证书 NewCA 最后删除 nginx 上的过渡证书 NewCA2 第一步的签署命令用openssl的如下  […]

Continue reading

Sunday, February 23 2025

最近Gnome升级到46遇到的2个问题

第一个是 Gnome 的文件管理器、属性设置等界面文字都显示不全了,有时鼠标经过才会显示出来,后来碰巧逛到帖子说可能是渲染设置问题,可以通过 GSK_RENDERER=help nautilus 查看支持的渲染器,然后挨个试下,我换成 opengl 就好了 第二个则是窗口不显示了,所有程序在任务栏可以看到已经启动,但是看不到窗口,后来发现是 mutter 强依赖了 wayland 导致,而我还在用 Xorg,重新编译下就好了 USE=wayland emerge -av mutter

Sunday, January 26 2025

优化下OOM告警

Linux 发生 OOM 的时候,node-exporter 自带的指标只能报告有发生过 OOM,但是细节一概没有,还需要自己去查看,不太方便快速判断,也无法对一些特定 OOM 进行消音。 简单搜索了一下,好像也没有找到现成的方案,那就自己写一个能提供更多OOM信息的工具 sysoom ,原理就是分析内核OOM日志,获取我关心的一些信息,比如被杀的进程名字,占用的内存大小,所属 cgroup 等。 结合 alertmanager  […]

Continue reading

Sunday, October 13 2024

爱是自然而然的

最近看了《爱的艺术》,核心观点就是爱其实是一种博爱,能爱陌生人的爱才是爱。 假设一个人只爱他的对象,而对其他人无动于衷,那就不是爱,而是一种高级点的自私,我还是挺赞同的。 书里说到母爱是一种无条件的爱,我倒是觉得所有的爱都是有条件的,只是一些爱的回报不明显,或是他人感知不到罢了。 只要回报产生,爱就可以持续,比方说爱情到底是什么呢,梁老师的爱情课上说:爱情就是一个又一个打动你的瞬间,每一个瞬间都可以令人回味,只要这些瞬间能持续不断的产生,爱情就可以持续下去,如果这样的瞬间越来越少,爱就会慢慢消退。

Sunday, May 19 2024

把博客搬到龙芯笔记本(yeeloong)上了

最近看到极客逻辑买了一堆龙芯板子组了个集群,突然想起自己也有一个龙芯啊。大约是十年前龙芯团购 里买的逸珑 (yeeloong) 8089D,价格非常便宜,纯粹是买来做个纪念的。 趁周末翻箱倒柜给找出来了,想想跑一个博客应该不成问题,说干就干,开机启动,系统是十年前的 Lemote Yeeloong Gentoo Desktop ,可惜忘记了密码,试了半天,发现还是默认密码没改呢。系统太老了,到社区看了下,已经找不到当时的项目目录了,瞅了眼 Debian 也就支持到 jessie 为止,还2018年的系统,仍然太老。 多亏了论坛里 XiaoaiX 提醒,可以直接用 mips3 的 stage3  […]

Continue reading

Sunday, August 13 2023

apisix-dashboard etcd 踩坑记

想用apisix做网关,先在测试环境开搞。 首先需要一套etcd,为了方便就用helm起了一套,顺便启用了tls,结果helm装apisix时遇到问题,etcd居然连不上,似乎证书认证支持有问题 ref1, ref2,只好先设置不检查证书(verify: false)。  […]

Continue reading

Thursday, March 9 2023

maven构建加速

研发同学希望加速构建过程以便更快的部署测试,并找来了官方软件 mvnd,直接用mvnd替换mvn命令即可,提速很明显,平均约30%,模块越多,提速越多。 下面是当前用的配置,为了稳定常驻后台,避免jenkins job跑完就退出,宿主机弄了定时任务,并发跑三个构建(空项目,就一个pom,内含sleep插件)就会启动好三个mvnd在后台待命。 mvnd.logPurgePeriod = 7d mvnd.idleTimeout = 6 hours mvnd.threads = 16 mvnd.minHeapSize = 1G mvnd.maxHeapSize = 3G  […]

Continue reading

- page 1 of 36