容器网络之 Kubernetes Service 初探

如果你是一名前端工程师,那么你可能已经听说过 Kubernetes。Kubernetes 是由 Google 开发的一种容器编排系统,旨在简化应用程序部署、扩展和管理。

在 Kubernetes 中,Service 是一个比较重要的概念。Service 作为一种抽象概念,可以将一个集合的 Pods 暴露给一个 Service IP。通过这个 Service IP,其他的 Pods 或者外部用户就可以访问这些集合中的 Pods。

在本文中,我们将深入探讨 Kubernetes Service 并且通过示例代码演示其中的一些高级操作。

Kubernetes Service 的构成

在 Kubernetes 中,Service 由一个 IP 和一个 (或多个) 端口组成。当创建一个 Service 时,Kubernetes 会自动为这个 Service 分配一个 IP 地址。这个 IP 地址只在集群内部可用,并且它不会改变。这样其他的 Pods 或者外部用户就可以通过这个 IP 地址来访问这个 Service。

另外,在 Kubernetes 中,Service 还可以使用以下方式来检测要暴露的 Pods:

  • label selector:使用一组标签来筛选符合条件的 Pods。
  • IP endpoints:直接指定暴露的 Pods。

Kubernetes Service 的类型

Kubernetes 中的 Service 有以下几种类型:

  • ClusterIP:这是默认的 Service 类型。使用这种类型时,Kubernetes 会为这个 Service 分配一个 clusterIP,其他的 Pods 或者外部用户可以通过这个 clusterIP 来访问这个 Service。
  • NodePort:使用这种类型时,Kubernetes 会在每个 Node 上开放一个端口,通过这些端口,其他的 Pods 或者外部用户可以访问这个 Service。
  • LoadBalancer:使用这种类型时,Kubernetes 会为这个 Service 分配一个负载均衡器来分发流量。这个负载均衡器可以是外部的,也可以是 Kubernetes 内部的。
  • ExternalName:使用这种类型时,Kubernetes 会为这个 Service 分配一个 CNAME。通过这个 CNAME,其他的 Pods 或者外部用户可以访问这个 Service。

Kubernetes Service 的使用

在下面的例子中,我们将使用 Node.js 来创建一个简单的 Web 应用,并且使用 Kubernetes Service 来暴露这个应用程序。

首先,我们需要创建一个名为 "hello-world" 的 Docker 镜像。在这个 Docker 镜像中,我们将推入一个简单的 Node.js 应用程序:

----- ---- - ----------------

----- ------ - --------------------------- --------- -- -
  ----------------------- ---------------- ---------------
  -- ------------ --- ---- -
    ------------------- ---------
  - ---- -- ------------ --- ----------- -
    -------------------
  - ---- -
    ----------------- - --- --------
  -
---

------------------- -- -- -
  ------------------- ------- -- ---- -------
---

在这个应用程序中,我们创建了一个 HTTP 服务器,并且在端口 8080 上运行这个服务器。当请求 URL 为 "/" 时,服务器会返回 "Hello World!",当请求 URL 为 "/healthz" 时,服务器会返回 "OK"。

现在我们可以将这个应用程序推送到 Docker 内部的一个 registry 中:

------ ----- -- -------------- -
------ --- -------------- -----------------------------------
------ ---- -----------------------------------

在这个例子中,我们使用了一个名为 "registry.example.com" 的 Docker registry 来存储这个应用程序的 Docker 镜像。

接下来,我们需要创建一个 Kubernetes Deployment 来部署这个应用程序:

----------- -------
----- ----------
---------
  ----- -----------
-----
  ---------
    ------------
      ---- -----------
  --------- -
  ---------
    ---------
      -------
        ---- -----------
    -----
      -----------
        - ----- -----------
          ------ -----------------------------------
          ------
            - -------------- ----
          ---------------
            --------
              ----- --------
              ----- ----
            -------------------- -

在这个 YAML 文件中,我们创建了一个名为 "hello-world" 的 Deployment,它由 3 个同样的 Pods 组成。这些 Pods 均使用我们之前在 Docker registry 中推送的 "hello-world:v1" 镜像,并且暴露在端口 8080 上。另外,我们还设置了健康检查,以检测这些 Pods 是否已经准备就绪。

有了 Deployment 以后,我们可以创建一个 ClusterIP 类型的 Kubernetes Service 来暴露这些 Pods:

----------- --
----- -------
---------
  ----- -----------
-----
  ---------
    ---- -----------
  ------
    - ----- ----
      --------- ---
      ----- --
      ----------- ----
  ----- ---------

在这个 YAML 文件中,我们创建了一个名为 "hello-world" 的 Service,它将会回答端口为 80 的 HTTP 请求。这些请求会被转发到我们之前创建的那三个 Pod 上的端口 8080。

为了访问我们的应用程序,我们需要通过 Kubernetes API Server 所在的主机访问这个 Service。我们可以使用一个 "kubectl port-forward" 命令来暴露这个 Service 的端口:

------- ------------ --------------- -------

这个命令将本地机器的端口 8080 映射到这个 Service 的端口 80 上。

现在,我们可以通过浏览器访问应用程序了:http://localhost:8080。如果一切正常的话,我们将看到浏览器界面中显示 "Hello World!"。

结论

Kubernetes Service 是 Kubernetes 中非常重要的一个概念。使用 Service,我们可以将一组 Pod 暴露给其他的 Pods 或者外部用户。在本文中,我们简单介绍了 Kubernetes Service,并演示了使用 Kubernetes Service 来暴露一个简单的 Node.js 应用程序。如果您希望深入了解更多关于 Kubernetes Service 的知识,我强烈建议您阅读官方文档或者相关的书籍。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/673044a2eedcc8a97c917b1a