V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hansonwang99
V2EX  ›  程序员

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

  •  
  •   hansonwang99 ·
    hansonwang99 · 2018-03-19 08:44:11 +08:00 · 2663 次点击
    这是一个创建于 2228 天前的主题,其中的信息可能已经有所发展或是发生改变。

    封面图片


    [利用 K8S 技术栈打造个人私有云系列文章目录]


    私有云 K8S 资源控制原理

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

    由于在我们的实践中 Docker 容器是放在 kubernetes 集群中进行管理,所以这里的资源控制涉及的资源主要就是 kubernetes 的资源,如 Pod、RC、Service 等。

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

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

    K8S 资源控制架构图

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


    K8S 资源控制客户端

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

    k8s 的客户端开源项目有很多,官方有支持,社区也维护了很多。

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

    官方支持的 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 即可写出对应的资源控制代码,此处不再赘述了,举一反三很重要。


    后记

    作者更多的原创文章在此


    daydaydayup
        1
    daydaydayup  
       2018-03-19 10:13:27 +08:00
    我来支持下,打破零评论
    lfzyx
        2
    lfzyx  
       2018-03-19 11:03:11 +08:00
    看完了,仅适合入门,而且以后 k8s 的安装方法会更倾向于用 kubeadm https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
    awhane
        3
    awhane  
       2018-03-19 11:54:44 +08:00
    @lfzyx 1 年前这货就是 beta 了,现在还在 beta。
    kunluanbudang
        4
    kunluanbudang  
       2018-03-19 17:57:32 +08:00 via Android
    @Livid


    应该是引流
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1027 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:06 · PVG 06:06 · LAX 15:06 · JFK 18:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.