基于Kubernetes服务发现机制的探讨Non Service
服务注册
注册中⼼作为一般的RPC/Web服务中的底层设施提供了服务进程元数据(IP, Port, Interface, Group,Method等)存储,被Watch的功能,每个服务进程均需接⼊同⼀组持久化的K/V介质集群(⽐如: zookeeper,etcdv3等)。各进程均需将本进程的元数据存储于注册中⼼,并且能够Watch到其他服务进程的元数据变化(包括创建,更新等)。
Kubernetes
Kubernetes作为容器集群化管理⽅案管理资源的维度可主观的分为服务进程管理和服务接⼊管理。服务进程管理,主要体现⽅式为Pod设计模式加控制器模式,控制器保证具有特定标签(Kubernetes-Label)的Pod保持在恒定的数量(多删,少补)。服务接⼊管理,主要为Kubernetes-Service,该Service默认为具有特定标签(KubernetesLabel)的Pod统⼀提供⼀个VIP(Kubernetes-ClusterIP)所有需要请求该组Pod的请求都会按照round-robin的负载策略转发到真正提供服务的Pod。并且CoreDNS为该Kubernetes-Service提供集群内唯⼀的域名。
Service 与 RPC/Web服务存在的冲突点
- Kubernetes-Service标准的资源对象具有的服务描述字段 中并未提供完整的服务进程元数据字段因此,⽆法直接使⽤Kubernetes-Service进⾏服务注册与发现。
 - RPC/Web服务的服务注册是基于每个进程的,每个服务进程均需进⾏独⽴的注册。
 - Kubernetes-Service默认为服务创建VIP,提供round-robin的负载策略也与RPC/Web服务⾃有的负载策略形成了冲突。
 
抛弃Service对象,选择Pod对象进⾏注册
- Kubernetes-Service与RPC/Web服务现有架构的冲突导致RPC/Web服务在选择服务注册与发现的时候只能选择放弃该资源对象。
 - RPC/Web服务既然选择了每个RPC/Web服务进程独⽴注册,因此RPC/Web服务选择将该进程具有的独有的元数据写⼊运⾏该RPC/Web服务进程的Pod在Kubernetes中的Pod资源对象的描述信息中。
 - 每个运⾏RPC/Web服务进程的Pod将本进程的元数据写⼊Kubernetes-Pod Annotations字段。为了避免与其他使⽤Annotations字段的Operator或者其他类型的控制器(Istio)的字段冲突,使⽤Key为 app.io/annotation value为具体存储的K/V对的数组的json编码后的base64
编码。 
样例:
apiVersion: v1
kind: Pod
metadata:
 annotations:
    app.io/annotation: 5LiN55So55yL5LqG5bCx5piv5LiA5Liq5paH5pys5Y2P6K6u
由于每个RPC/Web服务的Pod均只负责注册本进程的元数据,因此Annotations字段⻓度也不会因为运⾏RPC/Web服务进程的Pod数量增加⽽增加。
服务发现
解决掉了服务注册问题,接下来需要解决的是服务发现的问题。Kubernetes Api-Server提供了Watch的功能,可以观察特定namespace甚⾄整个集群内各类资源的变化。RPC/Web服务为了避免RPC/Web服务进程watch到与RPC/Web服务进程⽆关的Pod的变化,RPC/Web服务将watch的条件限制在当前Pod所在的namespace,以及 watch 具有 app.io/label Value为app.io-value 的Pod。在Watch到对应Pod的变化后实时更新本地Cache,并通过Registry提供的Subscribe通知建⽴在注册中⼼之上的服务集群管理,或者其他功能。
⼯作流程
启动RPC/Web服务的Deployment或其他类型控制器使⽤Kubernetes Downward-Api将本Pod所在namespace通过环境变量的形式注⼊RPC/Web服务进程。
RPC/Web服务进程的Pod启动后通过环境变量获得当前的namespace以及该Pod名称, 调⽤
Kubernetes-Apiserver PATCH 功能为本Pod添加Key为app.io/label Value为app.io-value的label。RPC/Web服务进程调⽤Kubernetes-Apiserver 将本进程的元数据通过PATCH接⼝写⼊当前Pod的Annotations字段。
RPC/Web服务进程 LIST 当前namespace下其他具有同样标签的Pod,并解码对应的Annotations字段获取其他Pod的信息。
RPC/Web服务进程 WATCH 当前namespace下其他具有同样标签的Pod的Annotations的字段变化。
总结
Kubernetes已经为其承载的服务提供了⼀套服务发现,服务注册,以及服务集群管理机制,⽽传统基于注册中心的服务,同时也拥有⾃成体系的服务集群管理。这两个功能点形成了冲突,在⽆法调谐两者的情况,如果选择保持⾃有的服务集群管理系,放弃Kubernetes-Service功能,将元数据直接写⼊到Kubernetes Pod内,依赖Kubernetes提供的Watch功能提供维护服务集群状态,也是不错的选择。
基于Kubernetes服务发现机制的探讨Non Service的更多相关文章
- Prometheus在Kubernetes下的服务发现机制
		
