KubernetesOpenShift

OpenShift PodIP 集群IP NodeIP Tips

在 Kubernetes 集群中,Pod IP、集群 IP 和 Node IP 是几个关键的网络概念,它们在功能和使用场景上有所区别。以下为你详细解释:

Pod IP


定义

Pod IP 是每个 Pod 在 Kubernetes 集群网络中被分配的唯一 IP 地址。Kubernetes 为每个 Pod 实例化一个独立的网络命名空间,就像为每个 Pod 配备了一个专属的 “网络身份证”,这个 “身份证号码” 就是 Pod IP。

每个 Pod 在 Kubernetes 集群中都会被分配一个唯一的 IP 地址,这个 IP 地址就被称为 Pod IP。它是 Pod 在集群网络中的标识,用于在集群内部进行通信。

特点

  • 动态性:Pod IP 是动态分配的,当 Pod 因资源调度、节点故障等原因被重新创建或迁移到其他节点时,它会获得新的 IP 地址。这是因为 Pod 的调度由 Kubernetes 调度器根据集群资源状况动态决定,不同节点的网络环境存在差异。
  • 生命周期短:Pod IP 的生命周期与 Pod 本身一致。当 Pod 被删除时,对应的 Pod IP 会被释放,不再被使用。
  • 动态分配:Pod IP 是在 Pod 创建时动态分配的,当 Pod 被删除或重新创建时,它可能会获得一个不同的 IP 地址。这是因为 Kubernetes 的调度器会根据集群的资源情况将 Pod 调度到不同的节点上,而每个节点的网络环境可能不同。
  • 生命周期与 Pod 一致:Pod IP 的生命周期与 Pod 本身的生命周期紧密相关。当 Pod 被销毁时,对应的 Pod IP 也会被释放,不再被使用。
  • 直接访问 Pod:在集群内部,其他 Pod 或服务可以通过 Pod IP 直接访问该 Pod。例如,一个 Web 应用 Pod 可以通过另一个数据库 Pod 的 Pod IP 来连接数据库服务。

用法

  • Pod 间通信:在集群内部,Pod 可以通过其他 Pod 的 IP 地址直接进行通信。例如,一个前端 Web 应用 Pod 需要与后端数据库 Pod 交互,前端 Pod 可以使用数据库 Pod 的 IP 地址建立连接。
  • 调试与监控:在排查问题或进行性能监控时,可通过 Pod IP 直接访问特定 Pod,获取其运行状态和日志信息。

示例

假设有一个名为 web - app - pod 的 Pod,它被分配了一个 Pod IP 为 10.244.1.10。在集群内部的其他 Pod 中,可以使用这个 IP 地址来访问 web - app - pod 提供的服务,如通过 http://10.244.1.10:80 访问其 Web 服务。

下面通过一个具体的场景,详细介绍 Pod IP 的分配、使用以及相关注意事项。

场景设定

假设我们有一个简单的微服务架构应用,包含前端 Web 应用和后端数据库服务。这两个服务分别部署在 Kubernetes 集群的不同 Pod 中,我们将通过 Pod IP 来实现它们之间的通信。

步骤 1:创建 Pod

首先,我们使用 YAML 文件来创建前端和后端的 Pod。

