一、Kubernetes Service常见类型详解

K8s提供了多种Service类型,以满足不同场景下的访问需求(集群内访问、外部访问、访问外部服务等)。核心类型包括ClusterIP、NodePort、LoadBalancer、ExternalName,以及特殊的无头服务(Headless Service)。每种类型都有其独特的配置方式和适用场景,具体如下:

1.1 ClusterIP(默认类型)

核心特点:Service被分配一个集群内部唯一的虚拟IP(ClusterIP),仅能在集群内部访问(Pod、集群节点均可访问),无法被外部客户端直接访问。

适用场景:集群内部服务之间的通信,例如前端Web服务调用后端API服务、后端服务访问中间件(如Redis、MySQL)等。

配置示例(yaml)

apiVersion: v1
kind: Service
metadata:
  name: nginx-service  # Service名称
spec:
  selector:
    app: nginx  # 关联标签为app:nginx的Pod
  ports:
  - port: 80        # Service暴露的集群内访问端口
    targetPort: 80  # Pod容器内应用的监听端口
  type: ClusterIP   # 类型为ClusterIP(可省略,默认即为ClusterIP)

1.2 NodePort

核心特点:在ClusterIP的基础上,在集群所有节点上暴露一个固定的端口(NodePort)。外部客户端可通过“任意节点IP:NodePort”访问Service,请求会自动转发到对应的Pod。NodePort的默认取值范围是30000-32767,也可通过K8s集群配置手动修改。

适用场景:需要从集群外部访问服务,但没有云厂商负载均衡器(如AWS ELB、阿里云SLB)的场景,适合测试环境、小型私有集群。

配置示例(yaml)

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080  # 指定NodePort(可选,不指定则随机分配)
  type: NodePort

访问方式http://<节点IP>:30080(任意集群节点的IP均可,无需指定特定节点)。

1.3 LoadBalancer

核心特点:在NodePort的基础上,集成云厂商的负载均衡器(如AWS ELB、阿里云SLB、腾讯云CLB)。K8s会自动创建云厂商的负载均衡器,并将所有集群节点的NodePort添加到负载均衡器的后端。外部客户端通过负载均衡器的公网IP访问服务,无需关注具体的节点IP。

适用场景:生产环境中需要对外暴露服务,且要求高可用、高性能的负载均衡能力,适合面向公网的应用(如官网、对外API服务)。

配置示例(yaml)

apiVersion: v1
kind: Service
metadata:
  name: nginx-lb-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer

访问方式:Service创建完成后,会自动分配一个负载均衡器的公网IP(可通过kubectl get svc <service-name>查看),访问地址为http://<LB公网IP>:80

1.4 ExternalName

核心特点:不关联任何Pod,而是将Service映射到一个外部域名(如www.baidu.com、外部数据库域名等)。当集群内部Pod访问该Service时,请求会被自动转发到指定的外部域名。

适用场景:集群内部服务需要访问外部服务(如外部数据库、第三方API),通过Service统一管理外部服务的域名,后续若外部服务域名变更,只需修改Service配置,无需修改所有依赖该服务的内部应用,降低维护成本。

配置示例(yaml)

apiVersion: v1
kind: Service
metadata:
  name: nginx-lb-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer

访问方式:集群内部Pod直接访问external-service.default.svc.cluster.local(默认命名空间下),即可转发到www.baidu.com。若Service在其他命名空间,需使用external-service.<命名空间>.svc.cluster.local访问。

1.5 无头服务(Headless Service)

核心特点:不分配ClusterIP,是一种“无固定入口”的Service。当客户端访问该Service的域名时,DNS解析会直接返回所有关联Pod的IP列表,客户端需要自行实现负载均衡逻辑(如DNS轮询、自定义分发策略)。

适用场景:需要直接访问Pod的场景,例如StatefulSet部署的有状态服务(如数据库集群、ZooKeeper集群),这类服务需要固定的网络标识,且需要Pod之间直接通信;或需要自定义负载均衡策略的场景。

配置示例(yaml)

apiVersion: v1
kind: Service
metadata:
  name: nginx-headless-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  clusterIP: None  # 不分配ClusterIP,即为无头服务

访问方式:通过Service的域名nginx-headless-service.default.svc.cluster.local解析,会返回所有关联Pod的IP列表,客户端可选择任意IP直接访问Pod。

更多推荐