K8s的Service详解

发布于:2025-03-05 ⋅ 阅读:(14) ⋅ 点赞:(0)

最近在将一些服务从单纯的docker迁移到k8s,这个过程中服务的pod跑起来后就需要配置service将服务暴露到集群内或者集群外,这个时候就被service的配置搞的有点混乱:要配置port、nodePort、targetPort这三个port。这三个port分别代表什么,我应该怎么配置,于是花了点时间了解了一下,希望能帮到有同样疑惑的同学。

一、Service的设计初衷

在了解它的具体内容之前,我一般会先去了解一下它是为什么被设计出来的。
在Kubernetes(k8s)集群中,Pod是基本的调度单元,但它们具有生命周期且IP地址是动态分配的。这意味着Pod可能会因为各种原因(如扩缩容、滚动升级等)被销毁并重新创建,其IP地址也会随之改变。这种动态性给集群内部的服务发现与访问带来了挑战。为了解决这个问题,Kubernetes引入了Service这一抽象概念。

Service的设计初衷是为Pod提供一个稳定的网络接口和持久的IP地址,使得客户端能够以一种稳定的方式访问后端的一组Pod。Service通过标签选择器(Label Selector)绑定一组Pod,为它们提供统一的访问入口和负载均衡能力。这样,即使后端Pod发生变化,客户端的访问也不会受到影响。

二、Service中的端口介绍及关系

在Kubernetes中,Service与端口的关系非常紧密。Service定义中包含了多个与端口相关的字段,包括port、nodePort和targetPort。这些端口在Service的工作流程中扮演着不同的角色。

  1. Port

    • 定义:Port是Service对外暴露的端口,用于集群内部客户端访问Service。
    • 作用:当集群内部的客户端(如另一个Pod)想要访问Service时,它们会通过Service的ClusterIP和Port来发送请求。
    • 示例:在一个Web应用的Service中,Port可能被设置为80,这样集群内的其他Pod就可以通过clusterIP:80来访问这个Web应用。
  2. NodePort

    • 定义:NodePort是Service的一个属性,它定义了一个在每个Node上开放的端口号。通过NodeIP和NodePort,集群外部的客户端可以访问Service。
    • 作用:NodePort提供了一种将Service暴露到集群外部的方式。当外部客户端访问NodeIP:NodePort时,请求会被路由到相应的Service,然后再转发到目标Pod的TargetPort。
    • 示例:假设我们将NodePort设置为30001,那么外部用户就可以通过浏览器访问http://node:30001来访问k8s集群中的一个Web应用。
    • 注意:NodePort会在集群中的每个节点上开放一个端口(通常在30000-32767范围内),这可能会占用大量的端口资源。因此,在生产环境中,通常会使用更高级的负载均衡器或Ingress控制器来处理外部访问。
  3. TargetPort

    • 定义:TargetPort是Service要转发到哪个容器端口的定义。当请求到达Service的Port或NodePort时,Kubernetes会将流量转发到对应Pod的TargetPort。
    • 作用:TargetPort确保了Service能够将流量正确地转发到后端Pod的应用程序端口上。
    • 示例:在一个Web应用的Service中,如果Pod内部的应用程序监听在8080端口上,那么TargetPort就应该被设置为8080。
    • 关系:TargetPort必须与Pod内部容器的ContainerPort一致,这样才能确保流量能够正确地进入容器。
三、Port、NodePort与TargetPort的关系

在Kubernetes中,Port、NodePort和TargetPort共同构成了Service的端口管理体系。它们之间的关系可以概括为以下几点:

  • Port是Service对外暴露的端口,用于集群内部访问。
  • NodePort是Service暴露给集群外部客户端的端口,通过NodeIP和NodePort可以从外部访问Service。
  • TargetPort是Service要转发到哪个容器端口的定义,必须与Pod内部容器的ContainerPort一致。

所以总结一下,port就是集群内部访问这个service的端口,nodePort就是集群外部访问这个service的端口,targetPort就是通过这个服务想要暴露的pod的端口


网站公告

今日签到

点亮在社区的每一天
去签到