什么是Service

Service是Kubernetes的核心概念之一,它是一种抽象,定义了一种资源的逻辑集合和访问它们的策略。Service通过选择器(label selector)将一组Pod资源进行分组,并为它们分配一个统一的访问入口(单一接入点)。

Service的主要作用有:

  • 负载均衡: Service通过各种负载均衡策略将流量分发给后端的多个Pod
  • 服务发现: Service使应用可以解耦,Pod可以被动态创建或销毁,而不需要客户端直接连接Pod
  • 外部访问: Service可以通过映射NodePort或LoadBalancer等方式暴露应用服务给集群外部访问

Service类型

Kubernetes支持4种主要的Service类型:

ClusterIP

ClusterIP是默认类型,它在集群内部虚拟一个服务IP地址,集群内部通过该IP地址访问服务。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
  type: ClusterIP
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

NodePort

NodePort在每个节点上开放一个端口,任何发送到该端口的流量都会被转发到对应Service。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

LoadBalancer

LoadBalancer在云环境下会启动一个外部负载均衡器,并将流量转发到NodePort服务。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - port: 80 
      targetPort: 80
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

ExternalName

ExternalName将Service映射到externalName字段指定的DNS名称。

kind: Service
apiVersion: v1
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

Service发现

Kubernetes支持多种Service发现模式:

环境变量

当Pod运行在Node上时,kubelet会为每个活跃的Service添加一组环境变量,这些变量的值对应Service的IP地址。

DNS

Kubernetes集群启动时会运行一个DNS pod,并向集群每个节点提供名称解析服务。Pod可以通过DNS查询Service的IP地址。

Service代理模式

Kubernetes支持以下几种Service代理模式:

  • userspace: 最早的模式,在用户空间监听一个端口,通过内核网络数据转发。实现方式是在kube-proxy组件启动时,创建一个监听Service入口IP和端口的随机端口,发送到该端口的数据通过iptables DNAT规则重新发送到backend Pod。这种模式效率较低。
  • iptables: 当前的默认模式,直接使用iptables规则进行流量转发,效率较高。实现方式是kube-proxy监视Service和Endpoint的变化,并根据变化创建iptables规则。这些规则定义了数据流从Service IP到Pod IP的路径。
  • IPVS: 较新的模式,基于内核的netfilter的一个IP虚拟服务器,比iptables更高效。实现方式类似iptables,区别是使用IPVS内核模块管理流量负载均衡,而不是iptables规则。
  • 混合模式: 即同时使用iptables和IPVS。实现方式是先使用iptables规则捕获数据流,然后使用IPVS负载均衡到后端Pod。

总结

Service是Kubernetes提供的一种负载均衡和服务发现机制,通过定义一个逻辑服务,并将一组Pod资源映射到该服务上。这样就可以实现Pod的动态伸缩,提高应用的可靠性和可扩展性。