我正在使用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.1443/TCP 18m nginx NodePort 10.43.254.138 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,我的containerPort、port和targetPort都是80
;
问题是,NodePort范围是否从主机映射到充当节点的码头容器。命令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。入口是在集群外部公开工作负载的首选方法,对于kind,则是入口的they have support。似乎k3d也有一种map the ingress port to the host的方法。
也许,您的pod运行在另一个工作节点上,而不是localhost上。您应该使用正确的节点ip。
原来我在创建集群时没有暴露端口
https://k3d.io/usage/guides/exposing_services/
如有疑问欢迎大家评论区留言



