在Kubernetes中引入NodePort服务

摘要

在本文中,您将学习Kubernetes Pods的剖析以及在Pods中运行容器的NodePort Service示例。

豆荚介绍

Kubernetes围绕豆荚旋转。 因此,您必须知道这些吊舱是什么。 Pod是我们用来部署应用程序的运行时环境。 它是Kubernetes中调度的基本单位。 一起部署在单个主机上的一个或多个容器称为Pod。 我们将看到如何在Kubernetes集群中部署和扩展Pod。 现在,我将通过在Pods中运行容器并在Kubernetes中连接到运行容器的方式来介绍Kubernetes Pods和NodePort服务。

集群设置

在Kubernetes中引入NodePort服务

我在此演示中使用的Kubernetes集群设置包括一个主节点和3个工作节点VM。 所有这4个VM都在带有centOS的Goggle云上运行。

我们将使用云外壳连接到这些VM。 让我们通过运行kubectl get nodes命令来检查这些节点的状态。

从命令输出中可以看到,我们有1个主节点和3个工作节点。 所有4个节点均已准备就绪并成功运行。

在Kubernetes中引入NodePort服务

现在,我们将使用nginx容器查看pod清单文件。 转到我们保存清单文件的pod工作目录。 我为演示创建了一个清单文件。

在Kubernetes中引入NodePort服务

大多数Kubernetes的对象清单文件,上面荚清单文件包含必填字段即apiVersion, 善良元数据规格 4组顶部的标签。 因此,我们应该将它们放在我们的yaml配置文件中。

  • apiVersion :定义这些Kubernetes对象所属的版本号。 因此,在本例中,pod的API版本为v1。
  • 种类 :我们将要创建的对象的种类。 在我们的情况下,这是一个吊舱。
  • 元数据 :此部分包含两个字段。 一个名字,另一个是标签。 此处的Pod名称为Nginx Pod。
  • 标签 :这是一个可选字段。 标签用于在逻辑上将所有相关的容器分组在一起以进行显示和管理。 层用于指定环境。 在我们的例子中是dev。 标签有助于过滤。 假设我们的Kubernetes集群中运行着1000个Pod,并且我们只想过滤nginx Pod,那么在这种情况下这些标签非常方便。
  • Spec :在此nginx示例中,我正在从Docker集线器部署nginx容器。 我们在这里定义的容器名称是“ nginx-container”。 我在这里使用的图像是nginx。 由于这里没有提供任何特定版本,因此它将下载并安装最新版本。 您还可以为此nginx容器提供环境变量的端口号和卷。

Pod Config创建

我们将使用kubectl部署pod来创建命令。 让我们创建nginx pod。 首先,检查Kubernetes集群中是否已经有任何Pod在运行。

在Kubernetes中引入NodePort服务

如您所见,没有任何Pod正在运行。 现在,我们将使用kubectl create命令创建容器,后跟上面已经提到的清单文件的名称。

在Kubernetes中引入NodePort服务

这里的nginx-pod.yaml是我们的清单文件,并且在发出上述命令后创建了我们的pod。 现在再次通过发出以下get pods命令来检查是否创建了pod:

在Kubernetes中引入NodePort服务

在这里,您可以看到nginx pod已成功运行。 现在,由于Kubernetes集群中有4个节点,因此我们如何知道该nginx pod在哪个节点上运行。 我们可以通过获取带有广泛选项的pods命令来获取信息。

在Kubernetes中引入NodePort服务

现在在上图中,您可以看到Pod的IP地址及其在worker 3节点上运行。

假设我们丢失了清单文件或删除了清单文件,并且在Kubernetes集群中运行了nginx pod。 然后,我们可以打印从yaml文件运行的nginx pod详细信息。

在Kubernetes中引入NodePort服务
在Kubernetes中引入NodePort服务

现在您可以从上图看到yaml格式的nginx pod配置。 当我们要显示运行对象的每个次要细节时,这很有用。

现在查看pods issue命令的完整细节:“ kubectl describe pod nginx pod | 更多 ”。 然后,您可以查看有关吊舱的所有详细信息:

在Kubernetes中引入NodePort服务
在Kubernetes中引入NodePort服务

