利用K8S技术栈打造我的私有云(连载之:K8S资源控制)


【利用K8S技术栈打造我的私有云系列文章目录】nginx

注: 本文首发于 My 公众号 CodeSheep ,可 长按扫描 下面的 当心心 来订阅 ↓ ↓ ↓编程

CodeSheep · 程序羊


私有云K8S资源控制原理

基于前面系列文章的详细阐述,咱们已经能够手工去K8S集群的命令行下将CentOS 7.4操做系统的Docker镜像启动起来,而后用户能够经过SSH登陆到CentOS容器之中进行使用。但实际使用过程当中不一样的用户不可能每次都手动去命令行启动一个CentOS镜像,而后用命令去查看该容器的IP地址和端口是多少,而后再经过ssh去链接。咱们最好能够将Docker容器的启动、查询、删除等再封装一层,而后经过WEB页面去提供给用户操做,这才符合用户行为需求!c#

因为在咱们的实践中Docker容器是放在kubernetes集群中进行管理,因此这里的资源控制涉及的资源主要就是kubernetes的资源,如Pod、RC、Service等。api

kubernetes中的Master节点运行kube-apiserver模块,该模块对外提供restful接口,咱们能够基于该接口进行编程,从而完成对集群资源的控制管理、如Pod、RC、Service等的申请、查询、删除等任务。bash

要CRUD一个 kubernetes 资源,好比一个 pod,首先要知道和 kubernetes 集群交互的接口。在 kubernetes 的 master 节点上安装有 kubectl 客户端程序,该程序面向用户提供命令行接口,供用户和 kubernetes 集群交互。 kubectl 将用户命令经过 restful 接口传送给 apiserver,从而进行资源的增、删、改等操做。该过程能够示意以下:服务器

K8S资源控制架构图

原理讲完了,接下来说讲代码级别如何实现。restful


K8S资源控制客户端

总结上文不难看出,k8s相关资源的CRUD控制能够经过restful接口来实现。要使用Kubernetes REST API编写应用程序,当下大多语言均可以很方便地去实现HTTP请求来操做kubernetes的restful接口从而控制和查询资源,但本文主要是利用已有的kubernetes客户端来更加优雅地实现kubernetes的资源控制。你不须要本身编写API来调用、请求/响应等类型,能够直接使用现成的客户端库来实现。架构

k8s的客户端开源项目有不少,官方有支持,社区也维护了不少。框架

官方支持的Kubernetes客户端库比较有限,有下面几种:ssh

官方支持的Kubernetes客户端库

社区维护的客户端库则更加丰富,基本热门的编程语言都支持,下面的这些Kubernetes API客户端库由社区建立者维护,Kubernetes团队不会提供支持和维护:

社区维护的Kubernetes客户端库

本实践选用的是Fabric8的k8s-client,基于Java实现。

下面就基于该Clinet讲讲代码级别的实现


K8S资源控制代码实现举例

下面结合代码来阐述一下Fabric8经常使用的k8s资源控制操做:

  • 建立K8S客户端
String namespace = "default";    // namespace名
String master = "http://XXXX/";  // 配置为你的k8s集群的主节点地址
Config config = new ConfigBuilder().withMasterUrl(master).build();
KubernetesClient client = new DefaultKubernetesClient(config);
复制代码

接下来对K8S资源的控制、查询等操做基本都靠该client来完成!

  • 建立Pod

咱们从一个pod.yaml文件来建立Pod资源:

List<HasMetadata> resources = client.load(new FileInputStream(fileName)).get();  // fileName为一个外部的pod.yaml文件
  if (resources.isEmpty()) {
	System.err.println("No resources loaded from file: " +fileName);
	return;
  }
  HasMetadata resource = resources.get(0);
  if (resource instanceof Pod){
	Pod pod = (Pod) resource;
	System.out.println("Creating pod in namespace " + namespace);
	NonNamespaceOperation<Pod, PodList, DoneablePod, PodResource<Pod, DoneablePod>> pods = client.pods().inNamespace(namespace);
	Pod result = pods.create(pod);  // 此处建立pod资源!!!
	System.out.println("Created pod " + result.getMetadata().getName());
  } else {
	System.err.println("Loaded resource is not a Pod! " + resource);
  }
复制代码
  • 删除Pod

删除很简单,只要知道Pod所在的namespace和name,一行代码便可搞定

client.pods().inNamespace("namespace名字").withName("pod名").delete();
复制代码
  • 查询Pod

查询Pod的log日志并于控制台打印:

client.pods().inNamespace("namespace名字").withName("pod名").tailingLines(10).watchLog(System.out))
复制代码

欲查询Pod的一些其余信息,能够参考建立Pod步骤中的代码:

Pod result = pods.create(pod);  // 此处建立pod资源!!!
System.out.println("Created pod " + result.getMetadata().getName()); // 相似于此处,除了获取Pod的名字外还能够获取不少相似信息
复制代码
  • 修改Pod配置
Pod updatedPod = client.pods().inNamespace("namespace名字").withName("pod名").edit()
          .editMetadata()
          .addToLabels("server2", "nginx2")
          .and().done();
log("Replaced testPod:", updatedPod);
复制代码

上文从建立一个K8S客户端开始比较完整地介绍了一个Pod资源的CRUD操做,限于篇幅缘由,其余资源如RC、Service、Deployment等等的增删改查操做都相似,只是名字不一样而已,其接口稍微类比一下Pod便可写出对应的资源控制代码,此处再也不赘述了,触类旁通很重要。


后记

做者更多的SpringBt实践文章在此:


若是有兴趣,也能够抽点时间看看做者一些关于容器化、微服务化方面的文章:


CodeSheep · 程序羊
相关文章
相关标签/搜索