Kubernetes 集群内的流量如何流动?

How does Traffic Flow inside a Kubernetes Cluster?

(在学习 Kubernetes 的过程中,我从未真正找到任何好的资源来解释这一点)

场景:
我拥有 mywebsite1.com 和 mywebsite2.com,我想将它们都托管在 Kubernetes 集群中。

我根据以下网站使用 2 个
kubectl apply -f < url > 命令部署了一个通用的云入口控制器。 (mandatory.yaml 和通用 ingress.yaml)
https://kubernetes.github.io/ingress-nginx/deploy/

所以问题是该架构是什么样的?以及数据如何流入集群?

我将 2 个证书转换为 2 个 .key 和 2 个 .crt 文件
我使用这些文件制作 2 个 TLS 机密(每个网站 1 个,以便它们启用 HTTPS)

我创建了 2 个 Ingress 对象:

  • 一个说 website1.com/ 的,指向一个名为 website1fe 的服务,并引用 website1 的 HTTPS/TLS 证书秘密。
    (website1fe 服务仅侦听端口 80,并将流量转发到由 website1fe 部署生成的 pods)

  • 另一个说 website2.com/,指向一个名为 website2fe 的服务,并引用 website2 的 HTTPS/TLS 证书秘密。
    (website2fe 服务仅侦听端口 80,并将流量转发到由 website2fe 部署生成的 pods)

我有一个位于私有子网中的 3 节点 Kubernetes 集群。
他们有 IP

 10.1.1.10     10.1.1.11     10.1.1.12

当我 运行 2
kubectl apply -f < url > 命令
生成的命令:

  • 包含 pods 运行 Nginx L7 LB 软件的 kubernetes 部署,它基于存储在 etcd 中的 Ingress .yaml 对象以声明方式配置自己,因为 nginx L7 LB pods 是自己的配置时,它们被称为 Ingress Controller Pods。 (这些 nginx 入口控制器 pods 侦听端口 80 和 443。)
  • A Kubernetes Service of type Load Balancer: Kubernetes Service of type Load Balancer, uses Nodeports behind the scenes, (NodePort is safe to use when the nodes have private IPs, the NodePorts 运行domly (注:服务类型 LB 在幕后使用 NodePorts,将 运行domly 选择,云 API 将自动 link 云 LB 到正确的 运行dom NodePort。或者你可以使用服务类型NodePort 并获得显式选择 NodePort 的选项。)从 30000 - 32767 的 运行ge 中选择,但为了清楚起见,我会说 NodePort 服务正在侦听集群中每个节点的端口 30080 和 30443 ), 一个 Cloud LB 被自动配置并存在于集群外部,具有 public IP 地址(使用默认设置),它自动将流量路由到 Ingress Controller 暴露的 NodePort。 (流量示例:LB:443 --> NP:30443 --> IngressControllerPod:443 --> Grafana:3000)

kubectl get svc --all-namespaces
给出 L4 LB 的 IPv4 IP 地址(假设它是 public 可路由的 IP 1.2.3.4)

因为我拥有这两个域:我配置 Internet DNS,以便 website1.com 和 website2.com 都指向 1.2.3.4

注意:入口控制器是云提供商感知的,因此它自动执行以下反向 proxy/load 平衡配置:

L4LB 1.2.3.4:80 --(LB between)--> 10.1.1.10:30080, 10.1.1.11:30080, 10.1.1.12:30080
L4LB 1.2.3.4:443 --(LB between)--> 10.1.1.10:30443, 10.1.1.11:30443, 10.1.1.12:30443

KubeProxy 使任何节点的端口 30080 或 30443 上的请求在集群内部转发到 Nginx L7 LB/Ingress 控制器服务,然后将流量转发到 L7 Nginx LB Pods .
L7 Nginx LB pods 终止* HTTPS 连接并将流量转发到 website1.com 和 website2.com 服务,这些服务正在侦听未加密的端口 80。
(未加密没关系因为我们在集群中,没有人会嗅探流量。)(*注意有时云 LB 会终止 HTTPS,然后通过明文端口 80 转发到入口控制器,但这还不错 b/c 明文文本通过私有 IP space)
(Nginx L7 LB 根据流量传入的 L7(http://url) 地址知道要转发到哪个内部集群 service/website)


注意要避免的错误: 假设 website1.com 想要访问 website2.com

上存在的一些资源

嗯website2.com实际上有2个IP地址和2个DNS名称。
website2fe.default.svc.cluster.local <-- 内部集群可解析 DNS 地址
website2.com <-- 外部解析 DNS 地址

而不是让 website1 通过 website2.com 访问资源 您应该可以通过 website2fe.default.svc.cluster.local 访问 website1 资源 (这是更有效的路由)