1一年前工作中分析,当时还没有几个人用,也找不到资料,不知道现在什么情况了。共享下。
【一】概述
1介绍
目前k8s 支持 Go,Python,Java,dotnet 4种语言的客户端,目前java 客户端有两种,1种是 基于RESRFul Web Service 的Jersey 另外就是基于Fabric8 的,后面一种成熟度比较高。
Kubernetes Client是java版本的调用kubernetes集群资源对象API的客户端,即通过它实现对kubernetes集群中资源对象(包括deployment、service、ingress、replicaSet、pod、namespace、node等)的增删改查等操作。
fabric8存在的目标,1简单易用,提高开发效率,2 性能好,稳定性高,有一定的机制来保证业务的可靠性。
2功能说明
Ⅰ支持操作各种资源(pod,Endpoints,Event,Namespace,Node,PersistentVolume,PersistentVolumeClaim,ReplicationController,ResourceQuota,Secret,Service,ServiceAccount,ConfigMap,LimitRange,hpa,NetworkPolicy,StorageAPIGroupDSL,Job,KubernetesRole )资源
Ⅱ 支持watch 回调机制。
3 高性能
主要通过业务层和通信层 进行保障
业务层 业务处理对象全局唯一,减少资源的重复创建,对不同的资源操作,同一个客户端底层连接可以复用
依赖okhttp,进行http的管理,本身是一个高性能http库,支持相同请求 进行sock 复用,通过底层连接池对连接进行管理。
4版本支持
【二】 使用说明和流程分析
1 资源操作流程
示例
Ⅰ
ConfigBuilder builder = new ConfigBuilder();
builder.withMasterUrl("xxx");
Config config = builder.build(); 构建config
Ⅱ
KubernetesClient client = new DefaultKubernetesClient(config) 构建client
Ⅲ
NonNamespaceOperation> pods = client.pods().inNamespace(namespace); 获取资源处理类
Pod pod1 = new PodBuilder().withNewMetadata().withName("pod1").withNamespace("test").and().build();
Ⅳ
pods.create(pod);
功能架构图
重要类解读
初始化流程
各操作资源的客户端:
Ⅰ AppsAPIGroupClient :
Deployment DaemonSet ReplicaSet StatefulSet
Ⅱ BatchAPIGroupClient
Job CronJob
Ⅲ ExtensionsAPIGroupClient
Ingress PodSecurityPolicy
Ⅳ NetworkAPIGroupClient
NetworkPolicy
Ⅴ RbacAPIGroupExtensionAdapter
KubernetesRole ,KubernetesRoleBinding
Ⅵ StorageAPIGroupClient
StorageClass
实现原理:
BaseOperation定义了crud操作
实现过程:底层封装了基本的操作,其实就是对象转成json数据,发送http请求和解析并封装返回的数据。
HasMetadataOperation 定义了edit,replace 功能和原理同上
xxxxOperationsImpl 比如 ComponentStatusOperationsImpl ,PodOperationsImpl 定义各种资源的实现过程 其实就是通过泛型 将各种资源 传递给 底层,达到封装一套底层的目的。
client 通过继承 xxxxOperationsImpl 实现各种客户端。3 实现client 相互转换,共用底层的通讯连接。
3 实现client转换
KubernetesClient client = new DefaultKubernetesClient();
AppsAPIGroupClient oclient =client.adapt(AppsAPIGroupClient.class);
具体 实现过程
Ⅰ 通过 Adapters ServiceLoader.loadServiceLoader这个类来从配置文件中加载子类或者接口的实现类,保证全局只有一个client,具体参考meta-inf.services 配置文件
Ⅱ 当调用
ExtensionAdapter adapter = Adapters.get(type);
if (adapter !=null) {
return adapter.adapt(this);
}
Ⅲ 每个client 都实现 newInstance 方法,实现client 转变,底层连接共用,配置共用。
4 watch 机制
Ⅰ Watcher watcher = new Watcher() {@Override
public void eventReceived(Action action, Pod resource) {
logger.info("resource.getMetadata().getName()=" + resource.getMetadata().getName());
}
@Override
public void onClose(KubernetesClientException cause) {
logger.info("cause.getStatus()=" + cause.getStatus());
}
};
client.pods().inNamespace("my-namespace").watch(watcher);
Ⅱ 实现原理
说明:
WatchConnectionManager
http streaming客户端发起http request,服务端有请求数据就回复一个response(回复的http header中会带上”Transfer-Encoding”:”chunked”)。客户端收到这种header的response后就会继续等待后续数据,而服务端有新的数据时会继续通过这条连接发数据 ,并且有失败重试机制。
5 资源同步异步机制,除了watch机制是异步外,其他都是同步机制。具体机制请参考okhttp 分析。
【三】性能 和容错机制分析
1 业务层次:操作多种资源共享底层通讯链路
参考上个模块 实现client转换,共用一条通信连接
【三】
底层okhttp 性能和保证机制分析
介绍
OkHttp是一个高效的HTTP库:
1. 底层通过共享同一个Socket来处理同一个服务器的所有请求
2.通过连接池来减少请求延时
3.无缝的支持GZIP来减少数据流量
4.缓存响应数据来减少重复的网络请求
架构
性能措施
1ConnectInterceptor 通过连接池进行管理连接,获取连接策略,同一个url 同一个端口,用同一个底层链路
2Dispatcher.java 支持同步和异步 机制,异步任务最大 64 确保资源不被耗尽
3 通过查找 被引用的次数为0的连接, 和闲置时间 ,进行关闭连接池中空闲连接,保持资源消耗低
可靠性保证
引入重连拦截器 retryAndFollowUpInterceptor 对因为网络等原因引起的中断,可以进行重连。
okhttp 原理请参考httpclient 源码分析