Python kubernetes 库的使用
单个 Docker通 常并不能完成我们的日常任务,我们需要多个 Docker 协同工作,这时就需要一些容器编排工具,简单来说就是一些管理容器的工具。现阶段,Google 公司提供的 kubernetes 是最流行的容器编排管理工具,本节将介绍该工具的使用。
我们介绍的工具叫作 kubernetes-client。这个软件包是 kubernetes 团队提供的,更新速度还是不错的。其他类似的开发包也有一些,它们提供各自不同风格的接口,但是我们这里不打算介绍,仅仅关注 kubernetes-client 这个软件包。
由于 kubernetes 涉及的概念和内容非常多,一些基础的知识这里就直接跳过了,例如如何搭建一个kubernetes集群,如何设置集群用户等,所以本节内容适合有一定 kubernetes 操作经验的人阅读。
kubernetes-client 是一个需要自行安装的软件包,推荐的安装方法还是使用 PIP 命令。命令如下:
pip install kubernetes
kubernetes 目前的版本是 10.0.0。
在使用之前我们需要知道被操作集群的信息,它在 kubernetes 中用一个 yaml 文件表示。下面的例子显示的便是一个集群信息文件。
apiVersion: v1
kind: Config # 表明这是一个配置文件
clusters:
- name: "demo1" # 集群的名字
cluster:
server: https://lovepython/k8s/clusters/c-zjhdk # 集群的地址
api-version: v1
certificate-authority-data: # 集群的证书
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM3akNDQ\
WRhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFvTV\
JJd0VBWURWUVFLRXdsMGFHVXQKY\
21GdVkyZ3hFakFRQmdOVkJBTVRDV05oZEhSc1pTMWpZVEFlRncwe\
E9UQXlNVFV3TkRBNE16TmFGd\
zB5T1RBeQpNVEl3TkRBNE16TmFNQ2d4RWpBUUJnTlZCQW9UQ1h\
Sb1pTMXlZVzVqYURFU01CQUdBM\
VVFQXhNSlkyRjBkR3hsCkxXTmhNSUlCSWpBTkJna3Foa2lHOXcw\
QkFRRUZBQU9DQVE4QU1JSUJDZ\
0tDQVFFQTkwNjNXekVWVmgvNzBsWisKb2NpQ1haZHFXNWkwbHN6W\
m5PUUF6NWh1VDNadDlWamx0R\
S9zQkllUTBjYnhZQlZDOWFqR01zM3RwOFk1WjJPWQpUbTZtNzlQ\
QjlpaC9DUDZPb0FIQy9JbDRMZ\
09zSTVvK1ErN0ZydVFHenA5c3JnMWV4ZkEzQVlqRmROK21mWE\
ptCmhxdEZMYzV5VDRwZ1U5VElMd\
U9kU0N2ZFRaTXl2b2wySG82MWVsRjYzdEdrdEpya2M4MXBHaXRhbU\
1GblhqRUEKMHkrZFpvdlJwS\
HNMdlgxUEtESmY1VWsydUVkUDExbzEwdEJYcnlPNy9mZEsvREJleWF\
2UFB2K05uV1VremtKWQp3d\
DV2TkIzUUZrNEwvRjd6MUZkNUdERXdWYjdZK1lwODcxU0lyWCtqUXdTT\
2dpVFk3T1JvTldSVm1MY\
m9Cd1hUCkVEazcyUUlEQVFBQm95TXdJVEFPQmdOVkhROEJBZjhF\
QkFNQ0FxUXdEd1lEVlIwVEFRS\
C9CQVV3QXdFQi96QU4KQmdrcWhraUc5dzBCQVFzRkFBT0NBUUV\
BeHAzUTNJR01uK0hLaHc4ZkVua\
3Q5TjNxRUFjdjZYTVczN2c4OWJ4MgpPdWxIQkxVcDFpYjdsYXBBanJnd\
VN6NEhlM2prL1R2SHIxZ\
0JiSTNzSHZZVi9NcU9LbGdzdG51T0NyeGEyWlNRCkM1SnZsL01\
aMzc2OXBQZnkwMmRaVnpKMERNL\
3JOK3RaUDdRRWo0VnpVRzIyWDhxM3dTQTF5ckpQSitETUxvZ\
GsKajZUNGZvR1ppa25nRGh0RlY0Y\
2dtbjVZYThiaUlpYlVNVi9mMDlJVUNGUm82aU5kZjVGNG5vTU9XWE\
hSYi9ZRApTemJjTXliMGV0e\
lpXWS82ckNoUWtHUWk4ZlBjeFV0dG5VTFhLdG5WNEpROGFDZUtiN\
FJpZmt5QzFqQ1BtUFFJCm1vQ\
TJJcXhSVVVsNTFHaXRXL0hCbFpXR2hpL1YwM0xWYi9VTWttOXFqc\
G1adUE9PQotLS0tLUVORCBDR\
46 VJUSUZJQ0FURS0tLS0t"
users: # 用户信息
- name: "user-xckkr" # 用户名
user: # 用户密码信息
token: "kubeconfig-user-xckkr:9xb86js8htrcbw2j2nr2qglqvtc9rh4wrtqd\
fpvchcz7wvf58dwpns"
contexts:
- name: "voddev"
context:
user: "user-xckkr"
cluster: "demo1"
current-context: "demo1"
首先需要设定环境变量 KUBECONFIG,让其指向该配置文件。这个用法和 kubectrl 命令行工具是一样的。然后就可以运行后面例子的代码了。第一个例子是查看当前集群所有的 pod 信息。
pod 是一个比容器大一点的概念,是在 kubernetes 中的最小调度单位。在 kubernetes 中不能说启动一个容器实例,只能说启动一个 pod。一个 pod 可以包含一个或者几个容器,这些容器的 IP 地址一样,如果需要对外提供服务,只能用不同的端口或不同的传输层类型来区分;同一个 pod 中的容器运行在同一台主机(node)上。
图 1 描述了node、pod 和容器之间的关系。一个 node 上可以运行多个 pod,一个 pod也 可以包含多个容器,这些容器共享一个 IP 地址和其他资源。
kubernetes 集群本身也有一些系统pod在运行,这些容器主要完成集群的管理工作。下面是完整的代码。
from kubernetes import client, config # 引入我们要用的包
def query_pod(): # 定义我们的主函数
config.load_kube_config() # 读入集群相关信息,就是要操作哪个集群
v1 = client.CoreV1Api() # 得到客户端中的一个组接口
# 查询所有的pod信息
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items: # 遍历得到的pod
print("%s\t%s\t%s" % # 显示pod的IP地址、所属命名空间和名字
(i.status.pod_ip, i.metadata.namespace, i.metadata.name))
if __name__ == '__main__': # 作为脚本时运行
query_pod () # 运行主程序
运行后的输出结果如下:
$ python3 demo1.py
Listing pods with their IPs: # 分为三列,IP地址、命名空间和名字
10.42.0.6 cattle-system cattle-cluster-agent-56cd4f89c5-jckdr
10.89.8.130 cattle-system cattle-node-agent-7z88g
10.89.24.174 cattle-system cattle-node-agent-kzb5s
10.89.24.41 cattle-system cattle-node-agent-qt2f2
10.89.25.251 cattle-system cattle-node-agent-wmpst
......
这里需要注意的是命名空间。我们一般可以创建自己的命名空间。这样,不同的 pod 可以放到不同的命名空间中,相当于是给 pod 进行了分组。系统提供了一个 default 命名空间,如果不希望继续细分就可以使用该命名空间。
在前面的例子中,我们有很多的 pod 都是在 default 这个命名空间中。另外,有些 kubernetes 的管理 pod 都在 kube-system 这个命名空间中。
相关文章:
Python kubernetes库的使用
python - K8s 平台开发
k8s官网|客户端库python/java/go
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)