为什么我无法使用 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
  1. 然后,根据我正在阅读的一本书,如果我这样做:
$ 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 |
|-----------|-------------|-------------|------------------------|

问题

  1. 这个“隧道”是什么,我们为什么需要它?
  2. 目标端口 (8080) 的用途是什么?
  3. 当我这样做时,这行是什么意思 kubectl get services:
web-service   NodePort 10.104.15.61   <none>        8080:32177/TCP   25m

具体来说,端口映射是什么意思,32177来自哪里?

  1. 简单地将内部端口映射到外部相同的端口号是否存在某种问题,例如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.

请参考define a service


编辑:

取决于 minikubedriver(通常这是 virtual boxdocker - 可以在 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/

回复的原因