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,而我的containerPortporttargetPort 都是80

【问题讨论】:

是否有可能使用localhost 打这个?集群是否在 Docker 网络host 上运行?请说清楚。您也可以尝试kubectl port-forward pod/&lt;podname&gt; 8080:80curl localhost:8080 来验证 Pod IP 是否正常。 是的,当我运行kubectl port-forward pod/&lt;podname&gt; 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 没有监听的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes NodePort 自定义端口

无法访问 kubernetes nodeport 服务

SuSE 上的 Kubernetes:NodePort 服务问题

理解Kubernetes的NodePort、LoadBalancer和Ingress

Kubernetes NodePort 连接被拒绝

技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?