笔记——深入掌握Service

通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。

Service定义

apiVersion: v1
kind: Service
metadate:
    name: 
    namespace:
    labels:
      	names:
    annotations:
        name:
spec:
    selector: []
    type:
    clusterIP: 
    sesseionAffinity:
    ports:
    - name:
      protocol:
      port:
      targetPort:
      nodePort:
    status:
        loadBalancer:
            ingress:
            ip:
            hostname:

spec.selector[] 选择具有指定label标签的pod作为管理范围
spec.type
service的类型,指定service的访问方式,默认值是ClusterIP。
(1)ClusterIP:虚拟的服务IP地址,该地址用于kubernetes集群内部的pod访问,在node上kube-proxy通过设置的iptables规则进行转发。
(2)NodePort:使用宿主机的端口,能够访问node的外部客户端通过node的IP地址和端口号可以访问的服务。
(3)LoadBalancer:使用外接负载均衡器完成到服务的负载分发,需要在spec.status.loadBalancer字段指定外部负载均衡器的IP地址,并同时定义nodePort和clusterIP,用于公有云环境。
spec.sessionAffinity 是否支持session,可选值为ClientIP,默认值为空。ClientIP表示将同一个客户端的访问请求都转发到同一个后端pod。
spec.ports[] 需要暴露的端口列表
spec.ports[].protocol 支持TCP和UDP,默认值TCP。
spec.ports[].port 服务监听的端口号,es service为9200,transport为9300。
spec.ports[].targetPort 需要转发到后端pod的端口号,es为9200,transport为9300。
spec.ports[].nodePort 当spec.type=NodePort时,指定映射到物理机的端口号。

status.loadBalancer.ingress.ip 外部负载均衡器的IP地址。

直接通过pod的IP地址和端口号可以访问到容器应用内的服务,但是pod的IP地址是不可靠的,例如当pod所在的node发生故障时,pod将被kubernentes重新调度到另一个node,pod的ip地址将发生变化。如果容器应用本身是分布式的部署方式,通过多个实例共同提供服务,就需要在这些实例的前端设置一个负载均衡器来实现请求的分发。kubernetes的service就是用于解决这些问题的。

kubernetes提供了两种负载分发策略:RoundRobin和SessionAffinity。默认情况下,kubernetes采用RoundRobin模式对客户端进行发在分发,可以设置service.spec.sessionAffinity=ClientIP来启用SessionAffinity策略。

通过service的定义,kubernetes实现了一种分布式应用统一入口的定义和负载均衡机制。

多端口service。

  • 一个容器应用提供多个端口服务,每个端口号都进行了命名。
  • 两个端口号使用不同的4层协议——TCP和UDP。

外部服务service
        在某些环境中,需要将外部数据库作为后端服务进行连接,或者将另一个集群或namespace中的服务作为服务的后端,这时可以创建一个无label selector的service实现。
        创建不带标签选择器的service,即无法选择后端的pod,系统不会自动创建Endpoint,因此需要手动创建一个和该service同名的Endpoint,用于指向实际的后端访问地址

Headless Service

从集群外部访问pod或service

Ingress: HTTP 7层路由机制