您可以在上方看到有关Pod的详细信息,该Pod在工作节点上可以正常运行,其中包含IP地址详细信息和事件详细信息。 我们还可以使用NodePort服务公开此pod。 我们将在其他Kubernetes服务博客中讨论有关Kubernetes服务的更多细节,例如NodePort,Loadbalancer和clusterIP服务。

使用Nodeport服务公开Pod:

一旦应用程序暴露在互联网上的外部世界中,然后我们将使用来自任何Web浏览器的节点IP和节点端口访问示例html网页以及默认的nginx网页。

节点IP:它是Kubernetes集群内任何主节点或任何工作节点的外部IP地址。 除了从Internet访问网页之外,我们还将尝试使用Pod IP从使用Kubernetes集群的工作程序节点内部访问示例html网页。

要在nginx-pod根目录内创建test.html页面,我们需要先进入pod内。

在Kubernetes中引入NodePort服务

这里的主机名是我给的pod名称,即nginx-pod 现在,让我们在nginx根目录内创建一个示例“ test.html ”页面。

test.html:

在Kubernetes中引入NodePort服务

这是一个非常简单的html文件,我们只是打印一些标题。 现在,让我们通过NodePort Service公开此Nginx -pod 所以现在我将运行命令。

在Kubernetes中引入NodePort服务

因此,现在我们已经使用NodePort Service成功地将nginx pod暴露给了外界。 现在我们需要知道该nginx网页暴露给外界的节点端口号。 我们可以通过运行describe命令获得该信息。

在Kubernetes中引入NodePort服务

Svc选项用于nginx-pod的节点端口服务名称。 您可以在节点端口上方看到30758 因此,要从Web浏览器访问网页,我们需要节点IP和节点端口。 该节点IP是Kubernetes主节点或Kubernetes集群内任何工作节点的外部IP地址。

因为我们已经检查了nginx pod是否在工作节点3上运行,所以让我们获取工作节点3的IP。

在Kubernetes中引入NodePort服务

在此,外部IP标记为黄色,即35.196.57.1​​93 现在我们有了节点端口30758 因此,我们拥有访问浏览器上的nginx页面的所有功能。

测试节点端口IP:

  • 现在转到浏览器并使用节点端口IP和端口访问URL,如下所示:
在Kubernetes中引入NodePort服务
  • 如前所述,Node IP是任何工作程序节点或Kubernetes主节点的可公共路由的外部IP。 在我们的情况下,它是工作程序3的外部IP地址。 通过使用节点端口服务公开Nginx Pod,我们获得了节点端口。
  • 现在,让我们访问在pod中创建的test.html网页。 在这里,我们可以看到我们已经成功地从Internet外部访问了html网页。
  • 在Kubernetes中引入NodePort服务
  • 注意:您可以使用主节点或任何其他辅助节点的外部IP地址,但使用相同的节点端口来访问网页。
  • 现在,让我们从Kubernetes集群内部访问同一网页。 为此,我们需要Pod IP和端口号。 我们将从describe命令获取该信息:
  • 在Kubernetes中引入NodePort服务
  • 因此,在这里您可以看到的端点是Pod IP和端口。 现在复制IP和端口并发出curl命令:现在我们可以看到我们已成功访问默认的nginx网页。
  • 在Kubernetes中引入NodePort服务
  • 现在,让我们尝试使用Pod IP和端口号访问html网页:
  • 在Kubernetes中引入NodePort服务

吊舱删除操作

这是我的演示,我创建了两个对象,即pod和NodePort服务。 现在,让我们使用delete命令删除容器和服务,再加上容器名称和服务名称,就像我在下面所做的那样:

在Kubernetes中引入NodePort服务

现在我们将通过以下命令查看它是否成功删除:

在Kubernetes中引入NodePort服务

在上面您可以看到两个对象已成功删除。

Kubernetes服务解剖

  • 想象一下,我们必须部署一个Web应用程序。 通常,webapp由UI部分和后端数据库组成。 那么我们如何将前端Web应用程序暴露给外界呢? UI部分将如何连接到后端数据库? 另一件事是,当重新创建Pod的IP地址更改时,当Pod的IP动态更改时将很难连接。

