Kubernetes服务访问-ClusterIP、Nodeport、Loadbalancer和Ingress

本文介绍了Kubernetes中四种服务访问方式:ClusterIP、NodePort、LoadBalancer和Ingress。ClusterIP仅限内部访问,NodePort通过节点端口暴露服务,LoadBalancer提供标准的外部访问方式,而Ingress作为智能路由器实现多服务路由。根据需求和成本考虑选择合适的服务暴露策略。

Kubernetes服务访问-ClusterIP、Nodeport、Loadbalancer和Ingress

​ NodePort,LoadBalancer 和 Ingress 之间的区别是什么?, 它们是将外部流量引入群集的不同方式,并且实现方式不一样。 我们来看看它们是如何工作的,以及什么时候该用哪种。

ClusterIP

ClusterIP 服务是默认的 Kubernetes 服务。 它为您提供集群内部其他应用程序可以访问的服务, 外部无法访问。

ClusterIP 服务的 YAML 类似这样:

apiVersion: v1
kind: Service
metadata:  
  name: my-internal-service
selector:    
  app: my-app
spec:
  type: ClusterIP
  ports:  
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP

如果你不能从集群外部上访问一个 ClusterIP 服务,我为什么要谈论它? 因为你可以使用 Kubernetes Proxy 来访问它!19151456_0O0U.png启动 Kubernetes Proxy:

$ kubectl proxy --port=8080

现在,你可以使用如下的 Kubernetes API 访问服务:

http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/

所以,如果要访问我们刚刚定义的服务,可以使用下面的地址:

http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/

什么时候用?

有几种情况可以使用 Kubernetes Proxy 来访问您的服务:

  • 调试您的服务,或由于某种原因直接从你笔记本电脑连接到它们
  • 允许内部流量,显示内部仪表盘等

由于此方法要求您用已授权用户运行 kubectl ,因此您不应该使用此方法将您的服务公开到公网上或将其用于生产。

NodePort

NodePort 服务是暴露服务的最原始方式。 顾名思义,NodePort 会在所有节点(VM)上打开一个特定的端口,并且发送到此端口的任何流量都将转发到该服务。19151457_7m4w.pngNodePort 服务的 YAML 类似这样:

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

基本上,NodePort 服务与普通的 “ClusterIP” 服务 YAML 定义有两点区别。 首先,type 是 “NodePort”。还有一个称为 nodePort 的附加端口,指定在节点上打开哪个端口。 如果你不指定这个端口,它会选择一个随机端口。

什么时候用?

这种方法有许多缺点:

  • 每个端口只能有一个服务
  • 默认您只能使用端口30000-32767
  • 如果您的 节点/虚拟机 IP 地址发生更改,则需要处理该问题

由于这些原因,我不建议在生产中使用这种方法。 如果您运行的服务不必始终可用,或者您非常关注成本,则此方法适用于您,比如演示程序或临时应用。

LoadBalancer

LoadBalancer 服务暴露服务的标准方式。 在 GKE 上,这将启动一个网络负载平衡器,它将为您提供一个将所有流量转发到您的服务的IP地址。19151459_xNmA.png

什么时候用?

如果你想直接暴露一个服务,这是默认的方法(GKE上)。 您指定的端口上的所有流量都将被转发到该服务, 没有过滤、路由等。这意味着您可以发送几乎任何类型的流量,如 HTTP,TCP,UDP,Websockets,gRPC 或其他。

最大的缺点是,您使用 LoadBalancer 公开的每项服务都将获得自己的 IP 地址,并且您必须为每个暴露的服务使用一个 LoadBalancer,这可能会付出比较大的代价!

Ingress

与以上所有例子不同,Ingress 实际上不是一种服务。相反,它位于多个服务之前,充当集群中的“智能路由器”或入口点。

您可以使用 Ingress 做很多不同的事情,并且有许多类型的 Ingress 控制器,具有不同的功能。

