Kubernetes-Service 之 Cluster IP

在 Kubernetes 集群中,服务是一个抽象的概念,它用于将访问 Pod 的请求统一管理和路由。Kubernetes 的服务有四种类型,分别是:

  • ClusterIP
  • NodePort
  • LoadBalancer
  • ExternalName

在本文中,我们将重点介绍 ClusterIP 类型的服务,并详细讲解它的用法、原理和实践。

什么是 ClusterIP?

ClusterIP 是 Kubernetes 中最基础的一种服务类型,它为同一个 Namespace 内的 Pod 提供了一个稳定的虚拟 IP 地址。当一个客户端请求 ClusterIP 服务的 IP 地址时,Kubernetes 将会自动进行负载均衡,把请求转发到某个 Pod 上。

ClusterIP 的作用主要是在一个 Namespace 内部提供负载均衡的内部服务,不对外暴露,外界无法直接访问。

ClusterIP 的使用方法

在 Kubernetes 中,创建 ClusterIP 服务非常简单,只需要在 YAML 文件中定义一个 Service 对象,并指定 spec.type 参数为 ClusterIP 即可。

上面的 YAML 文件中,我们定义了一个名字为 my-service 的 ClusterIP 服务,它的目标端口为 9376,到达服务后将被转发到运行了 MyApp 的 Pod 上。

需要注意的是,我们在 Service 对象中指定了 selector 字段,这个字段用来声明服务所要绑定的目标 Pod。在上面的例子中,我们将服务绑定到了运行了 MyApp 应用的 Pod 上。

ClusterIP 的原理

在 Kubernetes 集群中,每个服务都有一个对应的 iptables 规则,它将运行了这个服务的 Pod 的 IP 地址映射到该服务的虚拟 IP 地址上。当客户端请求服务的 IP 地址时,Kubernetes 将会自动进行负载均衡,把请求转发到某个 Pod 上。

需要注意的是,Service 对象只能通过 Pod 的 Label 进行选择器匹配,因此,当 Kubernetes 检测到新的 Pod 被添加或者被删除时,它会自动更新 iptables 规则和选取规则,确保客户端能够访问到最新的 Pod。

ClusterIP 的实践

现在我们来实践一下 ClusterIP 服务的创建和访问流程。

创建服务

我们先创建一个 Deployment,它包含了一个名为 myapp 的 Pod。

这个 Deployment 部署了三个 Pod,每个 Pod 运行的都是 Nginx 镜像,并监听 80 端口,接下来我们来创建该 Deployment 对应的 ClusterIP 服务。

这个 YAML 文件定义了一个名为 myapp-service 的 ClusterIP 服务,它的目标端口和服务端口都是 80,指向 selector 为 app=myapp 的 Pod。现在我们可以通过 kubectl create 命令来创建这个服务了。

测试服务

我们已经创建了一个运行了三个 Nginx Pod 的 ClusterIP 服务,现在我们来测试一下。

执行以上命令会进入一个 alpine 容器,可用来测试 myapp-service 的可用性。现在我们使用 curl 命令测试一下该服务是否可用。

当我们访问该服务时,Kubernetes 会自动将请求转发到其中一个运行中的 Pod 上,因此每次访问返回的结果都可能不同。

总结

在本文中,我们详细介绍了 Kubernetes 服务中 ClusterIP 的用法、原理和实践,并给出了相应的示例。作为 Kubernetes 中最基础的一种服务类型,ClusterIP 在微服务开发中的作用也是至关重要的。对于使用 Kubernetes 做服务注册和服务发现的开发者来说,详细了解 ClusterIP 的原理和使用方法,对提高服务的可用性和扩展性将有重要的作用。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6537532e7d4982a6ebfcd0f1


纠错
反馈