1、Service概念

  • Service是一组pod服务的抽象,相当于一组pod的Load Balance,负责将请求分发给对应的pod。

  • 一组Pod可以被Service访问到,通过 Label Selector

缺点

  • Service只提供四层负载均衡能力,没有7层功能,

2、Service类型

– clusterIp

自动分配一个仅Cluster内部可以访问的虚拟IP。

– NodePort

在ClusterIP基础上为svc在每台机器绑定一个端口,这样就可以通过`NodeIP:NodePort`来访问该服务。

– LoadBalancer

在NodePort基础上,借助cloud provider(云供应商) ,创建外部负载均衡器,并将请求转发到 `NodeIP:NodePort`。

– ExternalName

把集群外部服务引入到集群内部来,在集群内部直接使用。(集群内部新建svc,里面设置了其他集群的端口及IP)没有任何类型代理被创建,只有k8s 1.7或者更高版本才支持。

3、VIP和Service代理

k8s集群中,每个node都有一个kube-proxy进程。kube-proxy负责为svc实现了一种vip(虚拟ip),而不是 externalName的形式。

在k8s v1.0版本,代理完全在userspace
在k8s v1.1版本,新增了iptables代理,但不是默认的运行模式。
从k8s v1.2开始,默认就是iptables代理
在k8s v1.8.0-beta.0中,添加了ipvs代理
在k8s v1.14默认使用ipvs代理。

3.1、代理模式的分类

1、userspace代理模式

2、iptables代理模式

3、ipvs代理模式

4、ClusterIP

clusterIP在每个Node节点使用iptables|ipvs,将发向clusterIP对应端口的数据,转发到kube-proxy。然后kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个svc下对应的pod地址和端口,进而把数据转发给对应的pod的地址和端口。

工作流程

  • apiserver用户通过kubectl命令向apiserver发送创建svc的命令,apiserver接收到请求将数据存储到etcd中。
  • kube-proxy k8s 的每个节点中都有一个叫kube-proxy的进程,这个进程负责感知svc,pod的变化,并将变化的信息写入本地的iptables规则中。
  • iptables使用NAT技术将vip的流量转发到endpoint中
apiVersion: v1
kind: Service
metadata:
  name: test-clusterip
  namespace: test
spec:
  ports:
  - port: 80  # svc提供服务的port
    protocol: TCP
    targetport: 8002 # pod提供服务的port
  # clusterIP: 10.97.97.97  # 可固定IP,或默认生成
  selector:
    app: myblog
  type: ClusterIP

查询流程
iptables -t nat -nvL

ipvsadm -Ln
PREROUTING > KUBE-SERVIVE > SVC > SEP

Headless Service 无头服务

不需要负载均衡,以及不需要单独的Svc IP。可设置Cluster IP的值为None,来创建headless svc。这类svc不会分配cluster ip,kube-proxy不会处理他们,平台也不会对他进行负载均衡和路由。

apiVersion: v1
kind: Service
metadata:
  name: myapp-headless
  namespace: test
spec:
  selector:
    app: myapp
  clusterIP: 'None'
  ports:
  - port: 80
    targetPort: 80

访问

dig -t A myapp-headless.test.svc.cluster.local.@10.96.0.10

10.96.0.10 为coredns地址
svc.cluster.local 集群域名
test namespace名称
myapp-headless svc名称
dig # 需要yum install bind-utils

5、NodePort

原理是在node上开了一个端口,将该端口的流量导入kube-proxy,然后由kube-proxy进一步给到pod。

apiVersion: v1
kind: Service
metadata:
  name: myapp-nodeport
  namespace: test
spec:
  type: NodePort # svc类型
  selector:
    app: myapp
    release: stable
  ports:
   - name: http
     port: 80
     targetPort: 80

iptables -t nat -nvL

6、LoadBalancer

和nodeport是一种方式,区别就是LoadBalancer比nodeport多一步,就是可以调用云厂商(cloud provider)去创建LB来向节点导流。 LAAS

7、ExternalName

这种类型svc通过返回CNAME和他的值,可以将服务映射到externalName字段的内容。ExternalName是svc的特例,他没有selector,也没有特定的端口和endpoint。相反,对于运行在集群外部的服务,他通过 返回该外部服务别名 来提供服务。

apiVersion: v1
kind: Service
metadata:
  name: myapp-exter
  namespace: test
spec:
  type: ExternalName
  externalName: xx.com

当访问 myapp-exter.test.svc.cluster.local,集群的DNS服务器返回xx.com。
重定向发生在DNS层,不会进行代理和转发。

原文地址:http://www.cnblogs.com/20190707wdd/p/16877940.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性