Kubernetes 中使用 Service 和 Ingress 实现负载均衡和访问控制

阅读时长 7 分钟读完

随着云原生应用的广泛使用,Kubernetes 已经成为了云原生应用最受欢迎的管理平台之一。Kubernetes 提供了一种通过容器编排来部署和维护应用程序的方法。这种方式带来了很多好处,例如可扩展性、高可用性、故障恢复等。在 Kubernetes 中使用 Service 和 Ingress 实现负载均衡和访问控制,是非常常见的情况。本文将详细介绍如何在 Kubernetes 中使用 Service 和 Ingress 实现负载均衡和访问控制。

Service

Service 是 Kubernetes 中用来定义逻辑应用的抽象概念,它通常使用一个 DNS 名称来表示一组相同的 Pods,并为这些 Pods 提供访问入口。Kubernetes 中的 Service 通过 ClusterIP、NodePort、LoadBalancer 三种类型来分别实现内部服务和对外服务的负载均衡和访问控制。

  • ClusterIP:这种类型的 Service 只能在 Kubernetes 集群内部通过 IP 地址进行访问,不能从集群外部访问。
  • NodePort:这种类型的 Service 将选择的应用端口映射到节点(Node)的 IP 地址和高端口上,在集群内部和外部都可以通过该端口访问 Service。
  • LoadBalancer:这种类型的 Service 借助云服务商所提供的负载均衡器,在集群外部提供统一的入口,并向 Kubernetes 集群内部的相关 Service 分配一个外部 IP 地址,可以实现内部服务和对外服务的统一入口。

使用 Service 实现负载均衡

在 Kubernetes 中,为了提高应用程序的可用性和性能,通常需要将应用程序部署到多个 Pod 实例中,通过 Service 实现对这些 Pod 的负载均衡。在负载均衡场景下,将需求分配给多个 Pod 可以提高应用的处理能力和可用性。

下面是一个简单的 Service 对象定义示例:

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

上面的示例中,Service 的名称定义为 nginx,spec.selector 用来指定 Service 需要绑定到哪些 Pod 上,这里使用了 app=nginx 的标签选择器对相关的 Pod 进行选择。在上述配置中,我们指定 Service 使用端口 80,targetPort(容器中监听的端口)也为 80,在这种情况下,Kubernetes 系统会自动从该 Service 所选择的 Pod 中进行轮询式的负载均衡。

使用 Service 实现访问控制

除了负载均衡,Service还可以用来实现访问控制,根据需求,您可以在 Service 中配置不同的策略来实现访问控制。可以为集群外的客户端和 Kubernetes 集群内部的其他组件设置访问选项,包括 IP 地址、服务名称、需要访问的端口,甚至是调用方的身份信息等。具体来说,您可以使用以下两种方式实现 Service 的访问控制:

  • 在 Service 层面进行访问控制:您可以使用 NetworkPolicy 在 Service 之间强制执行网络策略。这样可以让您有更多的控制,以确保只有经过身份验证的用户或其他信任的组件才能访问 Service。您可以通过名称选择器指定 Service 的名称和选择器,以便 NetworkPolicy 可以为相关的 Service 应用访问控制规则。
  • 在 Pod 层面进行访问控制:您可以使用 PodSecurityPolicy 在应用程序级别上强制执行访问策略。这样可以让您为集群内部的各个 Pod 配置自己的安全选项。通过使用 Pod Security Policies,您可以确保集群的 Pod 不会运行不受信任的容器镜像,也可以限制 Pod 对本地存储卷的访问,并基于不同角色的 Pod 来设置不同的安全选项。

Ingress

Ingress 是 Kubernetes 中用于公开 HTTP 和 HTTPS 服务的 API 对象。它提供了对 Kubernetes 集群外部的 HTTP 流量的访问控制。在 Kubernetes 中,使用 Ingress 可以轻松地添加和管理 HTTP 和 HTTPS 网址路由。Kubernetes 中的 Ingress API 由多种实现方式,包括 Nginx、Traefik、Istio 等。

配置 Ingress

为了配置 Ingress,首先需要确保您的 Kubernetes 集群上已部署 Ingress 控制器,然后需要在 Ingress 对象中定义规则。 在 Kubernetes 中,一个 Ingress 规则由以下三个组成:

  • host:要将请求路由到的主机名。
  • paths:与 host 构成的一组 URL 路径匹配规则,通过该规则将请求路由到指定 Service 上。
  • backend:当请求未被以上路径规则匹配时要将请求路由到的默认 Service。

下面是一个简单的 Ingress 对象定义示例:

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

上面的示例中,我们首先定义了 Ingress,然后定义了一个规则,将来自 example.com 的 HTTP 流量路由到了 Service nginx 的 http 端口。通过使用 path 和 pathType,我们还将 example.com/foo 的所有请求路由到了 nginx 服务的 http 端口。

使用 Ingress 实现负载均衡和访问控制

在 Kubernetes 中,Ingress 具有两种用途:实现负载均衡和访问控制。通过 Ingress 资源,您可以轻松地扩展 Kubernetes 群集,为单个主机、虚拟主机甚至是一组 HTTP 路径配置端口和协议。此外,Ingress 还可以使用网络策略,为外部 HTTP 流量提供鉴定和授权,从而实现访问控制。

下面是一个混合负载均衡和访问控制的 Ingress 对象示例:

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

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

-- --

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

- ------------------------------------------------------------------------------ --------
------------------------------------------------------------------------------------------------------------------------
纠错
反馈