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的部署及更新操作的更多相关文章

  1. Java -- JDBC 学习--通过Statement进行数据库更新操作

    通过 JDBC 向指定的数据表中插入一条记录. 1. Statement: 用于执行 SQL 语句的对象 1). 通过 Connection 的 createStatement() 方法来获取 2). ...

  2. (六)Kubernetes Pod控制器-ReplicaSet和Deployment和DaemonSet

    Pod控制器相关知识 控制器的必要性 自主式Pod对象由调度器调度到目标工作节点后即由相应节点上的kubelet负责监控其容器的存活状态,容器主进程崩溃后,kubelet能够自动重启相应的容器.但对出 ...

  3. Eclipse中java向数据库中添加数据,更新数据,删除数据

    前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...

  4. Kubernetes官方java客户端之一:准备

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. Kubernetes官方java客户端之四:内部应用

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. Kubernetes官方java客户端之七:patch操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. Kubernetes官方java客户端之八:fluent style

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 Kubernetes Java客户端 对于Kubernetes集群的操作,官方提供了命令行工具kubectl,这也是我 ...

  9. Kubernetes官方java客户端之二:序列化和反序列化问题

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. Delegate Action<T in> Func<T in,out Tresult> Predicate<T>

    action<T> 和  func<T> 都是delegate的简写形式,其中T为可以接受的参数类型 action<T> 指那些只有输入参数,没有返回值 Deleg ...

  2. vue.js解决刷新404找不到页面问题

    1.将包解压到ROOT目录后创建WEB-INF目录 mkdir WEB-INF 2.进入WEB-INF目录,创建web.xml文件 cd WEB-INF touch web.xml 3.编辑web.x ...

  3. CURL访问举例

    <?php function request($url, $params = [], $requestMethod = 'GET', $jsonDecode = true, $headers = ...

  4. [hdu3549]Flow Problem(最大流模板题)

    解题关键:使用的挑战程序设计竞赛上的模板,第一道网络流题目,效率比较低,且用不习惯的vector来建图. 看到网上其他人说此题有重边,需要注意下,此问题只在邻接矩阵建图时会出问题,邻接表不会存在的,也 ...

  5. 阿里巴巴Druid数据库连接池的使用

    准备: 创建一个基于SpringBoot的web项目 1 引入相关依赖 jpa.mysql.druid <?xml version="1.0" encoding=" ...

  6. TMF大数据分析指南 Unleashing Business Value in Big Data(一)

    大数据分析指南 TMF Frameworx最佳实践 Unleashing Business Value in Big Data 前言 此文节选自TMF Big Data Analytics Guide ...

  7. nej 搭配 vue 方案

    此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 目前项目使用的技术是 nej + regular,路由方面是使用 nej 自带的,随着时间推移,项目已经 ...

  8. 51nod1521(set.upper_bound())

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1521 题意:中文题诶- 思路: 我们先看一下set容器的三个 ...

  9. mac 终端命令kill掉某个指定端口

    用mac电脑开发时,有时候会遇到端口占用的问题,导致我们,不得不去结束这个端口. 第一步在终端命令输入: lsof  -i : 端口号(如:lsof -i:8080) 第二步: kill -9 PID ...

  10. 线段树 洛谷P3932 浮游大陆的68号岛

    P3932 浮游大陆的68号岛 题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无 ...