k8s~你应该知道的ip和你应该知道的端口

发布时间 2023-12-26 10:21:10作者: 张占岭

你应该知道的ip

  • Node IP
  • Cluster IP
  • Pod IP
  • Container IP

Node IP

node ip是指k8s节点的ip地址,这个ip是具体的服务器,它上面的端口是node port,是真实服务器上的端口。

Cluster IP

在 Kubernetes 中,ClusterIP 是指 Service 类型中的一种,它为集群内部的其他资源提供了一个虚拟 IP 地址。这个虚拟 IP 只在集群内部可见,用于将请求负载均衡到后端 Pod 上。

具体来说,当你创建一个 ClusterIP 类型的 Service 时,Kubernetes会为该服务分配一个虚拟的 ClusterIP 地址,这个地址只能在集群内部使用。当其他资源需要访问该服务时,它们可以通过 ClusterIP 地址来与 Service 进行通信,而无需关心后端 Pod 的具体 IP 地址。

总之,ClusterIP 是一个由 Kubernetes 分配并管理的虚拟 IP 地址,用于在集群内部提供服务发现和负载均衡功能。

在 Kubernetes 中,ClusterIP 是由 kube-proxy 组件生成和管理的。kube-proxy 是 Kubernetes 中负责实现服务发现和负载均衡的关键组件之一。它通过监视 API 服务器上 Service 和 Endpoint 对象的变化,然后更新集群中的网络规则来实现服务的负载均衡和代理转发。
具体地说,当你创建一个 ClusterIP 类型的 Service 时,kube-proxy 将会监听这个 Service 的信息,并为其分配一个虚拟的 ClusterIP 地址。同时,kube-proxy 会维护一个关于 Service 和对应 Pod IP 地址的映射表,以便正确地将请求转发到后端 Pod 上。
因此,kube-proxy 是负责生成和管理 ClusterIP 的组件,在整个 Kubernetes 集群中起着非常重要的作用。

Pod IP

在 Kubernetes 中,Pod 的 IP 地址是由网络插件(CNI 插件)负责生成和管理的。Kubernetes 本身并不直接生成 Pod 的 IP 地址,而是将这一任务交给网络插件来处理。

当一个 Pod 被创建时,网络插件会为该 Pod 分配一个 IP 地址。这个 IP 地址通常是从预先定义的 Pod 网络地址池中动态分配的。网络插件负责确保每个 Pod 都拥有一个唯一的、可路由的 IP 地址,并且能够与集群内的其他资源进行通信。

不同的网络插件可能会采用不同的方式来生成 Pod 的 IP 地址,例如使用 overlay 网络、VXLAN、flannel 网络等技术。但无论采用何种技术,网络插件都必须确保生成的 IP 地址是唯一的,并且能够正确地与集群中的其他组件进行通信。

因此,Pod 的 IP 地址是由网络插件根据集群配置和网络策略动态生成的,这也使得 Kubernetes 能够灵活地适应不同类型的网络环境和需求。

container IP

在 Kubernetes 中,Pod 最终会包含一个或多个容器,并且每个容器都会拥有自己的 IP 地址。这些容器 IP 地址与 Pod IP 地址是相关联的,但并不完全相同。

Pod 的 IP 地址是由网络插件分配的,而容器 IP 地址则是由容器运行时(如 Docker 或 Containerd)负责生成和管理的。通常情况下,容器 IP 地址是从 Pod 的 IP 地址空间中动态分配的,因此它们是相关联的。

在 Kubernetes 中,容器 IP 地址是通过容器运行时在 Pod 网络命名空间中为容器分配的。当容器启动时,容器运行时会为其分配一个 IP 地址,并将其添加到 Pod 网络命名空间中。这样,每个容器就拥有了自己的 IP 地址,可以在 Pod 内部进行通信。

总之,Pod IP 地址是由网络插件分配给整个 Pod 的,而容器 IP 地址是由容器运行时在 Pod 内部分配给每个容器的。它们之间是相关联的,但是在技术上是两个不同的概念。

你应该知道的端口

  • node port
  • port
  • target port
  • container port

node port

首先,nodePort是kubernetes提供给集群外部客户访问service入口的一种方式(另一种方式是LoadBalancer),所以,:nodePort 是提供给集群外部客户访问service的入口。

port

这里的port表示:service暴露在cluster ip(虚拟IP,只在集群内部使用)上的端口,:port 是提供给集群内部客户访问service的入口。

targetPort

targetPort很好理解,targetPort是pod上的端口,从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。

不管是通过集群内部服务入口:port还是通过集群外部服务入口:nodePort的请求都将重定向到本地kube-proxy端口(随机端口)的映射,然后将到这个kube-proxy端口的访问给代理到远端真实的pod地址上去。

containerPort

这是容器里应用监听的端口,一般我们会把target port与container port设置成相同的值,不过,这两个端口本质不是一个东西,一个请求经过port/nodePort经过kube-proxy流入targetPort,最后通过containerPort进入容器。