k8s 服务

Service、Pod、Label、Endpoint、Kube-proxy、Cluster IP、LoadBalance、NodePort、环境变量、DNS、Expose

Service

微服务架构的应用需要有好的服务编排支持。k8s中的Service提供了一套简化的服务代理和发现机制,天然适应微服务架构。
Service定义了服务的入口地址。前端应用(pod)通过入口地址访问其背后由pod副本组成的集群实例。service与其后端pod副本集群间通过label selector实现“无缝对接”。
负载均衡器,为这组pod开启对外服务端口,并且把这些pod的endpoint列表加入端口的转发列表中,客户端就可以通过负载均衡器的对外IP地址+服务端口来访问此服务,而客户端的请求由负载均衡器的算法来决定被转发到哪个pod。
kube-proxy是软件负载均衡器,负责把对service的请求转发到后端的pod实例,并在内部实现服务的负载均衡与会话保持机制。
每个service有全局唯一的虚拟IP地址,即cluster ip。这样,每个服务就变成了具备唯一IP地址的“通信节点”,服务调用就变成了TCP网络通信问题。

pod的endpoint地址会随着pod的销毁和重新创建而发生改变,因为pod的ip会变化。

pod的ip是在容器中配置。service的cluster ip是在iptables中配置,并映射到pod ip。iptables将访问service的流量使用类似轮询的负载均衡策略转发到后端pod。

除了通过cluster ip访问service,还可以通过DNS。

原理

在k8s中,受到RC调控的时候,Pod副本是变化的,对应的虚拟IP也是变化的,比如发生迁移、伸缩或者更新的时候。k8s的Service是抽象概念,它定义了一组Pod逻辑集合以及访问它们的策略。Service的目标是提供一种桥梁,为访问者提供一个固定访问地址,用于在访问时重定向到相应的后端,这使得非k8s原生应用程序,在无须为Kubemces编写特定代码的前提下,轻松访问后端。
 需要注意的是,k8s分配给Service的固定IP是虚拟IP,并不是真实的IP,在外部是无法寻址。真实的系统实现上,k8s是通过kube-proxy组件来实现虚拟IP路由及转发。ku-proxy组件是基于iptables实现路由转发。
通过分析、识别并建模系统中的所有服务为微服务-----Kubernetes Service,最终系统由多个提供不同业务能力而又彼此独立的微服务单元所组成,服务之间通过TCP/IP进行通信。

service的访问ip和endpoint/pod ip都会在k8s的dns服务器里存储域名和ip的映射关系。

Service代理外部服务

Service不仅可以代理Pod,还可以代理任意其他后端,比如运行在k8s外部的Mysql、Oracle等。
无头(headless)service没有selector,这样就不会创建相关的endpoints对象。再手动将service映射到指定的endpoints,即通过定义两个同名的service和endPoints来实现的。service抽象类访问pod,也能抽象其他类型的backend。

Service内部负载均衡

当Service的Endpoints包含多个IP的时候,即服务代理存在多个后端,将进行请求的负载均衡。默认的负载均衡策略是轮询或者随机(由kube-proxy的模式决定)。同时,Service上通过设置Service-->spec-->sessionAffinity=ClientIP,来实现基于源IP地址的会话保持。

发布Service(service的种类)

Service的虚拟IP是由k8s虚拟出来的内部网络,外部是无法寻址到的。但有些服务需要被外部访问到。这时就需要增加一层网络转发,即外网到内网的转发。k8s提供了NodePort、LoadBalancer、Ingress三种方式。

  • clusterIP(cluster内部访问service)
    Cluster中的pod可以通过serviceName.namespace_name访问service。在同一个namespace的可以省略namespace_name。
  • nodePort(cluster外部访问service)
    service通过cluster节点的静态端口对外提供服务。cluster外部通过任意nodeIP+nodePort访问service。默认端口范围是30000-32767。
  • loadbalancer
    公有云平台(例如GCE)的load balance对外提供服务。一些高级的L7转发功能,例如基于HTTP header、cookie、URL的转发就做不了。
service的自发现机制

k8s中有一个很重要的服务自发现特性。一旦service被创建,该service的IP和port等信息都可以被注入到pod中供它们使用。k8s支持两种service发现机制:环境变量和DNS。

  • 环境变量方式
      k8s创建Pod时会自动添加所有可用的service环境变量到该Pod中,如有需要,这些环境变量就被注入Pod内的容器里。环境变量的注入只发生在Pod创建时,且不会被自动更新。这个特点暗含了service和访问该service的Pod的创建时间的先后顺序。
  • DNS方式
    k8s集群支持DNS服务。这个DNS服务器使用k8s的watchAPI,不间断的监测新的service的创建并为每个service创建一个DNS记录。如果DNS在整个集群范围内都可用,那么所有的Pod都能够自动解析service的域名。
    服务发现用service的name与cluster ip地址做dns域名映射即可解决。
    k8s通过add-on增值包的方式引入dns系统,把服务名作为dns域名,程序使用服务名来建立通信连接。
多个service如何避免地址和端口冲突

k8s为service分配唯一的ClusterIP,所以当使用ClusterIP:port的组合访问service的时候,这个组合一定不会发生重复。另一方面,kube-proxy为每个service真正打开的是不会重复的随机端口,用户在service描述文件中指定的访问端口会被映射到这个随机端口上。

service的不足

k8s使用iptables和kube-proxy解析service的人口地址,在中小规模的集群中运行良好,但是当service的数量超过一定规模时,仍然有些问题。首当其冲的便是service环境变量泛滥,以及service与使用service的pod两者创建时间先后的制约关系。目前来看,很多使用者在使用k8s时往往会开发一套自己的Router组件来替代service,以便更好地掌控和定制这部分功能。

如果觉得通过yaml方式创建service比较麻烦,kubectl提供expose子命令直接将deployment暴露为服务。

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容