我们可以使用Kubernetes Services解决上述问题。

  • 假设我们有一个前端Web应用程序和一个后端数据库。 一些用户正在尝试访问Web应用程序。 我们知道Kubernetes中的每个Pod都有一个唯一的IP地址。 这些豆荚可持续很短的时间。 吊舱死亡的原因有多种。 但是,当控制器重新创建容器时,容器将获得新的IP地址。 因此,只要重新创建Pod,便会获得一个新的IP地址。 这产生了问题。
  • 假设后端Pod为Kubernetes集群中的前端Pod提供了某种功能,然后前端Pod如何跟踪后端Pod。 另一件事是,您知道每个应用程序都由微服务组成。 每个微服务都部署到各个Pod。 因此,要正常使用此应用,需要将Pod中存在的所有单个微服务都连接在一起并进行通信。 下一个问题是这些应用程序如何向尝试通过Internet访问的最终用户公开。

为了解决上述所有问题,Kubernetes Services成为了现实。

Kubernetes服务

服务是在集群上运行的Pod分组的一种方式。 这些更便宜,并且我们 在集群中 可以拥有尽可能 多的Java Web开发服务 服务提供了跨集群标准化的一些重要功能,例如负载平衡,应用程序之间的服务发现以及支持零停机应用程序部署的功能。

解决上述问题的服务之一是“ NodePort服务”

NodePort Service实时示例:

在Kubernetes中引入NodePort服务
  • 上图中,我们在此处有一个节点。 在其中,我们有一个前端Web应用程序。 荚。 使用IP地址将其部署在其上。 有些用户正在尝试通过Internet访问此应用程序。 现在我们面临两个挑战。 首先,我们已经讨论过,我们无法信任Pod IP,因为它在重新创建后会动态变化。 其次,用户和pod之间没有连接。 因此,为了解决这两个挑战,Kubernetes提供了“ Nodeport”服务。
  • 使用NodePort,我们可以在称为节点端口的静态端口上在节点IP上公开服务。 在这里,我们谈论两件事。 一个是节点IP,另一个是NodePort。
在Kubernetes中引入NodePort服务
  • 因此,如您所见,当前在前端Pod上运行一个Web应用程序。 因此,要将这个应用程序暴露给Internet上的外界,我们需要创建NodePort类型的服务。 因此,一旦部署了节点端口服务,则该应用程序将在此处为192.168.1.1的节点IP上公开。 我们将在清单文件中提到的节点端口是31000。这里有一个限制。
  • 如果我们在清单文件中手动定义节点端口,请确保在30000到32767的范围内定义节点端口。如果我们在清单文件中未提及,那么Kubernetes将在其中指定一个未使用的节点端口。动态范围。 (节点端口是运行Pod的端口)。节点IP是用于从浏览器访问应用程序的静态IP。
  • 在上图中您可以看到的第二个端口是“ 80”。 这是服务本身的目标端口。 另一个端口(即服务端口)是运行Webapp的实际Pod上的端口。
  • 通常,服务端口和目标端口相同。 要记住这些端口,您必须查看服务端。 假设您正在使用该服务,并且该服务上的端口仅称为端口。 这些请求将转发到Pod上的目标端口。

NodePort服务示例演示

  • 在Google云中创建4个节点。 如下所示:(请参阅我们的博客,了解如何在Google Cloud上安装Kubernetes和创建节点)
在Kubernetes中引入NodePort服务
  • 我将使用云外壳连接到上述VM。 使用命令(kubectl get节点)检查节点的状态是否成功运行。 首先,使用(kubectl get pods / deploy / service)检查我们的Kubernetes集群中是否没有Pod以及部署和服务。 这样我们就可以拥有一个干净的Kubernetes集群设置了。
  • 使用“ mkdir”命令在主节点内创建一个nodeport工作目录。 然后转到该工作目录。 我的工作目录是“ nodePort-svc”。
在Kubernetes中引入NodePort服务

在这里,我在工作目录中创建了两个yaml清单文件,您可以看到。

Nginx-deploy.yaml

在Kubernetes中引入NodePort服务
  • 这是一个简单的nginx部署清单文件,我将在其中部署nginx容器1.7.9的一个副本。 请注意,我在这里使用的广告连播标签为“ nginx-app”。 我们必须在nodeport服务清单文件中使用这些确切的pod标签。

此ngix-app pod在端口80上运行。

Nginx-svc.yaml

