Kubernetes NodePort 未监听

A G*_*A G 1 nginx kubernetes k3s

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

结果节点端口为 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
Run Code Online (Sandbox Code Playgroud)

但是 wget 不起作用:

:~$ wget localhost:31747
Connecting to localhost:31747 ([::1]:31747)
wget: can't connect to remote host: Connection refused
:~$
Run Code Online (Sandbox Code Playgroud)

我错过了什么?我已经确保我的标签都写着app: nginx和 my containerPortport并且targetPort都是 80

pst*_*pst 5

问题是,NodePort 范围是否从主机映射到充当节点的 docker 容器。该命令docker ps将向您显示,有关更多详细信息,您可以docker inspect $container_id查看Ports下面的属性NetworkSettings。我没有 k3d,但这里有一个来自 kind 的例子。

\n
$ docker ps\nCONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                       NAMES\n1d2225b83a73        kindest/node:v1.17.0          "/usr/local/bin/entr\xe2\x80\xa6"   18 hours ago        Up 18 hours         127.0.0.1:32769->6443/tcp   kind-control-plane\n
Run Code Online (Sandbox Code Playgroud)\n
$ docker inspect kind-control-plane\n[\n    {\n        # [...]\n        "NetworkSettings": {\n            # [...]\n            "Ports": {\n                "6443/tcp": [\n                    {\n                        "HostIp": "127.0.0.1",\n                        "HostPort": "32769"\n                    }\n                ]\n            },\n        # [...]\n    }\n]\n
Run Code Online (Sandbox Code Playgroud)\n

如果不是,kubectl port-forward按照评论中的建议进行操作可能是最简单的方法。或者,开始研究 Ingress。Ingress 是在集群外部公开工作负载的首选方法,并且在这种情况下,它们支持Ingress。看来 k3d 也有办法将入口端口映射到主机

\n