在 Kubernetes 中,当您创建 NodePort 类型的服务时,流量不会直接从主机的 IP 和端口转发到特定 Pod 的 IP 和端口。相反,流量被转发到集群中的一个节点,然后从那里转发到相应的 Pod。

1、当您创建 NodePort 类型的服务时,Kubernetes 会在集群中的每个节点上分配预定义范围(通常在 30000-32767 范围内)的端口。

2、当流量发送到指定 NodePort 上的主机 IP 地址时,接收流量的节点使用其内部路由来确定哪个 Pod 应接收流量。

3、然后,Kubernetes 使用服务的集群 IP 将流量转发到选定的 Pod。服务负责在与服务选择器匹配的容器之间对流量进行负载平衡。

总之,发往 NodePort 服务的流量首先发送到集群中的节点,然后根据服务的内部负载均衡机制将其路由到服务后面的某个 Pod。流量不会直接从主机 IP 和端口转发到特定的容器 IP 和端口。

eg:

假设你有一个 Kubernetes 集群,其中包括三个节点,它们分别有以下IP地址:

  • Node1: 192.168.1.100        节点 1:192.168.1.100
  • Node2: 192.168.1.101        节点 2:192.168.1.101
  • Node3: 192.168.1.102        节点 3:192.168.1.102

现在,你创建了一个 NodePort 类型的 Service,它暴露了端口 80,并选择了一组 Pod,这些 Pod 运行一个 Web 应用程序,监听端口 8080。你的 Service 配置可能如下所示:

apiVersion: v1
kind: Service
metadata:
  name: my-web-service
spec:
  selector:
    app: my-web-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: NodePort

在这种情况下,Kubernetes会执行以下操作:

  1. Kubernetes为集群中的每个节点分配一个随机的 NodePort(在大多数情况下,NodePort会在30000到32767之间随机选择)。假设分配的NodePort为30080。

  2. 当有来自外部的请求,例如浏览器请求 http://Node1:30080 时,流量将被路由到 Node1,因为该请求使用了 Node1 的 IP 地址和 NodePort。

  3. 在 Node1 上,Kubernetes会检查 Service 的选择器(selector)以确定哪些 Pod 符合条件(在本例中是标记为 app: my-web-app 的 Pod)。

  4. Kubernetes将请求从 Node1 转发到符合条件的 Pod 中的一个,通常使用轮询或IP散列等方法来实现负载均衡。

  5. 请求最终到达一个运行你的 Web 应用程序的 Pod,该应用程序监听端口 8080,并响应请求。

总之,NodePort Service 将流量路由到集群中的一个节点,然后再根据 Service 的选择器将流量路由到符合条件的 Pod 上,以实现负载均衡。这是 Kubernetes 中一种常见的服务暴露方式,使得你可以通过节点的 IP 地址和 NodePort 来访问服务。

作为新手,你可能还要问那 外部用户怎么通过80端口进行访问呢?

如果你希望外部用户可以通过标准 HTTP 端口 80 访问你的服务,你可以使用 Kubernetes Ingress Controller 来将外部流量引导到你的 NodePort 服务。下面是一个简单的示例来说明这一点:

  1. 创建一个 NodePort 服务: 创建一个 NodePort 服务来公开你的应用程序,就像之前的示例中一样。这个服务将监听一个高端口(例如 30080),然后将流量路由到你的应用程序的 Pod。

  2. 创建 Ingress 资源: 创建一个 Ingress 资源,将外部 HTTP 流量引导到你的 NodePort 服务。下面是一个示例 Ingress 配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: your-domain.com  # 你的域名
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-web-service  # 你的 NodePort 服务名称
                port:
                  number: 80

在这个示例中,Ingress 规则将外部流量从域名 your-domain.com 引导到名为 my-web-service 的 NodePort 服务的端口 80。

  1. 部署 Ingress Controller: 你需要在集群中部署一个 Ingress Controller,例如 Nginx Ingress Controller 或 Traefik,以便它能够理解和处理 Ingress 资源。根据你选择的 Ingress Controller,你需要遵循相应的部署和配置指南。

  2. 配置域名解析: 在你的域名服务提供商处配置域名解析,将你的域名(例如 your-domain.com)指向集群中的一个或多个节点的公共 IP 地址。

一旦你完成上述步骤,外部用户将能够通过标准 HTTP 端口 80 访问你的服务。Ingress Controller 将负责将流量从域名引导到相应的 NodePort 服务,然后再路由到你的应用程序的 Pod。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