Prometheus作为容器监控领域的事实标准,随着以Kubernetes为核心的云原生热潮的兴起,已经得到了广泛的应用部署.灵活的服务发现机制是Prometheus和Kubernetes两者得以连接 ...
 - 基于consul构建golang系统分布式服务发现机制
		
原文地址-石匠的Blog: http://www.bugclosed.com/post/5 在分布式架构中,服务治理是一个重要的问题.在没有服务治理的分布式集群中,各个服务之间通过手工或者配置的方式进 ...
 - Kubernetes 服务发现
		
目录 什么是服务发现? 环境变量 DNS 服务 Linux 中 DNS 查询原理 Kubernetes 中 DNS 查询原理 调试 DNS 服务 存根域及上游 DNS 什么是服务发现? 服务发现就是一 ...
 - Kubernetes服务发现入门:如何高效管理服务?
		
愈发复杂的应用程序正在依靠微服务来保持可扩展性和提升效率.Kubernetes为微服务提供了完美的环境,并能够让其与Kubernetes的工具组件和功能兼容.当应用程序的每个部分放置在一个容器中,整个 ...
 - prometheus服务发现机制
		
一. Prometheus与服务发现 1.1 目前支持的服务发现方式 二. 案例 2.1 基于文件的服务发现 2.2 基于Consul的服务发现 三.本地测试 3.1 基于文件的服务发现 1.测试环境 ...
 - Java编程技术之浅析SPI服务发现机制
		
SPI服务发现机制 SPI是Java JDK内部提供的一种服务发现机制. SPI->Service Provider Interface,服务提供接口,是Java JDK内置的一种服务发现机制 ...
 - Docker Kubernetes  服务发现原理详解
		
Docker Kubernetes 服务发现原理详解 服务发现支持Service环境变量和DNS两种模式: 一.环境变量 (默认) 当一个Pod运行到Node,kubelet会为每个容器添加一组环境 ...
 - 一文看懂 Kubernetes 服务发现: Service
		
Service 简介 K8s 中提供微服务的实体是 Pod,Pod 在创建时 docker engine 会为 pod 分配 ip,"外部"流量通过访问该 ip 获取微服务.但 ...
 - 深入理解SPI机制-服务发现机制
		
https://www.jianshu.com/p/3a3edbcd8f24 SPI ,全称为 Service Provider Interface,是一种服务发现机制.它通过在ClassPath路径 ...
 
随机推荐
- SDL-开篇明义
			
SDL只是方法论,忌为SDL而SDL 1.sdl是什么 sdl是安全研发生命周期 ,一个方法论, 理念是安全左移, 通过各种方法.工具.流程设计和交付更安全的软件,以期望降低安全成本,最终还是为了保护 ...
 - 基于netty实现rpc框架-spring boot客户端
			
上篇讲了RPC服务端的实现.原理就是解析netty通道数据拿到类.方法及入参等信息,然后通过java反射机制调用本地接口返回结果.没有用到很复杂的技术. 这篇我们将客户端的实现.说白了客户端的任务很简 ...
 - 详解 DatagramSocket类
			
(请观看本人博文 -- <详解 网络编程>) DatagramSocket 概述: 这类代表一个发送和接收数据包的插座. 该类是遵循 UDP协议 实现的一个Socket类. 数据报套接字发 ...
 - 如何利用python实现报表自动化?让你更高效的完成工作内容
			
如果能够实现报表自动化,那我们将节约不少的时间,更高效的完成工作内容.那么,如何利用python实现报表自动化呢?本文将介绍xlwt .xlrd.xlutils的常用功能,xlwt写Excel时公式的 ...
 - Sublime text 3快捷键壁纸版
 - 随笔之——浮动(float)的影响及其清除、、clear与overflow-hidden清除float的不同!!!
			
一.浮动(float)对内联元素的影响. 1.我们都知道,内联元素(例如:span/img/input...)在正常情况下不可以对其设置宽高的,它的大小之只和它内部内容的多少有关. 我们怎样才可以对其 ...
 - python小白入门之导入指定的模块
			
在python中导入模块是通过关键字import进行导入的,下面演示一下,模块的导入,指定模块别名,指定函数别名,调用模块中所有的函数运行结果: 1.模块的导入Study.py文件里面的内容是:形式 ...
 - Android | 教你如何快速集成机器学习能力
			
背景 继上篇博文说了如何快速集成扫码以后 我又上官网去了解了一下其他的功能,其中机器学习服务是当下比较火的,而且还是免费的.就赶紧点进去学习一下.看看能够快速实现哪些功能. 链接在这里:https ...
 - php获取远程文件内容的函数
			
一个简单的php获取远程文件内容的函数代码,兼容性强.直接调用就可以轻松获取远程文件的内容,使用这个函数也可获取图片.代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
 - DEDE中自定义表单HTML 怎么写
			
用DEDE嵌套网站时,有时我们需要添加自定义字段,而自定义字段的HTML样式如何设置呢? 功能地图(核心/频道模型/内容模型管理/)——普通文章的修改——字段管理——你的自定义字段的修改——最下面自定 ...