我需要一些关于调试错误的帮助: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,但我看不到任何线索。谢谢!
附加信息:我在容器中运行了以下内容:
# 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:
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发布于 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。
发布于 2019-08-30 20:02:26
我不可能在docker for mac上设置这个,但似乎你应该在你的Docker VM中验证你的端口:
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)
如果有帮助,请让我知道。
发布于 2021-11-17 19:42:27
我也有这个问题的信息。在我的例子中,容器的定义中使用了port:
hostPort: 80
hostIP: 127.0.0.1我删除了这些定义和它的工作原理。在我的场景中,我正在测试HPA,副本没有运行,因为没有空闲的端口,就像你的问题一样。它只运行了一个pod,第一个运行的pod,其他的(副本),它处于Pending状态。
我的解决方案是使用服务NodePort向主机公开端口,并删除hostPort和hostIP。
https://stackoverflow.com/questions/57614818
复制相似问题