利用K8S技术栈打造个人私有云(连载之:K8S资源控制)
【利用K8S技术栈打造个人私有云系列文章目录】
- 利用K8S技术栈打造个人私有云(连载之:初章)
- 利用K8S技术栈打造个人私有云(连载之:K8S集群搭建)
- 利用K8S技术栈打造个人私有云(连载之:K8S环境理解和练手)
- 利用K8S技术栈打造个人私有云(连载之:基础镜像制作与实验)
- 利用K8S技术栈打造个人私有云(连载之:资源控制研究)
- 利用K8S技术栈打造个人私有云(连载之:私有云客户端打造)
注: 本文首发于 My 公众号 CodeSheep ,可 长按 或 扫描 下面的 小心心 来订阅 ↓ ↓ ↓
私有云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相关资源的CRUD控制可以通过restful接口来实现。要使用Kubernetes REST API编写应用程序,当下大多语言都可以很方便地去实现HTTP请求来操作kubernetes的restful接口从而控制和查询资源,但本文主要是利用已有的kubernetes客户端来更加优雅地实现kubernetes的资源控制。你不需要自己编写API来调用、请求/响应等类型,可以直接使用现成的客户端库来实现。
k8s的客户端开源项目有很多,官方有支持,社区也维护了很多。
官方支持的Kubernetes客户端库比较有限,有下面几种:
社区维护的客户端库则更加丰富,基本热门的编程语言都支持,下面的这些Kubernetes API客户端库由社区创建者维护,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即可写出对应的资源控制代码,此处不再赘述了,举一反三很重要。
后记
- 作者更多的原创文章在此,欢迎观赏
- My Personal Blog
作者更多的SpringBt实践文章在此:
- Spring Boot应用监控实战
- SpringBoot应用部署于外置Tomcat容器
- ElasticSearch搜索引擎在SpringBt中的实践
- 初探Kotlin+SpringBoot联合编程
- Spring Boot日志框架实践
- SpringBoot优雅编码之:Lombok加持
如果有兴趣,也可以抽点时间看看作者一些关于容器化、微服务化方面的文章:
- 利用K8S技术栈打造个人私有云 连载文章
- 从一份配置清单详解Nginx服务器配置
- Docker容器可视化监控中心搭建
- 利用ELK搭建Docker容器化应用日志中心
- RPC框架实践之:Apache Thrift
- RPC框架实践之:Google gRPC
- 微服务调用链追踪中心搭建
- Docker容器跨主机通信
- Docker Swarm集群初探
- 高效编写Dockerfile的几条准则
利用K8S技术栈打造个人私有云(连载之:K8S资源控制)相关推荐
- 利用K8S技术栈打造个人私有云(连载之:初章)
我的想法是什么 最近在学习Docker技术,相信Docker技术大家都有所了解,Docker类似于虚拟机(但与虚拟机又有本质不同),提供进程级别的隔离.我们可以利用Docker来方便地来做很多事情,比 ...
- 利用Bdrive打造个人私有云存储解决方案
Bdrive 一款私有云储存软件,可以自己方便的在 Mac/Windows 下架设服务器,并可以通过 PC.Mac.iOS.Android 跨平台使用.以下简单介绍一下利用Bdrive来完成个人私有云 ...
- 从微服务应用于技术栈,了解华为云微服务应用
摘要:一个成熟的微服务解决方案产品需要经历足够大的业务量侵袭,才能变得更加成熟和可靠. 云原生时代,随着容器技术.微服务架构思想.产品研发运营模式不断地推陈出新和迅速发展,应用的设计和开发落地门槛已经 ...
- 【Microsoft Azure 的1024种玩法】四. 利用Azure Virtual machines 打造个人专属云盘,速度吊打某云盘...
[简介] 1.Azure Virtual machines是Azure 提供的多种可缩放按需分配计算资源之一,Nextcloud是一款开源免费的私有云存储网盘项目,可以让你快速便捷地搭建一套属于自己或 ...
- (转)iOS Wow体验 - 第五章 - 利用iOS技术特性打造最佳体验
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第五章译文精选,其余章节将陆续放出.上一篇:Wow ...
- 网易伏羲私有云在资源调度及资源整合方面的实践
网易伏羲成立于2017年,是国内专业从事游戏与泛娱乐AI研究和应用的顶尖机构.伏羲计算效能团队2018年开始基于Kubernetes/OpenStack,面向AI,游戏等业务,打造了伏羲私有云.本文主 ...
- CSDN专访云信阙杭宁:以16年技术积累打造稳定IM云服务
网易在9月21日发布了网易云计算战略,以数十亿人民币的首批投入来"解放全国千千万万的程序员".而在2015年年底,网易云信IM开发服务平台就作为先锋军的一员,杀进了开发服务市场. ...
- 程序员疯狂记事:如何利用众多技术栈构建一个 Web 应用程序?!
[CSDN 编者按]"Elixir.Phoenix.Absinthe.GraphQL.React和Apollo"--在这几个关键词中,有几个是身为开发者的你一直想玩但还没来得及玩的 ...
- 利用ELK技术栈收集nginx日志
之前的一篇文章已经介绍如何使用nginx写入post的数据入日志,详细见链接: nginx的post命令记录body到日志中 接下来使用filebeat.logstash.elasticsearch把 ...
最新文章
- 混合云环境中扩展Kubernetes的挑战及方案
- python【蓝桥杯vip练习题库】ADV-236林丹大战李宗伟
- PHP酒店管理demo案例(数组遍历)
- javascript动态创建表格:新增、删除行和列
- 快速理解网络通信协议
- linux spf13 vim安装,Linux 下安装 spf13-VIM
- JavaScript(七)—— BOM 浏览器对象模型
- js的左右滑动触屏事件
- hibernate中one-to-many实例一
- python用三种方式定义字符串、并依次输出_Python 字符串格式化输出的3种方式
- java 堆栈大小设置_如何增加Java堆栈大小?
- 计算机辅助翻译和人工翻译的优缺点,计算机辅助翻译的利与弊以及解决方案
- pdksh-5.2.14-36.el5.i386.rpm
- html 如何完美的显示图片,不拉伸图片,完整显示等等。
- CouchDB操作手册
- 计算机终端通讯380023,华为发布首款5G手机Mate20X,通讯服务商标注册属于第几类?...
- hdu 2177 威佐夫博弈
- PostgreSQL的查询技巧: 零除, GENERATED STORED, COUNT DISTINCT, JOIN和数组LIKE
- 新浪微博 OAuth2 NodeJs发微博
- python交互模式下输出一首古诗
热门文章
- 349套HTML5+CSS3各行各业网站模板免费下载
- Eclipse中新建SpringBoot项目并输出HelloWorld
- 关于flutter列表的性能优化,你必须要了解的
- php中退出怎么写,php中退出登录怎么写
- 实战小课 | 深入剖析 「事件设计方法与规范」,夯实数据分析基础!
- okhttp3下载文件检测进度与断点续传
- 创建一个多进程(multiprocessing.Process)
- 修改Windows7登录界面背景图片的方法
- 关于maven仓库中的_remote.repositories
- SegmentFault D-Day 北京:大数据