docker - 通过 kubectl 暴露服务时,从节点主机上没有监听端口
问题描述
我正在建立一个 kubernetes 集群,有一个主节点(一台物理 miniPC,运行 ubuntu 服务器 18.04)和一个从节点(一台笔记本电脑,运行 ubuntu 16.04)。
Docker 是我与 Kubernetes 一起使用的容器。
我通过运行一个演示应用程序
kubectl run hello-world --image=gcr.io/google-samples/hello-app:1.0 --port 8080
并通过
kubectl expose deployment hello-world --port=8080 --target-port=8080
应用程序在从节点上启动
alecu@slave-node:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91967f160a7c bc5c421ecd6c "./hello-app" About an hour ago Up About an hour k8s_hello-world_hello-world-5bcc568dd9-xktwg_default_875609f4-90d0-11e9-9940-7cd30a0da72f_0
我可以从容器内部访问它
alecu@slave-node:~$ sudo nsenter -t 21075 -n curl http://localhost:8080
Hello, world!
Version: 1.0.0
Hostname: hello-world-6899bf7846-t5pb7
但是当我尝试从容器外部访问它时,连接被拒绝:
alecu@slave-node:~$ curl http://localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused
netstat 没有显示 8080 端口
alecu@slave-node:~$ netstat -tnlp | grep 8080
curl 也不能从主节点工作
alecu@master-node:~$ kubectl describe service hello-world
Name: hello-world
Namespace: default
Labels: <none>
Annotations: <none>
Selector: run=hello-world
Type: ClusterIP
IP: 10.100.48.99
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
Endpoints: 192.168.1.18:8080
Session Affinity: None
Events: <none>
alecu@master-node:~$ curl -v http://192.168.1.18:8080
* Rebuilt URL to: http://192.168.1.18:8080/
* Trying 192.168.1.18...
* TCP_NODELAY set
^C
alecu@master-node:~$ curl -v http://10.100.48.99:8080
* Rebuilt URL to: http://10.100.48.99:8080/
* Trying 10.100.48.99...
* TCP_NODELAY set
^C
alecu@master-node:~$
我'ctrl + c'ed curl命令,因为它无休止地等待。
我不明白为什么从节点上的端口 8080 没有打开。
[编辑] 我修补了服务以使用 NodePort
kubectl patch svc hello-world --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"}]'
但是 curl 在http://nodeIP:nodePort上也不起作用
alecu@master-node:~$ kubectl describe svc hello-world
Name: hello-world
Namespace: default
Labels: run=hello-world
Annotations: <none>
Selector: run=hello-world
Type: NodePort
IP: 10.100.171.36
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 30988/TCP
Endpoints: 192.168.1.21:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
alecu@master-node:~$ curl -v http://10.100.171.36:30988
* Rebuilt URL to: http://10.100.171.36:30988/
* Trying 10.100.171.36...
* TCP_NODELAY set
^C
解决方案
将服务类型更新为 NodePort。那么您应该可以使用http://NODEIP:NODEPORT从外部访问应用程序, 或者使用 clusterIP 从集群访问应用程序。
从以下命令获取 clusterIP
kubectl get svc
请参阅下面的说明
master $ kubectl run hello-world --image=gcr.io/google-samples/hello-app:1.0 --port 8080
deployment.apps/hello-world created
master $
master $ kubectl expose deployment hello-world --port=8080 --target-port=8080
service/hello-world exposed
master $
master $ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world ClusterIP 10.104.172.60 <none> 8080/TCP 4s
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 1h
master $
master $ curl 10.104.172.60:8080
Hello, world!
Version: 1.0.0
Hostname: hello-world-6654767c49-r2mnz
推荐阅读
- powershell - 将用户添加到 WMI 控件并通过 SDDL / powershell 编辑配置
- google-cloud-functions - 有没有办法配置 Google Cloud Function 和 Pub/Sub 并行度?
- python - 如何在一个函数中返回两个数据帧
- java - add 方法只是打印 True。将 Web 元素转换为 List 后如何打印其值
- laravel - Laravel 地图仅适用于第一个循环
- plot - 将 Bokeh y 轴刻度从默认左侧移动到绘图右侧
- java - String.format("%.1g", 0.0f) 导致索引异常,是bug吗?
- go - 如何取消引用动态多级指针?
- python - PyQT5 - 运行后缺少元素
- javascript - 如何将“选择”与 KnockoutJS 中的不同模板链接?