为什么我无法使用 minikube IP 访问我的 Kubernetes 集群?
Why Can't I Access My Kubernetes Cluster Using the minikube IP?
我有一些关于我的 minikube 集群的问题,特别是为什么需要隧道、隧道的实际含义以及端口号的来源。
背景
我显然是一个完全的 kubernetes 初学者......并且没有大量的网络经验。
好的。我将以下 docker 图片推送到 docker 集线器。这是一个 hello express 应用程序,只在 /
路线上打印出“Hello world”。
Docker文件:
FROM node:lts-slim
RUN mkdir /code
COPY package*.json server.js /code/
WORKDIR /code
RUN npm install
EXPOSE 3000
CMD ["node", "server.js"]
我有以下 pod 规范:
网络-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: web-pod
spec:
containers:
- name: web
image: kahunacohen/hello-kube:latest
ports:
- containerPort: 3000
以下服务:
网络-service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: NodePort
selector:
app: web-pod
ports:
- port: 8080
targetPort: 3000
protocol: TCP
name: http
以及以下部署:
网络-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 2
selector:
matchLabels:
app: web-pod
service: web-service
template:
metadata:
labels:
app: web-pod
service: web-service
spec:
containers:
- name: web
image: kahunacohen/hello-kube:latest
ports:
- containerPort: 3000
protocol: TCP
所有对象都已启动并且 运行 使用 kubectl 创建它们后看起来不错。
我这样做:
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h5m
web-service NodePort 10.104.15.61 <none> 8080:32177/TCP 25m
- 然后,根据我正在阅读的一本书,如果我这样做:
$ curl $(minikube ip):8080 # or :32177, # or :3000
我没有收到任何回复。
我在执行此操作时发现,但是我可以通过转到 http://127.0.0.1:52650/
:
来访问该应用程序
$ minikube service web-service
|-----------|-------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------------|-------------|---------------------------|
| default | web-service | http/8080 | http://192.168.49.2:32177 |
|-----------|-------------|-------------|---------------------------|
Starting tunnel for service web-service.
|-----------|-------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------------|-------------|------------------------|
| default | web-service | | http://127.0.0.1:52472 |
|-----------|-------------|-------------|------------------------|
问题
- 这个“隧道”是什么,我们为什么需要它?
- 目标端口 (8080) 的用途是什么?
- 当我这样做时,这行是什么意思
kubectl get services
:
web-service NodePort 10.104.15.61 <none> 8080:32177/TCP 25m
具体来说,端口映射是什么意思,32177
来自哪里?
- 简单地将内部端口映射到外部相同的端口号是否存在某种问题,例如3000:3000?如果是这样,我们是否必须特别提供此映射?
让我回答你所有的问题。
0 - 无需单独创建 pods(除非需要测试),这应该通过创建部署(或有状态集,取决于应用程序和需求)来完成,这将创建一个 replicaset
负责在操作条件下保持适量的 pods。 (你可以熟悉 deployments in kubernetes.
1 - Tunnel is used to expose the service from inside of VM where minikube is running to the host machine's network. Works with LoadBalancer
service type. Please refer to access applications in minikube.
1.1 - 无法在 localhost:NodePort
上访问应用程序的原因是 NodePort 在 VM 中公开,其中 minikube
是 运行ning,而不是在您的本地计算机上。
您可以通过运行宁minikube IP
然后curl %GIVEN_IP:NodePort
找到minikube VM的IP。您应该从您的应用程序中得到响应。
2 - targetPort
表示应该建立端口连接的服务。请参考define the service.
在 minikube
中可能会造成混淆,因为它指向 service port
,而不是服务中定义的 targetPort
。我认为想法是指示在集群中可以访问哪个端口 service
。
3 - 关于这个问题,有headers提出来,你可以按字面意思对待。例如:
$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
web-service NodePort 10.106.206.158 <none> 80:30001/TCP 21m app=web-pod
NodePort
来自你的 web-service.yaml
service
object。 Type
被显式指定,因此 NodePort
被分配。如果您不指定 type
服务,它将被创建为 ClusterIP
类型,并且只能在 kubernetes 集群中访问。请参考Publishing Services (ServiceTypes).
当使用 ClusterIP
类型创建服务时,输出中不会有 NodePort
。例如
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-service ClusterIP 10.106.206.158 <none> 80/TCP 23m
External-IP
会在使用LoadBalancer
服务类型时弹出。此外,minikube
地址将在您 运行 minikube tunnel
中出现在不同的 shell 中。在您的主机上可以通过 External-IP
+ service port
.
访问您的服务之后
4 - 这种映射没有问题。此外,这是 kubernetes 的默认行为:
Note: A Service can map any incoming port to a targetPort. By default
and for convenience, the targetPort is set to the same value as the
port field.
编辑:
取决于 minikube
的 driver(通常这是 virtual box
或 docker
- 可以在 linux 虚拟机上检查 .minikube/profiles/minikube/config.json
), minikube
可以有不同的端口转发。例如。我有一个基于 docker
driver 的 minikube
,我可以看到一些映射:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebcbc898b557 gcr.io/k8s-minikube/kicbase:v0.0.23 "/usr/local/bin/entr…" 5 days ago Up 5 days 127.0.0.1:49157->22/tcp, 127.0.0.1:49156->2376/tcp, 127.0.0.1:49155->5000/tcp, 127.0.0.1:49154->8443/tcp, 127.0.0.1:49153->32443/tcp minikube
例如 22 用于 ssh 以 ssh 进入 minikube VM
。这可能是您收到 http://127.0.0.1:52650/
回复的原因
我有一些关于我的 minikube 集群的问题,特别是为什么需要隧道、隧道的实际含义以及端口号的来源。
背景
我显然是一个完全的 kubernetes 初学者......并且没有大量的网络经验。
好的。我将以下 docker 图片推送到 docker 集线器。这是一个 hello express 应用程序,只在 /
路线上打印出“Hello world”。
Docker文件:
FROM node:lts-slim
RUN mkdir /code
COPY package*.json server.js /code/
WORKDIR /code
RUN npm install
EXPOSE 3000
CMD ["node", "server.js"]
我有以下 pod 规范:
网络-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: web-pod
spec:
containers:
- name: web
image: kahunacohen/hello-kube:latest
ports:
- containerPort: 3000
以下服务:
网络-service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: NodePort
selector:
app: web-pod
ports:
- port: 8080
targetPort: 3000
protocol: TCP
name: http
以及以下部署:
网络-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 2
selector:
matchLabels:
app: web-pod
service: web-service
template:
metadata:
labels:
app: web-pod
service: web-service
spec:
containers:
- name: web
image: kahunacohen/hello-kube:latest
ports:
- containerPort: 3000
protocol: TCP
所有对象都已启动并且 运行 使用 kubectl 创建它们后看起来不错。
我这样做:
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h5m
web-service NodePort 10.104.15.61 <none> 8080:32177/TCP 25m
- 然后,根据我正在阅读的一本书,如果我这样做:
$ curl $(minikube ip):8080 # or :32177, # or :3000
我没有收到任何回复。
我在执行此操作时发现,但是我可以通过转到 http://127.0.0.1:52650/
:
$ minikube service web-service
|-----------|-------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------------|-------------|---------------------------|
| default | web-service | http/8080 | http://192.168.49.2:32177 |
|-----------|-------------|-------------|---------------------------|
Starting tunnel for service web-service.
|-----------|-------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------------|-------------|------------------------|
| default | web-service | | http://127.0.0.1:52472 |
|-----------|-------------|-------------|------------------------|
问题
- 这个“隧道”是什么,我们为什么需要它?
- 目标端口 (8080) 的用途是什么?
- 当我这样做时,这行是什么意思
kubectl get services
:
web-service NodePort 10.104.15.61 <none> 8080:32177/TCP 25m
具体来说,端口映射是什么意思,32177
来自哪里?
- 简单地将内部端口映射到外部相同的端口号是否存在某种问题,例如3000:3000?如果是这样,我们是否必须特别提供此映射?
让我回答你所有的问题。
0 - 无需单独创建 pods(除非需要测试),这应该通过创建部署(或有状态集,取决于应用程序和需求)来完成,这将创建一个 replicaset
负责在操作条件下保持适量的 pods。 (你可以熟悉 deployments in kubernetes.
1 - Tunnel is used to expose the service from inside of VM where minikube is running to the host machine's network. Works with LoadBalancer
service type. Please refer to access applications in minikube.
1.1 - 无法在 localhost:NodePort
上访问应用程序的原因是 NodePort 在 VM 中公开,其中 minikube
是 运行ning,而不是在您的本地计算机上。
您可以通过运行宁minikube IP
然后curl %GIVEN_IP:NodePort
找到minikube VM的IP。您应该从您的应用程序中得到响应。
2 - targetPort
表示应该建立端口连接的服务。请参考define the service.
在 minikube
中可能会造成混淆,因为它指向 service port
,而不是服务中定义的 targetPort
。我认为想法是指示在集群中可以访问哪个端口 service
。
3 - 关于这个问题,有headers提出来,你可以按字面意思对待。例如:
$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
web-service NodePort 10.106.206.158 <none> 80:30001/TCP 21m app=web-pod
NodePort
来自你的 web-service.yaml
service
object。 Type
被显式指定,因此 NodePort
被分配。如果您不指定 type
服务,它将被创建为 ClusterIP
类型,并且只能在 kubernetes 集群中访问。请参考Publishing Services (ServiceTypes).
当使用 ClusterIP
类型创建服务时,输出中不会有 NodePort
。例如
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-service ClusterIP 10.106.206.158 <none> 80/TCP 23m
External-IP
会在使用LoadBalancer
服务类型时弹出。此外,minikube
地址将在您 运行 minikube tunnel
中出现在不同的 shell 中。在您的主机上可以通过 External-IP
+ service port
.
4 - 这种映射没有问题。此外,这是 kubernetes 的默认行为:
Note: A Service can map any incoming port to a targetPort. By default and for convenience, the targetPort is set to the same value as the port field.
编辑:
取决于 minikube
的 driver(通常这是 virtual box
或 docker
- 可以在 linux 虚拟机上检查 .minikube/profiles/minikube/config.json
), minikube
可以有不同的端口转发。例如。我有一个基于 docker
driver 的 minikube
,我可以看到一些映射:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebcbc898b557 gcr.io/k8s-minikube/kicbase:v0.0.23 "/usr/local/bin/entr…" 5 days ago Up 5 days 127.0.0.1:49157->22/tcp, 127.0.0.1:49156->2376/tcp, 127.0.0.1:49155->5000/tcp, 127.0.0.1:49154->8443/tcp, 127.0.0.1:49153->32443/tcp minikube
例如 22 用于 ssh 以 ssh 进入 minikube VM
。这可能是您收到 http://127.0.0.1:52650/