为什么我无法使用 minikube IP 访问我的 Kubernetes 集群?

时间:2021-07-11 13:53:04

标签: kubernetes kubectl minikube

我对我的 minikube 集群有一些疑问,特别是为什么需要隧道、隧道的实际含义以及端口号的来源。

背景

我显然是一个完全的 kubernetes 初学者......并且没有大量的网络经验。

好的。我有以下 docker 镜像,我已将其推送到 docker hub。这是一个 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 规格:

web-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: web-pod
spec:
  containers:
    - name: web
      image: kahunacohen/hello-kube:latest
      ports:
      - containerPort: 3000

以下服务:

web-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

以及以下部署:

web-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. targetPort 的用途是什么 (8080)?
  3. 当我执行 kubectl get services 时,这行是什么意思:
web-service   NodePort 10.104.15.61   <none>        8080:32177/TCP   25m

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

  1. 简单地将内部端口映射到外部相同的端口号是否存在某种问题,例如3000:3000?如果是这样,我们是否必须专门提供此映射?

1 个答案:

答案 0 :(得分:3)

让我回答你所有的问题。

0 - 不需要单独创建 pods(除非它是要测试的东西),这应该通过创建部署(或 statefulsets,取决于应用程序和需求)来完成,这将创建一个 replicaset负责在操作条件下保持适量的豆荚。 (您可以熟悉deployments in kubernetes


1 - Tunnel 用于从运行 minikube 的 VM 内部向主机网络公开服务。适用于 LoadBalancer 服务类型。请参阅access applications in minikube

1.1 - 无法在 localhost:NodePort 上访问应用程序的原因是 NodePort 暴露在运行 minikube 的 VM 中,而不是在您的本地计算机上。

您可以通过运行 minikube IPcurl %GIVEN_IP:NodePort 来找到 minikube 虚拟机的 IP。您应该会收到应用的回复。


2 - targetPort 表示应与其建立端口连接的服务。请参阅define the service

minikube 中,它可能会令人困惑,因为它指向的是 service port,而不是服务中定义的 targetPort。我认为想法是指出集群内可以访问哪个端口 service


3 - 至于这个问题,有标题,你可以按字面意思对待它们。例如:

$ 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 对象的 serviceType 被明确指定,因此 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 服务类型时弹出。此外,一旦您在不同的 shell 中运行 minikubeminikube tunnel 的地址将出现。在您的主机上可以通过 External-IP + service port 访问您的服务之后。


4 - 这种映射没有问题。此外,这是 kubernetes 的默认行为:

<块引用>

注意:服务可以将任何传入端口映射到目标端口。默认情况下 为方便起见,targetPort 设置为与 端口字段。

请参考define a service


编辑:

取决于 minikubedriver(通常这是一个 virtual boxdocker - 可以在 .minikube/profiles/minikube/config.json 中的 linux VM 上检查),{{ 1}} 可以有不同的端口转发。例如。我有一个基于 minikube 驱动程序的 minikube,我可以看到一些映射:

docker

例如 22 用于 ssh 到 $ 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 的 ssh。这可能是您收到 minikube VM

回复的原因