后端数据库 Pod(backend - db - pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: backend - db - pod
  labels:
    app: backend - db
spec:
  containers:
    - name: backend - db - container
      image: mysql:8.0
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"

通过以下命令创建该 Pod:

kubectl apply -f backend - db - pod.yaml

前端 Web 应用 Pod(frontend - web - pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: frontend - web - pod
  labels:
    app: frontend - web
spec:
  containers:
    - name: frontend - web - container
      image: nginx:1.21

同样使用以下命令创建该 Pod:

kubectl apply -f frontend - web - pod.yaml

步骤 2:获取 Pod IP

使用以下命令查看 Pod 的 IP 地址:

kubectl get pods -o wide

输出可能如下:

NAME               READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
backend - db - pod   1/1     Running   0          5m    10.244.1.10   node - 1     <none>           <none>
frontend - web - pod 1/1     Running   0          3m    10.244.2.20   node - 2     <none>           <none>

从输出中可以看到,backend - db - pod 的 Pod IP 是 10.244.1.10frontend - web - pod 的 Pod IP 是 10.244.2.20

步骤 3:使用 Pod IP 进行通信

现在,我们要让前端 Web 应用 Pod 连接到后端数据库 Pod。假设前端应用需要通过 MySQL 客户端连接到后端数据库,我们可以进入前端 Pod 的容器内部,使用 mysql 命令进行连接:

kubectl exec -it frontend - web - pod -- bash

进入容器后,使用以下命令连接到后端数据库:

mysql -h 10.244.1.10 -u root -p

输入之前设置的密码 password,如果一切正常,就可以成功连接到后端数据库。

注意事项

  • 动态性:如果 backend - db - pod 因为某些原因(如节点故障、资源调度等)被重新创建,它的 Pod IP 可能会发生变化。这时,前端 Web 应用就需要更新连接的 IP 地址,否则将无法连接到后端数据库。
  • 集群内部访问:Pod IP 只能在 Kubernetes 集群内部使用,外部网络无法直接通过 Pod IP 访问 Pod。如果需要从外部访问 Pod,需要使用其他方式,如 NodePort、LoadBalancer 或 Ingress。

通过这个例子,你可以清楚地看到 Pod IP 在 Kubernetes 集群中是如何分配和使用的,以及它在 Pod 间通信中的作用和局限性。

集群 IP


定义

集群 IP 是 Kubernetes 服务(Service)在集群内部的虚拟 IP 地址。服务是 Kubernetes 中一种抽象的概念,它为一组具有相同功能的 Pod 提供了一个统一的访问入口,而集群 IP 就是这个入口的标识。

特点

  • 静态性:集群 IP 在服务创建时被分配,并且在服务的整个生命周期内保持不变。无论后端的 Pod 如何变化,服务的集群 IP 始终稳定,这为其他组件提供了一个固定的访问地址。
  • 虚拟性:集群 IP 是一个虚拟的 IP 地址,它并不对应真实的物理网络接口,只是用于在集群内部进行路由和负载均衡。
  • 静态分配:与 Pod IP 不同,服务的集群 IP 是在服务创建时静态分配的,并且在服务的整个生命周期内保持不变。这使得其他 Pod 或服务可以使用固定的 IP 地址来访问该服务,而不用担心后端 Pod 的 IP 地址变化。
  • 负载均衡:服务的集群 IP 背后可以关联多个 Pod,当有请求发送到该集群 IP 时,Kubernetes 会自动将请求负载均衡到关联的 Pod 上。这样可以提高服务的可用性和性能。
  • 仅在集群内部可访问:服务的集群 IP 只能在集群内部使用,外部网络无法直接访问。如果需要将服务暴露到外部网络,通常需要使用 Ingress 或 NodePort 等方式。

用法

  • 服务发现:在 Kubernetes 集群中,应用程序可以通过服务的集群 IP 来发现和访问其他服务。例如,一个微服务架构的应用中,不同的服务之间可以通过彼此的集群 IP 进行通信。
  • 负载均衡:当有请求发送到服务的集群 IP 时,Kubernetes 会自动将请求负载均衡到后端关联的 Pod 上。这样可以提高服务的可用性和性能,避免单个 Pod 负载过高。

示例

假设有一个名为 web - service 的服务,它关联了多个 web - app - pod。该服务被分配了一个集群 IP 为 172.30.1.10。在集群内部的其他 Pod 中,可以使用这个集群 IP 来访问 web - service,如通过 http://172.30.1.10:80 访问其 Web 服务。Kubernetes 会自动将请求转发到关联的 web - app - pod 之一。

场景设定

假设我们有一个由多个副本组成的 Web 应用,部署在 Kubernetes 集群中,我们希望通过一个固定的 IP 地址来访问这个应用,并且实现负载均衡,让请求能够均匀地分发到各个副本上。这时就可以使用集群 IP 来实现。

步骤 1:创建 Deployment

首先,创建一个 Deployment 来部署 Web 应用的多个副本。以下是一个简单的 Deployment YAML 文件(web - app - deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web - app - deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web - app
  template:
    metadata:
      labels:
        app: web - app
    spec:
      containers:
        - name: web - app - container
          image: nginx:1.21
          ports:
            - containerPort: 80

使用以下命令创建 Deployment:

kubectl apply -f web - app - deployment.yaml

步骤 2:创建 Service

接下来,创建一个 Service 来为 Web 应用的 Deployment 提供集群 IP。以下是 Service 的 YAML 文件(web - app - service.yaml):

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

使用以下命令创建 Service:

kubectl apply -f web - app - service.yaml

步骤 3:获取集群 IP

使用以下命令查看 Service 的集群 IP:

kubectl get services

输出可能如下:

NAME            TYPE        CLUSTER - IP       EXTERNAL - IP   PORT(S)   AGE
web - app - service   ClusterIP   10.96.0.100      <none>        80/TCP    5m

这里的 10.96.0.100 就是 web - app - service 的集群 IP。

步骤 4:使用集群 IP 进行访问

在 Kubernetes 集群内部,其他 Pod 可以通过这个集群 IP 来访问 Web 应用。例如,我们可以创建一个测试 Pod,在其中使用 curl 命令来访问 Web 应用:

创建测试 Pod 的 YAML 文件(test - pod.yaml):

apiVersion: v1
kind: Pod
metadata:
  name: test - pod
spec:
  containers:
    - name: test - container
      image: busybox:1.35
      command: ["sh", "-c", "while true; do curl -s http://10.96.0.100; sleep 5; done"]

使用以下命令创建测试 Pod:

kubectl apply -f test - pod.yaml

测试 Pod 会不断地向 10.96.0.100 发送请求,Kubernetes 会自动将请求负载均衡到后端的 Web 应用 Pod 上。

注意事项

  • 集群内部通信:集群 IP 主要用于 Kubernetes 集群内部的通信,外部无法直接访问。如果需要外部访问,需要使用 NodePortLoadBalancer 等类型的 Service,或者通过 Ingress 来暴露服务。
  • 服务发现:在集群中,其他应用可以通过服务的名称或者集群 IP 来发现和访问该服务。Kubernetes 的 DNS 系统会自动将服务名称解析为集群 IP,方便应用之间的通信。
  • 负载均衡:集群 IP 配合 Kubernetes 的负载均衡机制,能够将请求均匀地分发到后端的 Pod 上,提高服务的可用性和性能。但是,具体的负载均衡算法和策略可以根据实际需求进行配置和调整。

通过这个例子,你可以了解到集群 IP 在 Kubernetes 中的作用和使用方法,以及如何通过集群 IP 来实现服务的暴露和负载均衡。编辑分享

Node IP


定义

Node IP 是 Kubernetes 集群中每个节点(物理机或虚拟机)的实际 IP 地址,也就是节点的物理网卡所配置的 IP 地址。

特点

  • 物理性:Node IP 是节点在网络中的真实标识,它对应着节点的物理网络接口。
  • 稳定性:通常情况下,Node IP 在节点的生命周期内保持相对稳定,除非节点的网络配置发生改变。

用法

  • 外部访问:通过 NodePort、LoadBalancer 等服务类型,可以将集群内部的服务暴露到外部网络。在这种情况下,外部客户端可以通过节点的 IP 地址和对应的端口来访问集群内的服务。
  • 节点管理:管理员可以使用 Node IP 对节点进行远程管理和监控,例如通过 SSH 连接到节点进行系统维护、查看节点的资源使用情况等。

三者的区别总结

类型分配方式生命周期用途访问范围
Pod IP动态分配与 Pod 一致Pod 间通信、调试监控集群内部
集群 IP静态分配与服务一致服务发现、负载均衡集群内部
Node IP物理配置相对稳定外部访问、节点管理内外部均可

这些 IP 地址相互协作,共同构建了 Kubernetes 集群的网络通信体系,使得应用程序能够在集群内高效、稳定地运行,并与外部环境进行交互。编辑分享

场景设定

假设你有一个 Kubernetes 集群,由多个节点组成,其中一个节点运行着一个需要对外提供服务的应用,并且该应用通过 NodePort 类型的 Service 暴露到外部网络,外部客户端将通过 Node IP 和 NodePort 来访问这个应用。

步骤 1:查看节点信息

首先,使用以下命令查看 Kubernetes 集群中的节点列表及相关信息,包括 Node IP:

kubectl get nodes -o wide

输出可能如下:

NAME        STATUS   ROLES    AGE   VERSION   INTERNAL - IP   EXTERNAL - IP   OS - IMAGE             KERNEL - VERSION      CONTAINER - RUNTIME
node - 1    Ready    <none>   10d   v1.23.0   192.168.1.100   <none>        Ubuntu 20.04.4 LTS   5.15.0 - 43 - generic   containerd://1.6.4
node - 2    Ready    <none>   10d   v1.23.0   192.168.1.101   <none>        Ubuntu 20.04.4 LTS   5.15.0 - 43 - generic   containerd://1.6.4

这里的 192.168.1.100 和 192.168.1.101 分别是 node - 1 和 node - 2 的内部 IP 地址,也就是 Node IP。在实际环境中,如果节点有公网 IP,也可能会在 EXTERNAL - IP 字段显示。

步骤 2:部署应用

接下来,创建一个 Deployment 来部署应用。以下是一个简单的 Deployment YAML 文件(app - deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app - deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my - app
  template:
    metadata:
      labels:
        app: my - app
    spec:
      containers:
        - name: app - container
          image: nginx:1.21
          ports:
            - containerPort: 80

使用以下命令创建 Deployment:

kubectl apply -f app - deployment.yaml

步骤 3:创建 Service

创建一个 NodePort 类型的 Service 来暴露应用。以下是 Service 的 YAML 文件(app - service.yaml):

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

使用以下命令创建 Service:

kubectl apply -f app - service.yaml

步骤 4:使用 Node IP 访问应用

在这个例子中,应用通过 NodePort 30080 暴露到外部网络。外部客户端可以通过访问任意节点的 Node IP 和 NodePort 来访问应用,例如:http://192.168.1.100:30080 或 http://192.168.1.101:30080。Kubernetes 会将请求转发到后端运行着应用的 Pod 上。

注意事项

  • 节点网络配置:确保节点之间的网络是可达的,并且外部客户端能够访问到节点的 IP 地址。如果节点位于私有网络中,可能需要进行网络地址转换(NAT)或其他网络配置,以便外部能够访问。
  • 服务分布:当使用 NodePort 类型的 Service 时,请求可以到达任何一个节点,然后由节点将请求转发到对应的 Pod。因此,要确保应用在各个节点上都能正常运行,或者根据实际情况进行合理的负载均衡和故障转移配置。
  • 安全性:直接通过 Node IP 和 NodePort 暴露服务到外部网络可能存在安全风险。建议根据实际需求配置防火墙规则、TLS 加密等安全措施,以保护应用和数据的安全。

通过这个例子,你可以看到 Node IP 在 Kubernetes 集群中如何用于外部访问应用,以及相关的配置和注意事项。

如何在集群外访问服务?


若想在集群外访问服务 ,集群 IP 本身不行,因为它是仅用于集群内部通信的虚拟 IP 。一般可借助以下几种 IP 来实现集群外访问:

Node IP + NodePort

  • 原理:NodePort 类型的服务会在集群每个节点上开放一个特定端口(NodePort ),外部可通过任意节点的 Node IP(节点的物理网卡 IP )和该 NodePort 访问服务 。Kubernetes 会将请求转发到后端对应的 Pod 。
  • 示例:假设集群有节点 A(IP:192.168.1.10 )、B(IP:192.168.1.11 ) ,创建 NodePort 服务开放 30080 端口映射到后端服务 ,那么外部可通过 http://192.168.1.10:30080 或 http://192.168.1.11:30080 访问 。

外部负载均衡器 IP(LoadBalancer 类型服务 )

  • 原理:在支持负载均衡器的云环境(如 AWS、GCE 等 )中,创建 LoadBalancer 类型服务 ,云提供商自动分配一个外部负载均衡器 ,并赋予一个公网 IP 。负载均衡器将外部请求转发到集群内对应的服务及 Pod 。
  • 示例:在 AWS 上创建 LoadBalancer 服务 ,分配公网 IP 为 52.123.45.67 ,将其配置为监听 80 端口并映射到集群内服务的 8080 端口 ,外部就能通过 http://52.123.45.67 访问 。

Ingress 的 IP(结合 NodePort 或 LoadBalancer )

  • 原理:Ingress 用于管理集群外到集群内服务的 HTTP 和 HTTPS 流量 。它可基于域名、URL 路径等规则将外部请求转发到后端服务 。实际部署中,Ingress Controller 常结合 NodePort 或 LoadBalancer 实现 ,对应会有可从外部访问的 IP 。
  • 示例:通过 NodePort 方式暴露 Ingress Controller 服务 ,获取节点 IP 和对应端口 ;或使用 LoadBalancer 为 Ingress Controller 分配公网 IP ,如 104.21.32.43 ,再配置域名解析到该 IP ,如 app.example.com ,外部就能通过域名访问相关服务 。