Kubernetes 网络模型 —— 理解 Service、Ingress 和 Endpoint

阅读时长 6 分钟读完

Kubernetes 是一个开源的容器集群管理系统,它可以自动化部署、扩展和管理容器化应用程序。Kubernetes 提供了许多功能,其中网络模型是其中之一,它可以帮助您配置 Kubernetes 集群的网络拓扑结构,以便在集群内或集群之间进行通信。本文将介绍 Kubernetes 网络模型的三个核心组件:Service、Ingress 和 Endpoint。

1. Service

在 Kubernetes 中,Service 是一种帮助用户将应用程序公开为 Kubernetes 集群内部网络的访问点的方式。Service 提供了一种稳定的 IP 地址和 DNS 名称,使得应用程序能够在集群内可靠地被访问。Service 可以将一组 Pod 匹配到一个虚拟服务中,从而为这些 Pod 创建一个共享的网络入口。

创建 Service

要创建一个 Service,我们需要定义一个 Service YAML 文件,其中包含以下内容:

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

在这个例子中,我们使用了 kubectl 创建了一个名为 my-service 的 Service,在 my-app 应用中选择了所有的 Pod,然后将它们绑定到 Service 的两个端口(80 和 443)。这样,所有的 HTTP 流量都会自动转发到 port 80,并自动转发到对应的 Pod 中 targetPort 为 http 的端口。

Service 类型

Service 类型主要有以下四种:

  • ClusterIP:Service 默认的类型,该类型的服务只在集群内部可访问,主要用于内部通信。
  • NodePort:该类型的 Service 将会把 Service 监听的端口映射到每个 Node 的 IP 上。当外部用户访问 Node 的 IP 和 Service 监听的端口时,会被转发到 Service 中暴露的节点上的Pod。
  • LoadBalancer:该类型的 Service 将会在外部创建负载均衡器,然后通过负载均衡器的虚拟 IP 将流量转发到 Kubernetes 集群中的 Service。
  • ExternalName:该类型的 Service 可以将 Kubernetes 集群外部的服务映射为 Kubernetes 中的 Service。

2. Ingress

在 Kubernetes 中,Ingress 是一种管理外部对 Kubernetes 集群中的 HTTP 和 HTTPS 服务的访问的方式。Ingress 可以将集群内的多个服务公开为单个入口。该入口通常与 DNS 域名相关联,并且可以为不同的 URL 路径映射到不同的服务和端口。

创建 Ingress

要创建一个 Ingress,我们需要定义一个 Ingress YAML 文件,其中包含以下内容:

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

在这个例子中,我们使用 kubectl 创建了一个名称为 my-ingress 的 Ingress,并指定了一个规则,该规则将请求的 host 为 example.com 的流量转发到 Service my-service (监听 Http 端口)中。

Ingress 类型

Ingress 类型的取决于所使用的 controller,常见的有以下几种:

  • Nginx Ingress Controller:常用的 Ingress Controller,使用最为广泛,可以在 OpenSource 版本下使用。
  • Traefik Ingress Controller:支持动态配置并使用更简洁的配置文件(采用动态后端配置),对于需要灵活的场景比较适合。
  • Istio Ingress Controller:需要 Istio 安装过程中启用,灵活而且性能较好的 Ingress Controller。

3. Endpoint

在 Kubernetes 中,Endpoint 是一组连接到 Service 的 Pod。Pod 可以在 Kubernetes 集群内的任何节点上运行,并且 Endpoint 可以通过其 IP 地址和端口号来访问它们。Kubernetes 自动创建 Endpoint,以匹配 Service 和相应的 Pod,以便 Service 可以访问它所需要的 Pod。

Endpoint 的自动创建

要自动创建一个 Endpoint,只需要将 Service 与 Pod 相关联:

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

在这个例子中,当我们创建一个 Service(my-service)与一个 Pod(my-app)时,Kubernetes 将会自动创建一个 Endpoint。Kubernetes 会根据 Service 的 selector 属性匹配 Pod,并自动将我的应用程序容器绑定到端口 8080 上。

总结

在 Kubernetes 集群中,Service、Ingress 和 Endpoint 是非常重要的组件。它们使得应用程序的管理变得更加方便和高效,同时也为开发人员提供了更直观的视图来监控和调试应用程序。我们需要深入理解 Kubernetes 的网络模型,以充分发挥其优势,提高应用程序的可扩展性、可用性和弹性。

示例代码

本文中的代码可以在 Github 上找到。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e1772af6b2d6eab3ca1f9b

纠错
反馈