首页 > 解决方案 > 使用 Docker Desktop 在未定义端口上公开服务

问题描述

我的环境:Windows 10 + WSL2 + Docker 桌面(k8s v1.19.7)

我创建了一个小型示例应用程序。它在 [ip:80]/Converter 上返回“它可以工作”

我已将应用程序打包在一个容器中。当我这样运行它时:

docker run -d -p 80:80 [imagename]

它在 [ip:80]/Converter 上返回“它可以工作”

然后我定义了一个deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: escape
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      bb: escape
  template:
    metadata:
      labels:
        bb: escape
    spec:
      containers:
      - name: escape
        image: [imagename]
        ports:
          - containerPort: 80
            protocol: TCP

这给了我 3 个容器运行的 pod。

然后我为我的部署创建一个服务:

kubectl expose deployment escape --type=LoadBalancer --name=escape-service

列出服务:kubectl get services

escape-service   LoadBalancer   10.105.198.65   localhost     80:32496/TCP   17m
kubernetes       ClusterIP      10.96.0.1       <none>        443/TCP        25m

这会暴露服务,但我无法访问它:http://localhost:32496/converter

那么如何在 Kubernetes 集群之外访问我的服务呢?

我试过什么:谷歌搜索让我:Docker Desktop + k8s plus https proxy multiple external ports to pods on http in deployment? 但由于它在 Hyper-V 上运行,我猜它不同

我安装了镜头(https://k8slens.dev/

这给出了服务的概述:

截屏

单击80:32496/TCP链接打开浏览器到http://localhost:59394 当我手动将其后缀为

http://localhost:59394/Converter

我得到“它有效”的回应。

端口转换如何在 Docker Desktop for Windows + WSL2 上工作?我如何在59394不求助于 Lens 的情况下找到端口?

另外,当我尝试列出入口时,似乎我没有任何 kubectl describe ingress

警告:extensions/v1beta1 Ingress 在 v1.14+ 中已弃用,在 v1.22+ 中不可用;使用networking.k8s.io/v1 Ingress
在默认命名空间中找不到资源。

标签: windowsdockerkuberneteskubernetes-ingress

解决方案


所以诀窍是当你点击服务时,Lens 会自动为你创建一个隧道。

要正确公开服务,请在服务定义上指定 nodePort。

ports:
  - nodePort: 30080
    protocol: TCP
    port: 80
    targetPort: 8080

这将在所有节点上公开服务。这在 Docker for desktop 或 minikube 上不起作用,但如果您设置一个真正的集群,它就可以正常工作。


推荐阅读