Kubernetes NodePort 没有监听
Posted
技术标签:
【中文标题】Kubernetes NodePort 没有监听【英文标题】:Kubernetes NodePort not listening 【发布时间】:2020-11-17 07:17:36 【问题描述】:我正在使用 k3d(docker 中的 k3s)做一些教程,我的 yml 看起来像这样:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
生成的节点端口为 31747:
:~$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 18m
nginx NodePort 10.43.254.138 <none> 80:31747/TCP 17m
:~$ kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 172.18.0.2:6443 22m
nginx 10.42.0.8:80 21m
但是 wget 不起作用:
:~$ wget localhost:31747
Connecting to localhost:31747 ([::1]:31747)
wget: can't connect to remote host: Connection refused
:~$
我错过了什么?我确保我的标签都写着app: nginx
,而我的containerPort
、port
和targetPort
都是80
【问题讨论】:
是否有可能使用localhost
打这个?集群是否在 Docker 网络host
上运行?请说清楚。您也可以尝试kubectl port-forward pod/<podname> 8080:80
和curl localhost:8080
来验证 Pod IP 是否正常。
是的,当我运行kubectl port-forward pod/<podname> 8080:80
wget 工作时。
【参考方案1】:
也许,您的 pod 正在另一个工作节点上运行,而不是 localhost。您应该使用正确的节点 ip。
【讨论】:
OP 将如何确认这一点?【参考方案2】:原来我在创建集群时没有暴露端口
https://k3d.io/usage/guides/exposing_services/
【讨论】:
【参考方案3】:问题是,NodePort 范围是否从主机映射到充当节点的 docker 容器。命令docker ps
将向您显示,有关更多详细信息,您可以docker inspect $container_id
并查看NetworkSettings
下的Ports
属性。我没有 k3d,但这里有一个来自 kind 的示例。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d2225b83a73 kindest/node:v1.17.0 "/usr/local/bin/entr…" 18 hours ago Up 18 hours 127.0.0.1:32769->6443/tcp kind-control-plane
$ docker inspect kind-control-plane
[
# [...]
"NetworkSettings":
# [...]
"Ports":
"6443/tcp": [
"HostIp": "127.0.0.1",
"HostPort": "32769"
]
,
# [...]
]
如果不是,按照评论中的建议使用kubectl port-forward
可能是最简单的方法。或者,开始调查 Ingress。 Ingress 是在集群外部公开工作负载的首选方法,在这种情况下,they have support 用于 Ingress。看来k3d也有办法map the ingress port to the host。
【讨论】:
感谢您的链接,我需要阅读有关 ingress 与 nodeport 服务的信息,但看起来 ingress 确实是要走的路以上是关于Kubernetes NodePort 没有监听的主要内容,如果未能解决你的问题,请参考以下文章
SuSE 上的 Kubernetes:NodePort 服务问题