【Kubernetes系列】通信通道 Service

229 阅读4分钟

Service出现的背景

  1. pod是短暂的,随时会启动或关闭。
  2. Kubernetes在pod启动前会给已经调度到节点上的pod分配IP地址,客户端不能提前知道提供服务的pod的IP地址。
  3. 每个pod都有自己的IP地址,无法处理多个pod提供相同服务的情况。

Kubernetes服务是一种为一组功能相同的pod提供单一不变的接入点的资源。当服务存在时,它的IP地址和端口不会改变。

标签选择器决定哪些pod属于服务,服务的连接对后端pod是负载均衡的。

1. 基本使用

1)通过YAML文件创建服务

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 【服务的可用端口】
    targetPort: 【容器端口】
selector:
  app: 【标签值】

kubectl create -f my-service.yaml

创建了一个名叫my-service的服务,它将在端口80接收请求并将连接路由到具有标签选择器是app=MyApp的pod的8080端口上。

2)查看服务列表

kubectl get svc

3)配置服务的会话亲和性

sessiongAffinity,用于控制service负载均衡的方式,取值范围如下:

  • None,随机调度,默认值
  • ClientIP,特定客户端产生的所有请求每次都指向同一个pod

通过修改创建Service的 yaml 文件,配置服务的会话亲和性

apiVersion: v1
kind: Service
service:
	spec.sessionAffinity: ClientIP
	……

4)多端口Service

同一个服务暴露多个端口,在使用多个端口时,必须提供所有端口名称,使它们无歧义,例如:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
    - name: https
      protocol: TCP
      port: 443
      targetPort: 9377

注:端口名称只能包含小写字母、数字和-,且必须以字母、数字开头和结尾。

2. Service的三种代理模式

在Kubernetes集群中,每个Node运行一个kube-proxy进程。kube-proxy负责为Service实现一种VIP的形式。

1)userspace 代理模式

实现方式: kube-proxy会监视Kubernetes控制平面对Service对象和Endpoints对象的添加和移除操作。对每个service,它会在本地Node上打开一个随机端口。任何连接到“代理端口”的请求,都会被代理到Service的后端Pods中的某个上边。

kube-proxy基于SessionAffinity确定访问哪个后端Pod。默认情况下,kube-proxy通过轮转算法选择后端。当选择的第一个Pod没有响应时,kube-proxy将检测到与Pod的连接已失败,会自动使用其它Pod重试。

2)iptables 代理模式

实现方式: kube-proxy会监视Kubernetes控制节点对Service对象和Endpoints对象的添加和移除。对每个Service配置iptables规则,从而捕获到达该Service的clusterIP和端口的请求,今儿将请求重定向到Service的一组后端的某个Pod。

默认情况下,kube-proxy随机选择一个后端,当选择的第一个Pod没有响应时,连接失败。为了避免将流量发送到已失败的Pod上,可以使用Pod就绪探测器验证Pod是否可以正常工作,以便让kube-proxy仅看到测试正常的Pod。

3)IPVS代理模式

实现方式: kube-proxy监视Kubernetes服务和端点,调用netlink接口相应地创建IPVS规则,并定期将IPVS规则与Kubernetes服务和端点同步。

与iptables模式下的kube-proxy相比,IPVS模式下的kube-proxy重定向同学的延迟要短,同步代理规则时性能更好。与其它代理模式相比,IPVS模式支持更高的网络流量吞吐量。

注:为了确保每次都将来自特定客户端的连接传递到同一Pod,可以通过将service.spec.sessionAffinity设置为“ClientIP”(默认“None”)

3. Service的四种类型

Kubernetes ServiceTypes 用于指定Service类型。不同类型的Service,暴露给Kubernetes集群外部方式也不一样。

1)ClusterIP

通过集群的内部IP暴露服务,选择该值时服务只能够在集群内部访问,默认值。

2)NodePort

通过每个节点上的IP和静态端口(NodePort)暴露服务。

3)LoadBalancer

使用云提供商的负载均衡器向外暴露服务。外部负载均衡器可以将流量路由到自动创建的NodePort服务和ClusterIP服务上。

4)ExternalName

通过返回CNAME和对应值,可以将服务映射到externalName字段的内容,无需创建任何代理。

参考:kubernetes.io/zh/docs/con…