GKE 默认的 Ingress 控制器将为您启动一个 HTTP(S)负载均衡器。 这将使您可以执行基于路径和基于子域名的路由到后端服务。 例如,您可以将 foo.yourdomain.com 上的所有内容发送到 foo 服务,并将 yourdomain.com/bar/ 路径下所有内容发送到 bar 服务的。19151507_EtG1.png在 GKE 上的 七层 HTTP 负载均衡器 的 Ingress 对象 YAML 定义类似这样:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  backend:
    serviceName: other
    servicePort: 8080
  rules:
  - host: foo.mydomain.com
    http:
      paths:
      - backend:
          serviceName: foo
          servicePort: 8080
  - host: mydomain.com
    http:
      paths:
      - path: /bar/*
        backend:
          serviceName: bar
          servicePort: 8080

什么时候用?

Ingress 可能是暴露服务最强大的方式了,但也可能是最复杂的。 来自 Google Cloud Load Balancer, Nginx, Contour, Istio 等的 Ingress 控制器类型很多。 还有用于 Ingress 控制器的插件,如 cert-manager,可以为您的服务自动提供 SSL 证书。

ic-management/ingress.html) 等的 Ingress 控制器类型很多。 还有用于 Ingress 控制器的插件,如 cert-manager,可以为您的服务自动提供 SSL 证书。

如果您希望在相同的 IP 地址下暴露多个服务,并且这些服务都使用相同的L7协议(通常是HTTP),则 Ingress 是最有用的。 如果您使用原生 GCP 集成,您只需支付一个负载平衡器,由于 Ingress 很“智能”,您可以获得许多开箱即用的功能(如 SSL,Auth,路由等)

<think>嗯,用户想了解ClusterIPNodePortLoadBalancer这三种Kubernetes服务类型的区别。这个问题很清晰,正好结合站内引用内容来回答。 用户提供的引用材料已经概括了三种类型的核心特点:引用1提到ClusterIP用于内部通信,NodePort处理外部访问但有限制,LoadBalancer与云服务集成实现高效流量管理。引用2补充说明LoadBalancer本质是建立在NodePort之上的,通过云供应商的负载均衡器暴露服务。引用3则强调Service的核心作用是提供稳定的访问端点。 从用户当前问题看,ta应该是个刚接触Kubernetes的网络工程师或DevOps,需要基础概念辨析。不过ta特意要求"尽可能多参考上次问题",但我发现这是首次讨论该主题,可能用户误操作了提示语句。 准备用三层结构对比这三种服务类型:第一层解释ClusterIP作为基础内部通信的特性;第二层说明NodePort如何通过节点端口实现外部访问;第三层描述LoadBalancer如何借助云平台扩展功能。每个类型都会包含访问范围、典型应用场景限制条件三要素。 需要特别注意引用2提到的技术细节:LoadBalancer实际包含ClusterIPNodePort的所有功能,这个层级关系必须明确。另外要强调NodePort的端口冲突风险,以及LoadBalancer对云环境的依赖性,这些都是实际使用时的关键考量点。 最后考虑设计几个延伸问题:比如IngressLoadBalancer的配合使用方案,或者Service类型的选择策略,帮助用户建立系统认知。毕竟理解区别后,下一步自然要解决如何选用的问题。 </think>以下是KubernetesClusterIPNodePortLoadBalancer三种服务类型的核心区别及使用场景: --- ### **1. ClusterIP(默认类型)** - **访问范围**: 仅在集群**内部**可访问(如Pod间通信) - **IP分配**: 分配集群内部虚拟IP(VIP),如 `10.96.x.x` - **典型场景**: 数据库服务、内部API、微服务间调用 - **限制**: 无法直接从集群外部访问 **示例配置**: ```yaml kind: Service spec: type: ClusterIP # 可省略(默认类型) ports: - port: 6379 # 服务端口 selector: app: redis ``` --- ### **2. NodePort** - **访问范围**: 暴露到集群**外部**(通过节点IP+端口) - **端口机制**: 在每个节点上开放**固定端口**(默认范围30000-32767),外部通过 `节点IP:端口` 访问 - **层级关系**: 自动包含ClusterIP功能(内部仍可通过ClusterIP访问- **限制**: • 需手动管理节点IP变化 • 端口冲突风险 • 不直接支持负载均衡 **示例配置**: ```yaml kind: Service spec: type: NodePort ports: - port: 80 # 服务端口 nodePort: 30080 # 节点暴露端口(可选) selector: app: nginx ``` --- ### **3. LoadBalancer** - **访问范围**: 通过**云服务商负载均衡器**暴露到公网 - **工作流程**: 1. 自动创建外部负载均衡器(如AWS ALB、GCP LB) 2. 负载均衡器将流量转发到各节点的NodePort 3. 最终路由到Pod(含ClusterIP层) - **核心优势**: • 自动公网IP分配 • 内置负载均衡健康检查 • 集成云平台安全组(如防火墙规则) - **限制**: • 依赖云服务商(本地环境需替代方案如MetalLB) • 可能产生云服务费用 **示例配置**: ```yaml kind: Service spec: type: LoadBalancer ports: - port: 443 selector: app: web-app ``` --- ### **关键区别总结** | 特性 | ClusterIP | NodePort | LoadBalancer | |--------------------|--------------------|------------------------|----------------------------| | **访问范围** | 仅集群内部 | 节点IP+端口(外部可访问)| 云负载均衡器(公网可访问) | | **IP类型** | 内部虚拟IP | 节点真实IP | 云服务商分配公网IP | | **负载均衡能力** | 无(集群内轮询) | 无 | 云厂商提供全局负载均衡 | | **适用环境** | 所有K8s环境 | 所有K8s环境 | 公有云/支持LB的私有云 | | **层级依赖** | 基础层 | 包含ClusterIP | 包含ClusterIP+NodePort | > 注:LoadBalancer本质是NodePort的扩展,通过云平台LB将公网流量接入NodePort[^2],而NodePort又依赖ClusterIP的内部路由能力[^3]。 --- ### **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值