1.9. 安全和流量管理
管理员可以使用服务类型将应用程序公开给外部流量和安全网络连接,如 ClusterIP、NodePort 和 LoadBalaner 和 API 资源,如 Ingress 和 Route。Ingress Operator 和 Cluster Network Operator (CNO) 可帮助配置和管理这些服务和资源。Ingress Operator 部署并管理一个或多个 Ingress Controller。这些控制器将外部 HTTP 和 HTTPS 流量路由到集群中的服务。CNO 部署和管理集群网络组件,包括 pod 网络、服务网络和 DNS。
1.9.1. 公开应用程序 复制链接链接已复制到粘贴板!
ClusterIP 在集群中的内部 IP 上公开服务,以便集群只能被集群中的其他服务访问。NodePort 服务类型在每个节点的 IP 的静态端口上公开服务。此服务类型允许外部流量访问该服务。负载均衡器通常用于使用 MetalLB 的云或裸机环境中。此服务类型置备将外部流量路由到服务的外部负载均衡器。在裸机环境中,MetalLB 使用 VIP 和 ARP 公告或 BGP 公告。
Ingress 是一个 API 对象,用于管理对服务的外部访问,如负载均衡、SSL/TLS 终止和基于名称的虚拟主机。Ingress Controller (如 NGINX 或 HAProxy)实现 Ingress API,并根据用户定义的规则处理流量路由。
1.9.2. 保护连接 复制链接链接已复制到粘贴板!
Ingress Controller 管理 SSL/TLS 终止,以便在将传入的 SSL/TLS 流量传递给后端服务前解密传入的 SSL/TLS 流量。SSL/TLS 终止从应用程序 pod 卸载加密/解密过程。您可以使用 TLS 证书加密客户端和服务之间的流量。您可以使用 cert-manager 等工具管理证书,以自动执行证书分发和续订。
如果存在 SNI 字段,将 TLS 流量传递给 pod。这个过程允许使用 TLS 而不是 HTTP/HTTPS 来公开运行 TCP 的服务。站点管理员可以集中管理证书,并允许应用程序开发人员在没有权限的情况下读取私钥。
Route API 启用使用集群管理的证书加密路由器到 pod 流量。这可确保集中管理外部证书,而内部部分仍加密。应用程序开发人员为其应用程序获得唯一的私钥。这些密钥可以作为 secret 挂载到 pod 中。
网络控制定义了 pod 如何相互通信的规则,以及其他网络端点。这通过控制集群内的流量流来增强安全性。这些控制在网络插件级别实现,以确保只允许 pod 间的流量流。
基于角色的访问控制(RBAC)管理权限并控制谁可以访问集群中的资源。服务帐户为访问 API 的 pod 提供身份。使用 RBAC 可以精细控制每个 pod 可以做什么。
1.9.3. 示例:公开应用程序并保护连接 复制链接链接已复制到粘贴板!
在本例中,集群中运行的 Web 应用需要被外部用户访问。
使用适合您的需要的服务类型,创建一个服务并将应用公开为服务。
apiVersion: v1 kind: Service metadata: name: my-web-app spec: type: LoadBalancer selector: app: my-web-app ports: - port: 80 targetPort: 8080定义
Ingress资源来管理 HTTP/HTTPS 流量并将其路由到您的服务。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-web-app-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: mywebapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-web-app port: number: 80为您的入口配置 TLS,以确保安全、加密的连接。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-web-app-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: tls: - hosts: - mywebapp.example.com secretName: my-tls-secret rules: - host: mywebapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-web-app port: number: 80
1.9.4. 在服务类型和 API 资源之间进行选择 复制链接链接已复制到粘贴板!
服务类型和 API 资源为公开应用和安全网络连接提供了不同的好处。通过利用适当的服务类型或 API 资源,您可以有效地管理应用程序公开方式,并确保对内部和外部客户端的安全、可靠的访问。
OpenShift Container Platform 支持以下服务类型和 API 资源:
服务类型
-
ClusterIP用于仅限内部公开。易于设置,为访问集群中的服务提供稳定的内部 IP 地址。ClusterIP适合集群中服务间的通信。 -
NodePort允许通过在静态端口的每个节点 IP 上公开服务来实现外部访问。设置并可用于开发和测试非常简单。NodePort非常适合简单的外部访问,无需来自云提供商的负载平衡器。 -
LoadBalancer会自动置备外部负载均衡器来在多个节点之间分发流量。它是需要可靠、高可用性访问的生产环境的理想选择。 -
ExternalName将服务映射到外部 DNS 名称,以允许使用服务的 DNS 名称访问集群外的服务。最好将外部服务或旧系统与集群集成。 -
无头服务是一个 DNS 名称,可在不提供稳定的
ClusterIP的情况下返回 pod IP 列表。这适用于需要直接访问各个 pod IP 的有状态应用程序或场景。
-
API 资源
-
Ingress提供对路由 HTTP 和 HTTPS 流量的控制,包括支持负载平衡、SSL/TLS 终止和基于名称的虚拟主机。它比仅服务更灵活,并支持多个域和路径。当需要复杂的路由时,Ingress是理想的选择。 -
Route与Ingress类似,但提供额外的功能,包括 TLS 重新加密和透传。它简化了向外部公开服务的过程。当需要高级功能(如集成证书管理)时,Route时最佳选择。
-
如果您需要简单的方法来向外部流量公开服务,则 Route 或 Ingress 可能是最佳选择。这些资源可由命名空间 admin 或 developer 管理。最简单的方法是创建路由,检查其外部 DNS 名称,并将 DNS 配置为具有指向外部 DNS 名称的 CNAME。
对于 HTTP/HTTPS/TLS,Route 或 Ingress 应该会足够。如果使用其他方法会更加复杂,需要集群管理员来确保端口可以访问,或者配置了 MetalLB。在云环境中或适当配置的裸机环境中,LoadBalancer 服务也是一个选项。