在Kubernetes中引入NodePort服务
  • Nodeport服务文件包含4个顶部部分。 它们是“ api版本”,“种类”,“元数据”和“规范”。 服务是初始稳定版本的一部分。 因此,API版本为“ v1”。
  • 我在这里创建的对象就是“服务”。 我在元数据部分下将服务的名称定义为“ my-service”。 我还为该服务提供了标签,但这是一个可选字段。 为简单起见,我使用与吊舱标签相同的标签。
  • 在“规格”部分中,所有核心端口都位于。 该规范部分包含3个重要内容,即“选择器”,“类型”和“端口”。 选择器的目的是定义此NodePort服务选择需要管理的Pod的方式。 这是使用豆荚标签完成的。 因此,我在选择器部分下包括了确切的Pod标签。
  • 类型:这是我们要创建的服务的类型。 这里的服务类型是“ NodePort”。
  • 端口:在本节中,我们定义端口。 在这里您可以看到我已经定义了3个端口。 第一个是“ nodePort”。 我们可以在此处手动定义nodePort,否则Kubernetes将在创建节点端口服务时自动分配端口。 我给的是31111。因此,Kubernetes将使用此nodePort在Internet上Kubernetes集群内的每个工作节点和主节点上公开nginx应用程序。 因此,外部客户端可以使用节点和nodePort的外部IP来调用服务。
  • 端口:此端口是服务本身的端口。 在这里,我给的端口是“ 80”
  • TargetPort:这是运行应用程序的容器上的端口。 该请求由targetPort在此处(即清单文件中的80)转发到指定端口上的pod成员。 通常,端口和目标端口号相同。 如果我们在此处未指定目标端口,则默认为端口字段的值。

部署方式

  • 现在,我们需要使用已经在Nginx服务应用程序的工作目录中创建的部署清单文件来创建部署。 发出以下命令:
  • 在Kubernetes中引入NodePort服务
  • 应用已成功部署。 现在,我需要将应用程序公开给外界,为此,我将在NodePort服务的帮助下进行此操作。 使用我们的服务文件(即“ nginx-svc.yaml文件”),通过以下命令创建NodePort服务:
  • 在Kubernetes中引入NodePort服务
  • 现在,服务已成功创建。 现在,使用以下命令显示到目前为止已创建的对象:
在Kubernetes中引入NodePort服务
  • 如您所见,成功创建了nodePort类型的“ my-service”。 另外,您可以看到在部署中创建了一个Pod,并且该Pod在工作节点1上成功运行。现在,让我们进入工作目录,在工作目录内创建一个示例html网页。

让我们使用以下命令进入Pod:

在Kubernetes中引入NodePort服务
  • 现在,让我们在工作目录中创建一个示例html页面。

Test.html

在Kubernetes中引入NodePort服务
  • 现在,我将尝试使用Pod IP和端口在内部访问此html页面。 现在,通过发出以下命令来找到我们的pod IP:
  • 在Kubernetes中引入NodePort服务
  • 现在我们知道了Pod IP,让我们使用curl命令调用它:
  • 在Kubernetes中引入NodePort服务
  • 现在我们可以成功访问该页面。 现在,我将尝试使用内部节点端口群集IP访问同一页面。 现在要找到集群IP,我们需要运行以下命令:
  • 在Kubernetes中引入NodePort服务
  • 因此,使用此节点端口群集IP,我们可以使用curl命令访问相同的html网页:
  • 在Kubernetes中引入NodePort服务
  • 主要部分是我们将使用节点IP和节点端口从Internet上从外部访问同一网页。 我们知道我们已经配置的节点端口是“ 3111”。 现在,让我们在集群内的Goggle Cloud仪表板中获取节点的外部IP。 让我们以主节点的IP为例,这里是34.73.122.126。
  • 在Kubernetes中引入NodePort服务
  • 现在,我们将使用该节点IP(34.73.122.126)和节点端口(3111)从浏览器从外部访问html网页
在Kubernetes中引入NodePort服务
  • 因此,您可以在上面看到,我们可以成功访问它。 您还可以访问任何工作节点IP和节点端口,这将正常工作。

结论

在这里,我已经解释了NodePort Services的最重要的功能。 此外,我还演示了在Pod中运行容器和在Kubernetes中连接到正在运行的容器。

参考文献

  • https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/
  • https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-intro/

From: https://hackernoon.com/introducing-nodeport-service-in-kubernetes-ear0360s