使用kubesql进行kubernetes资源查询
kubesql
kubesql(https://github.com/xuxinkun/kubesql)是我最近开发的一个使用sql查询kubernetes资源的工具。诸如node,pod等kubernetes的资源被处理为table。而后可以使用sql语句对其进行查询。
例如,所有pod都很容易从apiserver中获取。但是想要计算每个节点上的pod数量并不容易。但是使用了kubesql,只用一条sql语句可以实现它。
[root@localhost kubesql]# kubesql "select hostIp, count(*) from pods group by hostIp"
+----------+----------------+
| count(*) | hostIP |
+----------+----------------+
| 9 | None |
| 4 | 22.2.22.222 |
| 14 | 11.1.111.11 |
+----------+----------------+
类似的,如果我要查询有多少处于Pending状态的容器,也可以使用这样的语句。
[root@localhost kubesql]# kubesql "select count(*) from pods where phase = 'Pending'"
+----------+
| count(*) |
+----------+
| 29 |
+----------+
kubesql的思路其实就是将一个pod内描述的各个属性转化为数据库中的一行数据。
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: 2018-09-28T07:42:35Z
name: watchtest
namespace: wangsiwu
uid: 10b60b8e-c2f2-11e8-8cfe-e0db55138e34
spec:
nodeName: 10.8.64.179
schedulerName: default-scheduler
status:
phase: Pending
[root@f34cee76e36a kubesql]# kubesql "select * from pods where name='watchtest'"
+-------------+-------------------+-------------------+-----------+-----------+--------+-------+-----------+--------+---------+---------------------------+--------------------------------------+
| nodeName | schedulerName | deletionTimestamp | namespace | name | reason | podIP | startTime | hostIP | phase | creationTimestamp | uid |
+-------------+-------------------+-------------------+-----------+-----------+--------+-------+-----------+--------+---------+---------------------------+--------------------------------------+
| 10.8.64.179 | default-scheduler | None | wangsiwu | watchtest | None | None | None | None | Pending | 2018-09-28 07:42:35+00:00 | 10b60b8e-c2f2-11e8-8cfe-e0db55138e34 |
+-------------+-------------------+-------------------+-----------+-----------+--------+-------+-----------+--------+---------+---------------------------+--------------------------------------+
工作原理
kubesql主要由三个组件组成。
- kubesql-watch:始终watch来自kube-apiserver的事件,并将其进行整理为table,然后写入sqlite3。
- kubesql-server:提供http api进行查询。接受sql查询,在sqlite3中执行查询并返回查询结果。
- kubesql-client:将查询sql发送到kubesql-server并获取结果,然后以表格格式打印结果。
为了增加sqlite3的吞吐量,db文件放在共享内存中,例如放在/dev/shm文件夹。请确保shm超过64MB(如果集群非常大,这里应该对应设置的较大)。
+----------------+ watch +---------------+ +---------+
| kube-apiserver | -------> | kubesql-watch | --> | sqlite3 |
+----------------+ +---------------+ +---------+
^
|
|
+----------------+ http +---------------+ |
| kubesql-client | -------> | kubsql-server | ------+
+----------------+ +---------------+
部署方式
使用docker可以进行方便的部署(我正在编写使用kubernetes进行部署,很快会更新上去)。
这里假定将kubeconfig放置在物理机的/etc/kubernetes/kubeconfig位置上。
首先部署kubesql-watch和kubesql-server。
docker pull xuxinkun/kubesql
docker run -it -d --name kubesql-watch -v /dev/shm:/dev/shm -v /etc/kubernetes/kubeconfig:/etc/kubeconfig xuxinkun/kubesql kubesql-watch
docker run -it -d --name kubesql-server -v /dev/shm:/dev/shm -v /etc/kubernetes/kubeconfig:/etc/kubeconfig xuxinkun/kubesql kubesql-server
使用方式
执行kubesql命令,使用sql进行相关的查询。创建一个kubesql的容器用以执行命令。
这里特别注意,如果不修改配置,就要使用
--net=container:kubesql-server将kubesql的容器和kubesql-server的容器网络在一起,这样可以通过127.0.0.1地址进行访问。这个地址可以在/etc/kubesql/config中进行配置。如果配置了这个地址,就不必使用这个--net的参数了。
[root@localhost kubesql]# docker run -it --rm --name kubesql --net=container:kubesql-server xuxinkun/kubesql bash
[root@d58bbb8c7aa8 kubesql]# kubesql -h
usage: kubesql [-h] [-t TABLE] [-a] [sql]
positional arguments:
sql execte the sql.
optional arguments:
-h, --help show this help message and exit
-t TABLE, --table TABLE
increase output verbosity
-a, --all show all tables
kubesql -a 命令可以查看当前支持的表格。
[root@localhost kubesql]# kubesql -a
+------------+
| table_name |
+------------+
| pods |
| nodes |
+------------+
kubesql -t {table_name} 可以查询 table_name 表格支持的字段。每个字段对应的是api中的哪个字段,可以在/etc/kubesql/params中查看。
[root@localhost kubesql]# kubesql -t nodes
+-------------------------+-----+------------+---------+----+-----------+
| name | cid | dflt_value | notnull | pk | type |
+-------------------------+-----+------------+---------+----+-----------+
| name | 0 | None | 0 | 0 | char(200) |
| uid | 1 | None | 0 | 0 | char(200) |
| creationTimestamp | 2 | None | 0 | 0 | datetime |
| deletionTimestamp | 3 | None | 0 | 0 | datetime |
| allocatable_cpu | 5 | None | 0 | 0 | char(200) |
| allocatable_memory | 6 | None | 0 | 0 | char(200) |
| allocatable_pods | 7 | None | 0 | 0 | char(200) |
| capacity_cpu | 8 | None | 0 | 0 | char(200) |
| capacity_memory | 9 | None | 0 | 0 | char(200) |
| capacity_pods | 10 | None | 0 | 0 | char(200) |
| architecture | 11 | None | 0 | 0 | char(200) |
| containerRuntimeVersion | 12 | None | 0 | 0 | char(200) |
| kubeProxyVersion | 13 | None | 0 | 0 | char(200) |
| kubeletVersion | 14 | None | 0 | 0 | char(200) |
| operatingSystem | 15 | None | 0 | 0 | char(200) |
| osImage | 16 | None | 0 | 0 | char(200) |
+-------------------------+-----+------------+---------+----+-----------+
一些样例
查询某个节点的pod的名称和ns。
[root@localhost kubesql]# kubesql "select name, namespace from pods where hostIp = '172.22.160.107'"
+-----------+-----------------------------------------------------------+
| namespace | name |
+-----------+-----------------------------------------------------------+
| default | imagetest1 |
| xutest | dftest-b16f1ac7-0b56c2b9-v2bw2 |
| default | imagetest |
| xutest | dftest-9da529db |
+-----------+-----------------------------------------------------------+
查询2019-03-12之后创建的容器名称和创建时间。
[root@localhost kubesql]# kubesql "select name, namespace,creationTimestamp from pods where creationTimestamp > datetime('2019-03-12') order by creationTimestamp desc"
+-----------+---------------------------+------------------+
| namespace | creationTimestamp | name |
+-----------+---------------------------+------------------+
| huck-test | 2019-03-12 07:59:36+00:00 | xxxxlog-v4-hvmsd |
| xutt | 2019-03-12 02:45:40+00:00 | soxcs-a03b8302 |
+-----------+---------------------------+------------------+
查询docker版本是1.10.3的节点。
[root@localhost kubesql]# kubesql "select name,containerRuntimeVersion from nodes where containerRuntimeVersion = 'docker://1.10.3'"
+----------------+-------------------------+
| name | containerRuntimeVersion |
+----------------+-------------------------+
| 111.22.111.31 | docker://1.10.3 |
| 11.3.22.201 | docker://1.10.3 |
+----------------+-------------------------+
开发的思路历程
多年前,接触了facebook开源的项目osquery。关于该项目可以参见我以前的博客资料https://xuxinkun.github.io/tags/#osquery。
osquery使用sql来管理系统信息,进行查询的思路给了我极深的印象。在我后来使用kubernetes时,我也经常会想,能不能用sql来查询kubernetes的资源。
在这个思路的启发下,我做了第一版的kubesql,其主要是将kube-apiserver的数据写成文件,而后由spark进行读取,并执行查询。这个版本的kubesql有很大的一个问题,就是数据不能够动态更新。而且不太稳定,经常出现spark退出的问题。另外一个弊病是字段难于重命名,比如metadata.name字段就只能使用这个很长的名字,不方便使用。
因此我在重新开发的时候,重新设计了实现方式和架构,更具有灵活性。而且支持字段重命名。当然,也有很多不完善的地方。还需要开发的。
如果有兴趣的同学,也可以一起来参加开发。我的开发计划如下:
- 增加list的支持,可以支持pod中container字段的支持
- 完善出错处理
- 提高watch性能,减少对sqlite3的压力
- 增加自定义处理函数,这样可以将内存等值从字符串处理为数值
- 增加更多的资源支持,如rs,configmap,deployment等
使用kubesql进行kubernetes资源查询的更多相关文章
- Kubernetes as Database: 使用kubesql查询kubernetes资源
写在前面 kubectl虽然查询单个的kubernetes资源或者列表都已经比较方便,但是进行更为多个资源的联合查询(比如pod和node),以及查询结果的二次处理方面却是kubectl无法胜任的.所 ...
- kubernetes系列06—kubernetes资源清单定义入门
本文收录在容器技术学习系列文章总目录 1.认识kubernetes资源 1.1 常用资源/对象 workload工作负载型资源:pod,ReplicaSet,Deployment,StatefulSe ...
- 新手学习FFmpeg - 如何编写Kubernetes资源文件
Kubernetes API的使用方式 Kubernetes API属于声明式API编程, 它和常用的命令式编程有一些区别. 通俗的说,命令式编程是第一人称,我要做什么,我要怎么做. 操作系统最喜欢这 ...
- 深入理解 Kubernetes 资源限制:CPU
原文地址:https://www.yangcs.net/posts/understanding-resource-limits-in-kubernetes-cpu-time/ 在关于 Kubernet ...
- kubefuse 让Kubernetes 资源成为fuse 文件系统
kubefuse 是基于fuse 开发的文件系统,我们可以像访问文件系统一样访问Kubernetes 资源,使用python开发 支持以下特性: 可以使用方便的linux tools: ls. vim ...
- 深入理解Kubernetes资源限制:CPU
写在前面 在上一篇关于Kubernetes资源限制的文章我们讨论了如何通过ResourceRequirements设置Pod中容器内存限制,以及容器运行时是如何利用Linux Cgroups实现这些限 ...
- Kubernetes资源与对象简述
资料 k8s基本对象概念 背景 资源和对象 Kubernetes 中的所有内容都被抽象为"资源",如 Pod.Service.Node 等都是资源."对象" ...
- kubernetes资源优化
kubernetes资源优化方向 系统参数限制 设置系统内核参数: vm.overcommit_memory = 0 vm.swappiness = 0 sysctl -p #生效 内核参数overc ...
- Terraform入门教程,示例展示管理Docker和Kubernetes资源
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: T ...
随机推荐
- gdb调试原理及qemu中的gdbserver
(一)gdb调试原理 此部分转自:https://blog.csdn.net/u012658346/article/details/51159971 https://www.cnblogs.c ...
- 前端 CSS语法
每个CSS样式由两个组成部分: 1.选择器 2.声明 声明由属性和值组成,每个声明之后用分号结束.
- 小程序:scroll-view组件滑动多次触发scroll事件的bug解决
在项目开发过程中,组件是微信小程序提供给我们的一个分页器,一般滑动到底部时会触发scroll事件,scroll事件中往往包含对后端数据的请求:若是还未滑动到底部时频繁触发事件,则会频繁发请求,达不到想 ...
- angular当router使用userhash:false时路由404问题
angular当router使用userhash:false时路由404问题 安装iis urlrewrite2.0组件 在根目录下创建 Web.config <configuration> ...
- 【Python】This inspection detects names that should resolve but don't. Due to dynamic dispatch and duck
情况一:导包import时发生错误,请参考这两位 https://blog.csdn.net/zhangyu4863/article/details/80212068https://www.cnblo ...
- MongoDB3.2新特性之文档验证
官方参考: https://docs.mongodb.org/master/core/document-validation/ 文档验证是3.2的重要新特性,添加验证条件的情形无非两种,一是在创建集合 ...
- HDU 2196树形DP(2个方向)
HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...
- vs2017 .net core 项目调试浏览器网页闪退Bug
from:https://blog.csdn.net/qq_36330228/article/details/82152187 vs更新2017最新版本后,项目调试浏览器莫名其妙出现闪退,每次都TMD ...
- 安装jar包到本地仓库和远程仓库
转载: https://blog.csdn.net/zengdongwen/article/details/81241198 如何部署到maven中央仓库呢? https://blog.csdn.ne ...
- 使用 dom4j 处理 xml (1)
解决问题需要,自己简单学习了一下dom4j 的基本用法: (1)读取 xml 文件: (2)修改 xml 文件. 需要的 jar 包: dom4j-xxx.jar (可以在 https://dom4j ...