gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:06:48 28 4
gpt4 key购买 nike

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

背景

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

好的。我有以下推送到 docker hub 的 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 规范:

web-pod.yaml:

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

以下服务:

网络服务.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

以及以下部署:

网络部署.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 - 无需单独创建 pod(除非需要测试),这应该通过创建部署(或有状态集,取决于应用程序和需求)来完成,这将创建一个 replicaset它将负责将适量的 pods 保持在运行状态。 (你可以熟悉 deployments in kubernetes


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

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

您可以通过运行 minikube IP 然后 curl %GIVEN_IP:NodePort 找到 minikube VM 的 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 来自 service 对象的 web-service.yamlType 是明确指定的,因此分配了 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,一旦您在不同的 shell 中运行 minikube tunnel,地址就会出现。在您的主机上可以通过 External-IP + service port 访问您的服务。


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

Note: A Service can map any incoming port to a targetPort. By defaultand for convenience, the targetPort is set to the same value as theport field.

请引用define a service


编辑:

取决于driver minikube(通常这是一个 virtual boxdocker - 可以在 .minikube/profiles/minikube/中的 linux VM 上检查config.json), minikube 可以有不同的端口转发。例如。我有一个基于 docker 驱动程序的 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/

得到响应的原因

关于kubernetes - 为什么我无法使用 minikube IP 访问我的 Kubernetes 集群?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68336875/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com