k8s/k3s/minikub coredns 启动失败报错 listen tcp :53: bind: permission denied
背景
最近在学习使用 k8s ,由于机器性能配置比较低,因此使用的是官方推荐的、仅供学习的搭建方法,
使用精简版 minikub / k3s 进行部署,根据官方的介绍,精简版虽然阉割了很多功能,但是核心功能和 k8s 是几乎一样的,并且占用内存更少,推荐学习使用,
然而在使用 k8s/k3s/minikub 部署启动服务时,出现一个错误,服务 coredns 启动失败,一直处于 CrashLoopBackOff 状态 ,如下:
[root@master ~]# kubectl get pod -A | grep coredns
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-2ssxlsqw122-qx222 0/1 CrashLoopBackOff 1 (15s ago) 17s
kube-system coredns-7212sx22sd2-cw2sf 0/1 CrashLoopBackOff 1 (14s ago) 16mcoredns pod 的状态一直处于 CrashLoopBackOff 状态,也就是内部启动报错,无法正常启动成功
一行 “listen tcp :53: bind: permission denied” 直接点明了问题——53端口绑定权限不够
原因
报错里的53端口不是普通端口,是 DNS 服务的默认端口,系统级的 DNS 服务(比如 Linux 的 systemd-resolved、dnsmasq)都会抢占这个端口。
而 CoreDNS 作为 K8s 集群的核心 DNS 组件,默认也会监听53端口提供服务。
当集群节点上的系统服务已经占用53端口时,CoreDNS 再去绑定就会触发权限拒绝——不是容器没权限,而是端口早被“占坑”了。
另外还有一种情况:部分系统对 1024 以下特权端口有限制,非 root 用户启动的进程无法绑定,不过在容器环境里这种情况较少见,核心还是端口占用。
可通过 describe 命令查看报错原因,如下
[root@master ~]# kubectl -n kube-system describe pod coredns-2ssxlsqw122-qx222从输出的结果可以看到: listen tcp :53: bind: permission denied
listen tcp :53: bind: permission denied这里报错的主要原因极可能是:
- 部署的 k8s 的 coredns pod 服务默认监听 53 端口,并且 k8s 是以非特权用户运行
- 您可能正在 Centos 系统上部署官方的 minukube 版 k8s(简易版的 k8s)
- 您可能正在 Centos 系统上部署 k3s
解决
在知道原因之后,那么相对应地也有一些解决方法,通过实操亲测以下几种可以完美解决
(一)重装更换系统(推荐)
如果你现在用的操作系统刚好是 centos 7 版本及之前(有些可能不会出现这个问题)
那么可以尝试升级操作系统为 Centos 8、OpenCloud OS8、OpenCloud OS9 等都可以解决(基本上都试过,亲测可用)
(二)修改coredns 运行权限
既然 53 端口没有特权,那么就给它特权:强制 CoreDNS 以 root 用户运行(说明:可能带来安全风险,所以这种方式并不推荐):
kubectl edit deployment coredns -n kube-systemcontainers:
- name: coredns
image: coredns/coredns:1.8.6
securityContext: # 添加此部分
runAsUser: 0 # 使用 root 用户
capabilities:
add: ["NET_BIND_SERVICE"]
allowPrivilegeEscalation: false保存后 coredns 会自动重启,然后就可以了
⚠️⚠️⚠️:这种方式存在一定风险,不建议在生产环境使用
总结
其实不管是哪种环境,解决“53端口权限拒绝”的核心就两种:
-
更换操作系统
-
修改运行权限
解决方法(推荐):升级机器操作系统:Centos 8、OpenCloud OS8、OpenCloud OS9等(亲测都不会有这个问题)
如果还有其他坑,欢迎在评论区补充~
版权声明
未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!