使用Kubernetes的java-client实现Deployment的部署及更新操作
1. 背景介绍
需求: 针对多种协议SDK构造探针,测试公司接入机服务状况(每一个探针应对单一接入机,接入机数量可能会动态变化).
难点: 大多数协议SDK均不支持多实例运行,且部分SDK通过生成文件保存内部状态;各协议SDK处于迭代状态,不能对其进行魔改.
分析:
(1) 基于以上原因,无法选择多线程或者多进程,在单一物理机或容器内完成探针相应功能;
(2) 尝试通过Kubernetes部署探针容器,通过容器完成不同协议SDK的进程隔离乃至文件隔离;
(3) 通过Deployment设置容器环境参数的方式,给不同容器设置对应的启动参数;
(4) Kubernetes控制程序通过Apollo动态获取配置,更新相应协议的Deployment,从而更新相关容器镜像.
2. 依赖设置
pom文件中添加kubernetes以及apollo依赖:
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>4.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
3. 部署Deployment
3.1 获取api client
注意,此处我们使用ExtensionsV1beta1Api ,对应api version: extensions/v1beta1.
在实际操作中,可以通过kubectl version获取api server支持的版本.
ApiClient client;
try {
client = Config.defaultClient();
} catch (IOException ex) {
log.error("get k8s default client failed, error: [{}]", ex.getMessage());
throw new UserException(AppStatus.INTERNAL_SERVER_ERROR, "can not get k8s default client.");
}
Configuration.setDefaultApiClient(client);
ExtensionsV1beta1Api api = new ExtensionsV1beta1Api(client);
3.2 创建Deployment
Deployment创建需要设置如下内容:
api version;kind;meta data;spec info.
不熟悉以上元素的,可以查阅官方文档,或者通过Kubernetes inAction一书了解.
ExtensionsV1beta1Deployment edpDeployment = new ExtensionsV1beta1Deployment();
edpDeployment.setApiVersion("extensions/v1beta1");
edpDeployment.setKind("Deployment");
edpDeployment.setMetadata(createDeploymentMeta(namespace, ProtocolType.EDP, config));
edpDeployment.setSpec(createDeploymentSpec(ProtocolType.EDP, config));
try {
appsV1Api.createNamespacedDeployment(Common.INSPECTOR_NAMESPACE, edpDeployment, false, null, null);
} catch (ApiException e) {
log.error(e.getMessage());
}
至此,可以通过kubectl相关命令查看Deployment的创建情况.
4. 更新Deployment
Deployment的更新操作比较晦涩,需要先构建ArrayList<JsonObject>存放更新操作以及相应数值(此处使用Gson),进而调用相应接口完成操作.
/**
* 构造Deployment的更新信息(json格式,需要指定操作类型,更新元素路径,以及更新后的数值)
* 此处,仅示范如何更新pod中第一个容器(filebeta)的镜像ID
* @return json信息
*/
public ArrayList<JsonObject> getInspectorImagePatchElements() {
// k8s java-client官方示例使用Gson
Gson gson = new Gson();
ArrayList<JsonObject> result = new ArrayList<>();
// 更新Deployment中的filebeta容器镜像ID
DeploymentPatchJson patchJson = new DeploymentPatchJson("replace",
"/spec/template/spec/containers/0/image", appConfig.geFilebetaImageId());
result.add((gson.fromJson(gson.toJson(patchJson), JsonElement.class)).getAsJsonObject());
return result;
}
/**
* 更新指定的Deployment
*
*/
public void patchCurrentDeployment(ExtensionsV1beta1Api api, ExtensionsV1beta1Deployment deployment) {
ArrayList<JsonObject> patchElements = inspectorService.getInspectorImagePatchElements();
try {
api.patchNamespacedDeployment(deployment.getMetadata().getName(),
deployment.getMetadata().getNamespace(), patchElements, "true", null);
} catch (ApiException e) {
log.error("patch deployment failed, error: [{}]", e.getMessage());
}
}
5. 手动更新Deployment
(1) kubectl仿照调用api
kubectl patch deployment your_deployment -p \
'{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}'
(2) 通过HTTP请求
curl --header "Content-Type: application/json-patch+json" \
--request PATCH \
--data '[{"op": "add", "path": "/status/capacity/example.com~1foo", "value": "5"}]' \
http://k8s-master:8080/api/v1/nodes/k8s-node-1/status
(3) kubectl设置
带*信息,请根据实际情况进行替换.
kubectl set image deployment/composer app=hub.***.com/online/composer:pro2019051602 --context=devops* -n qos*
(4) 直接编辑Deployment
kubectl edit deployment composer -n qos* --context=devops*
PS:
如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!
使用Kubernetes的java-client实现Deployment的部署及更新操作的更多相关文章
- Java -- JDBC 学习--通过Statement进行数据库更新操作
通过 JDBC 向指定的数据表中插入一条记录. 1. Statement: 用于执行 SQL 语句的对象 1). 通过 Connection 的 createStatement() 方法来获取 2). ...
- (六)Kubernetes Pod控制器-ReplicaSet和Deployment和DaemonSet
Pod控制器相关知识 控制器的必要性 自主式Pod对象由调度器调度到目标工作节点后即由相应节点上的kubelet负责监控其容器的存活状态,容器主进程崩溃后,kubelet能够自动重启相应的容器.但对出 ...
- Eclipse中java向数据库中添加数据,更新数据,删除数据
前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...
- Kubernetes官方java客户端之一:准备
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes官方java客户端之四:内部应用
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes官方java客户端之七:patch操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes官方java客户端之八:fluent style
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 Kubernetes Java客户端 对于Kubernetes集群的操作,官方提供了命令行工具kubectl,这也是我 ...
- Kubernetes官方java客户端之二:序列化和反序列化问题
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- Delegate Action<T in> Func<T in,out Tresult> Predicate<T>
action<T> 和 func<T> 都是delegate的简写形式,其中T为可以接受的参数类型 action<T> 指那些只有输入参数,没有返回值 Deleg ...
- vue.js解决刷新404找不到页面问题
1.将包解压到ROOT目录后创建WEB-INF目录 mkdir WEB-INF 2.进入WEB-INF目录,创建web.xml文件 cd WEB-INF touch web.xml 3.编辑web.x ...
- CURL访问举例
<?php function request($url, $params = [], $requestMethod = 'GET', $jsonDecode = true, $headers = ...
- [hdu3549]Flow Problem(最大流模板题)
解题关键:使用的挑战程序设计竞赛上的模板,第一道网络流题目,效率比较低,且用不习惯的vector来建图. 看到网上其他人说此题有重边,需要注意下,此问题只在邻接矩阵建图时会出问题,邻接表不会存在的,也 ...
- 阿里巴巴Druid数据库连接池的使用
准备: 创建一个基于SpringBoot的web项目 1 引入相关依赖 jpa.mysql.druid <?xml version="1.0" encoding=" ...
- TMF大数据分析指南 Unleashing Business Value in Big Data(一)
大数据分析指南 TMF Frameworx最佳实践 Unleashing Business Value in Big Data 前言 此文节选自TMF Big Data Analytics Guide ...
- nej 搭配 vue 方案
此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 目前项目使用的技术是 nej + regular,路由方面是使用 nej 自带的,随着时间推移,项目已经 ...
- 51nod1521(set.upper_bound())
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1521 题意:中文题诶- 思路: 我们先看一下set容器的三个 ...
- mac 终端命令kill掉某个指定端口
用mac电脑开发时,有时候会遇到端口占用的问题,导致我们,不得不去结束这个端口. 第一步在终端命令输入: lsof -i : 端口号(如:lsof -i:8080) 第二步: kill -9 PID ...
- 线段树 洛谷P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛 题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无 ...
