目录

k8s/k3s/minikub coredns 启动失败报错 listen tcp :53: bind: permission denied

一、问题

使用 k8s/k3s/minikub 部署启动时,服务 coredns 启动失败,如下:

[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)    16m

一直处于 CrashLoopBackOff 状态

二、原因

查看报错原因

[root@master ~]# kubectl -n kube-system describe pod coredns-2ssxlsqw122-qx222

从输出的结果可以看到: listen tcp :53: bind: permission denied

 listen tcp :53: bind: permission denied

翻译过来的意思就是 53 端口权限不足

这是因为 在 Linux 系统中,小于 1024 的端口被认为是特权端口,只有 root 用户 或具有相应权限的进程才能绑定。

所以这里报错的主要原因可能是:

  • 部署的 k8s 的 coredns 服务默认监听 53 端口,并且是以非特权用户运行
  • 您可能正在 Centos 系统上部署官方的 minukube(简易版的 k8s)
  • 您可能正在 Centos 系统上部署 k3s

三、解决

知道原因之后,那么相对应地也有一些解决方法,有以下几种(亲测有效)

(一)重装更换系统(推荐)

如果你现在用的操作系统刚好是 centos 7 版本及之前(有些不会出现这个问题)

那么可以升级操作系统为 Centos 8、OpenCloud OS8、OpenCloud OS9 等都可以解决(亲测可用)

(二)修改coredns 运行权限

既然没有特权,那么就给它特权:强制 CoreDNS 以 root 用户运行(可能带来安全风险):

kubectl edit deployment coredns -n kube-system
containers:
- name: coredns
  image: coredns/coredns:1.8.6
  securityContext:  # 添加此部分
      runAsUser: 0  # 使用 root 用户
    capabilities:
      add: ["NET_BIND_SERVICE"]
    allowPrivilegeEscalation: false

保存后 coredns 会自动重启,然后就可以了

⚠️⚠️⚠️:该方式存在一定方式,不建议生产环境使用

版权声明

未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!

本文原文链接: https://fiveyoboy.com/articles/k8s-err-1/

备用原文链接: https://blog.fiveyoboy.com/articles/k8s-err-1/