windows - 使用 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
在默认命名空间中找不到资源。
解决方案
所以诀窍是当你点击服务时,Lens 会自动为你创建一个隧道。
要正确公开服务,请在服务定义上指定 nodePort。
ports:
- nodePort: 30080
protocol: TCP
port: 80
targetPort: 8080
这将在所有节点上公开服务。这在 Docker for desktop 或 minikube 上不起作用,但如果您设置一个真正的集群,它就可以正常工作。
推荐阅读
- rest - 由于最大结果为 20,Google Plus API 对大型请求的响应时间很慢。
- strongloop - 环回休息连接器远程方法不起作用
- postgresql - 提高PostgreSQL的数据插入速度
- python - 如何在列中拆分 dict 类型的 pandas 列?
- android - 包含 2 部分而不是 3 部分的 Android 包名称
- sql - 根据特定材料从同一列中选择每第 2、第 4 行等
- python - 如何从每日 (FRED) 报价中找到季度末的汇率值?
- xaml - 如何从 GridView 中获取选定的项目
- python - 为什么 Django-simple-math-captcha 不呈现问题?
- mysql - 仅使用 select 和 case 语句分别内联查找正数和负数的总数