首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用设置` `hostNetwork: true`和`NET_BIND_SERVICE`调试“没有空闲端口”错误

如何使用设置` `hostNetwork: true`和`NET_BIND_SERVICE`调试“没有空闲端口”错误
EN

Stack Overflow用户
提问于 2019-08-23 02:00:00
回答 3查看 12.4K关注 0票数 5

我需要一些关于调试错误的帮助:0/1 nodes are available: 1 node(s) didn't have free ports for the requested pod ports.,有人能帮帮我吗?

我正在尝试使用Docker Desktop风格的Kubernetes在Mac (第一个)上运行pod,版本是2.1.0.1 (37199)。我想尝试使用hostNetwork模式,因为它的效率和需要打开的端口数量(以数千为单位)。在只设置了hostNetwork: true的情况下,没有错误,但我也看不到主机上打开的端口,也看不到容器内部的主机网络接口。因为我还需要打开端口443,所以我添加了NET_BIND_SERVICE的功能,也就是它开始抛出错误的时候。

我在容器中运行了lsof -i (ubuntu18.04),然后在我的Mac上运行了sudo lsof -i,我没有看到任何冲突。然后,我也查看了/var/lib/log/containers/kube-apiserver-docker-desktop_kube-system_kube-apiserver-*.log,但我看不到任何线索。谢谢!

附加信息:我在容器中运行了以下内容:

代码语言:javascript
复制
# ss -nltp
State  Recv-Q  Send-Q     Local Address:Port      Peer Address:Port
LISTEN 0       5                0.0.0.0:10024          0.0.0.0:*      users:(("pnnsvr",pid=1,fd=28))
LISTEN 0       5                0.0.0.0:2443           0.0.0.0:*      users:(("pnnsvr",pid=1,fd=24))
LISTEN 0       5                0.0.0.0:10000          0.0.0.0:*      users:(("pnnsvr",pid=1,fd=27))
LISTEN 0       50               0.0.0.0:6800           0.0.0.0:*      users:(("pnnsvr",pid=1,fd=14))
LISTEN 0       1                0.0.0.0:6802           0.0.0.0:*      users:(("pnnsvr",pid=1,fd=13))
LISTEN 0       50               0.0.0.0:443            0.0.0.0:*      users:(("pnnsvr",pid=1,fd=15))

然后,我在我的Mac (主机)上运行netstat,并搜索这些端口,但我找不到冲突。如果需要,我很乐意提供netstat (767行)的输出。

以下是yaml:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pnnsvr
  labels:
    app: pnnsvr
    env: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pnnsvr
      env: dev
  template:
    metadata:
      labels:
        app: pnnsvr
        env: dev
    spec:
      hostNetwork: true
      containers:
      - name: pnnsvr
        image: dev-pnnsvr:0.92
        args: ["--root_ip=192.168.15.194"]
        # for using local images
        imagePullPolicy: Never
        ports:
        - name: https
          containerPort: 443
          hostPort: 443
        - name: cport6800tcp
          containerPort: 6800
          hostPort:  6800
          protocol: TCP
        - name: cport10000tcp
          containerPort: 10000
          hostPort: 10000
          protocol: TCP
        - name: cport10000udp
          containerPort: 10000
          hostPort: 10000
          protocol: UDP
        - name: cport10001udp
          containerPort: 10001
          hostPort: 10001
          protocol: UDP
        #test
        - name: cport23456udp
          containerPort: 23456
          hostPort: 23456
          protocol: UDP
        securityContext:
          capabilities:
            add:
              - SYS_NICE
              - NET_BIND_SERVICE
              - CAP_SYS_ADMIN
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-05 07:58:26

我意外地解决了这个问题,我通过弹跳pod来解决这个问题,而不是使用kubectl apply -f ...。在弹出pod后不久,新的pod将成为go。我的理论是,Kubernetes会带来一个新的pod,并在杀死旧pod之前准备好一切。由于旧的pod仍有打开的端口,因此新的pod将看到这些端口被占用,从而触发错误:0/1 nodes are available: 1 node(s) didn't have free ports for the requested pod ports

票数 4
EN

Stack Overflow用户

发布于 2019-08-30 20:02:26

我不可能在docker for mac上设置这个,但似乎你应该在你的Docker VM中验证你的端口:

代码语言:javascript
复制
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

请考虑您是否可以更改默认节点端口范围(--service-node-port-range portRange-Default: 30000-32767)在这里您可以找到很好的帖子如何在docker for mac中做到这一点

请记住,根据最佳实践,使用hostNetwork: true并不是一个好的解决方案。

根据文档:

除非绝对必要,否则不要为Pod指定hostPort。当您将Pod绑定到hostPort时,它会限制Pod可以调度的位置数,因为每个组合必须是唯一的。如果不显式指定TCP和协议,Kubernetes将使用0.0.0.0作为默认hostIP,使用TCP作为默认协议。出于与hostPort相同的原因,避免使用hostNetwork。

如果您需要显式地在节点上公开Pod的端口,请在求助于hostPort之前考虑使用NodePort服务。

配置Pod或容器https://kubernetes.io/docs/tasks/configure-pod-container/security-context/的安全上下文

若要指定容器的安全设置,请在容器清单中包括securityContext字段。securityContext字段是一个SecurityContext对象。为容器指定的安全设置仅适用于单个容器,当存在重叠时,它们会覆盖在Pod级别所做的设置。容器设置不会影响实例的音量。

请注意,对于POD的securityContext,请注意:

runAsGroup字段指定Pod任何容器内所有进程的主组ID为3000。如果省略该字段,则容器的主组ID为root(0)

如果有帮助,请让我知道。

票数 2
EN

Stack Overflow用户

发布于 2021-11-17 19:42:27

我也有这个问题的信息。在我的例子中,容器的定义中使用了port:

代码语言:javascript
复制
 hostPort: 80
 hostIP: 127.0.0.1

我删除了这些定义和它的工作原理。在我的场景中,我正在测试HPA,副本没有运行,因为没有空闲的端口,就像你的问题一样。它只运行了一个pod,第一个运行的pod,其他的(副本),它处于Pending状态。

我的解决方案是使用服务NodePort向主机公开端口,并删除hostPorthostIP

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57614818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档