首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能使用迷你IP访问我的Kubernetes集群?

为什么我不能使用迷你IP访问我的Kubernetes集群?
EN

Stack Overflow用户
提问于 2021-07-11 13:53:04
回答 1查看 3.6K关注 0票数 2

我有一些关于我的迷你集群的问题,特别是为什么需要一个隧道,隧道实际上意味着什么,以及端口号来自哪里。

背景

我显然是一个完全的库伯内特斯beginner...and,没有一吨的网络经验。

好的。我有下面的码头形象,我推到码头枢纽。这是一个hello应用程序,它只在/路径上打印出"Hello“。

DockerFile:

代码语言:javascript
复制
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.yaml:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: web-pod
spec:
  containers:
    - name: web
      image: kahunacohen/hello-kube:latest
      ports:
      - containerPort: 3000

以下服务:

web-service.yaml

代码语言:javascript
复制
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

代码语言:javascript
复制
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创建对象之后,所有的对象都已经启动并运行,并且看起来很好。

我这样做:

代码语言:javascript
复制
$ 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. 然后,根据我正在读的一本书,如果我读的话:
代码语言:javascript
复制
$ curl $(minikube ip):8080 # or :32177, # or :3000

我没有得到任何回应。

我发现当我这样做时,我可以通过http://127.0.0.1:52650/访问这个应用程序。

代码语言:javascript
复制
$ 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时,这一行是什么意思?
代码语言:javascript
复制
web-service   NodePort 10.104.15.61   <none>        8080:32177/TCP   25m

具体来说,端口映射意味着什么?32177从何而来?

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-13 08:48:26

让我回答你所有的问题。

0-没有必要单独创建豆荚(除非需要测试),这应该通过创建部署(或状态集,取决于应用程序和需求)来完成,这将创建一个replicaset,负责在操作条件下保持适当数量的吊舱。(你可以熟悉在kubernetes的部署

1- 隧道用于从VM内部公开服务,其中minikube正在运行到主机的网络。适用于LoadBalancer服务类型。请参考minikube的access应用程序

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

您可以通过运行minikube IPcurl %GIVEN_IP:NodePort来找到minikube的IP。你应该从你的应用程序中得到回复。

2- targetPort表示应该与之建立端口连接的服务。请参考定义服务

minikube中,这可能会令人困惑,因为它指向的是service port,而不是服务中定义的targetPort。我认为这样做的目的是表明集群中哪个端口service是可访问的。

对于这个问题,这里有标题,你可以按字面处理。例如:

代码语言:javascript
复制
$ 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 for service对象。显式地指定了Type,因此分配了NodePort。如果您不指定type of service,它将被创建为ClusterIP类型,并且只能在kubernetes集群中访问。请参考出版服务(ServiceTypes)

当使用ClusterIP类型创建服务时,输出中不会出现NodePort。例如。

代码语言:javascript
复制
$ 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的默认行为:

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

请参阅定义服务

编辑:

根据司机 of minikube (通常这是一个virtual boxdocker -可以在.minikube/profiles/minikube/config.json中的linux上检查),minikube可以有不同的端口转发。例如,我有一个基于minikube驱动程序的docker,我可以看到一些映射:

代码语言:javascript
复制
$ 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/回应的原因之一

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68336875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档