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 containerPort,port并且targetPort都是 80
问题是,NodePort 范围是否从主机映射到充当节点的 docker 容器。该命令docker ps将向您显示,有关更多详细信息,您可以docker inspect $container_id查看Ports下面的属性NetworkSettings。我没有 k3d,但这里有一个来自 kind 的例子。
$ 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\nRun 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]\nRun Code Online (Sandbox Code Playgroud)\n如果不是,kubectl port-forward按照评论中的建议进行操作可能是最简单的方法。或者,开始研究 Ingress。Ingress 是在集群外部公开工作负载的首选方法,并且在这种情况下,它们支持Ingress。看来 k3d 也有办法将入口端口映射到主机。