最近,在尝试解决“大”DNS查询(当答案大于512M)时,我们在EKS上基于Alpine image(节点:12.18.1-Alpine)的微服务遇到了一些DNS问题。
因此,我尝试运行此脚本来测试DNS解析:
var dns = require('dns');
var w3 = dns.lookup('hugedns.test.dziemba.net', function (err, addresses, family) {
console.log(addresses);
});
每个图像有两种不同的场景
据我所见,Alpine正在使用musl(不支持DNS使用TCP?)库而不是glibc,因为DNS协议使用UDP,并且仅当查询大于512M时才尝试返回TCP。所以我的理论是,这是根本原因,但由于它在我这方面起作用,EKS的失败让我想知道问题在哪里传递。。。
有什么想法吗?
EKS v1。16:v1。6.6
顺便说一句,这是我的第一篇帖子,如果需要任何信息,请告诉我
你需要在alpine上安装bind工具,你可以将它添加到你的Dockerfile中:
apk add bind-tools
是的,已知在Kubernetes集群中,Alpine映像在DNS查询方面存在问题。
即使不清楚该错误是否已在任何当前版本的阿尔卑斯山中得到有效修复,以下是一些相关链接:
截至2021年1月,我在库伯内特斯集群中遇到了这个问题,那里有最新的阿尔卑斯山3.12图像,所以我认为它没有修复。
核心问题似乎是musl
库在给定名称的/etc/resolv.conf
的search
指令中指定的可能域中停止搜索,如果任何响应是意外的(基本上不是什么明确表示FQDN找不到,或者已经找到)。
这不符合库伯内特斯关于豆荚名称解析的策略。
事实上,我们可以看到典型的/etc/resolv。
示例
命名空间中pod的配置如下所示:
nameserver 10.3.0.10
search example.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
策略是解析名称,例如
myservice
或www.google。com
,将针对搜索
指令中指定的每个域进行测试:这里的示例是FQDN链我的服务。实例svc。簇本地
,我的服务。svc。簇本地
,我的服务。簇本地
,我的服务
和www.google。通用域名格式。实例svc。簇本地
,www.google。通用域名格式。svc。簇本地
,www.google。通用域名格式。簇本地
,www.google。com
。很明显,第一个链(my service.example.svc.cluster.local
)的第一个FQDN和第二个链(www.google.com
)的最后一个FQDN将得到正确解析。
您可以看到,此策略是为了优化集群内部名称的解析而制定的,其方式允许使用诸如
my service
,my service之类的名称。我的命名空间
或我的服务。我的名字空间。svc
可以很好地解决开箱即用的问题。
<代码> Nodos参数在代码>选项/代码>指令中定义了名称中的最小点数,以考虑名称实际上是FQDN,因此应该跳过搜索链以支持直接DNS解析尝试。通过
ndots:2
,www.google。com
将被视为FQDN,而我的服务。我的命名空间
将通过搜索链。
鉴于
search
选项覆盖3个可能的域,任何明显的URL都不会被视为FQDN,因为ndots:5
和Alpine docker中musl
库中的搜索循环中断,所有这些都大大增加了在Kubernetes运行的Docker Alpine中主机解析失败的可能性。如果主机解析是定期运行的某种循环的一部分,那么您将遇到许多需要处理的故障。
对此该怎么办?
可以使用<代码> DNSPOLICY 还原<代码> NDOS并考虑更短的名称为FQDN,跳过搜索循环(参见https://pracucci.com/kubernetes-dns-resolution-ndots-options-and-why-it-may-affect-application-performances.html)
- 您可以为图像生成一个入口点脚本,该脚本将修改
/etc/resolv。根据您的需要配置,例如cat/etc/resolv。conf | sed-r“s/^(搜索。*|选项。*)/#\1/”
就我个人而言,我从阿尔卑斯开始,就像我们在Docker工业化早期的许多人一样,因为其他完整的操作系统映像非常大。对于Ubuntu或Debian,甚至像Ubi这样以库伯内特斯为中心的计划,这种情况已经不再存在了。这就是为什么我通常选择最后一个选择(远离阿尔卑斯山图像)。
我打算有一个带有Jenkins的光盘管道,它接受我的应用程序,将码头工人映像发布到我的私人码头工人存储库。我想我知道怎么做。 我不确定的是库伯内特斯部分。我想把那个图像部署到我的私人库伯内特斯集群(目前是1个主集群) 问:安装了 kubectl 和 docker 的詹金斯从站是否需要成为 Kubernetes 集群的一部分才能触发部署?如何触发该部署?
我有一个小麻烦试图把一个阿尔卑斯linux容器。 我的Dockerfile很简单,但我一直得到一个错误,我以前从未见过。 我的文件如下:; 我看到的错误如下: 我不明白发生了什么事。 有人能解释一下吗?我以前从未使用过Alpine Linux。
我正在寻找一个基于alpine的openjdk 17 docker图像。看起来我们这里有一个 https://hub.docker.com/layers/openjdk/library/openjdk/17-alpine/images/sha256-a996cdcc040704ec6badaf5fecf1e144c096e00231a29188596c784bcf858d05?context=ex
我是Kubernetes的新手,开始阅读文档。通常使用“endpoint”一词,但文档中缺乏明确的定义。 Kubernetes的“终点”是什么?它位于哪里? 我可以想象“endpoint”是单个“节点”的某种接入点,但这只是猜测。
我有一个朋友允许我访问他的kube集群(托管在IBM云上)。 我可以通过IBM云控制台登录 但是,当我试图通过kubectl访问它们时:kubectl get节点 结果显示一条错误消息: 服务器错误(禁止):节点被禁止:用户https://iam.ng.bluemix.net/kubernetes#无法在群集范围内列出节点。 为什么控制台和CLI之间的访问(RBAC)会有所不同?
null