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