今天讲一下k8s中对于各个实物节点node的操作。
首先是获取所有nodes信息:
self.config.kube_config.load_kube_config(config_file="kubeconfig.yaml")
print(self.coreApi.list_node())
函数返回的是一个名为kubernetes.client.models.v1_node_list.V1NodeList类型的数据,每个节点信息分别存储在其items属性中,items是一个List类型的数据。以此,编写了以下几个经常用到的node数据获取的API。
def get_all_nodes(self):
"""
:rtype: V1NodeList
"""
return self.coreApi.list_node()
def get_nodes_num(self):
"""
:rtype: int
"""
return len(self.get_all_nodes().items)
def get_all_nodes_name(self):
"""
:rtype: list
"""
names = []
for item in self.get_all_nodes().items:
names.append(item.metadata.name)
return names
def get_node_label_value(self, nodes, label):
"""
:type nodes: str
:type label: str
:rtype: str
"""
try:
i = self.get_all_nodes_name().index(nodes)
return self.get_all_nodes().items[i].metadata.labels[label]
except ValueError:
return None
如果需要其他不同的数据,可以自己打印get_all_nodes()的返回数据,然后定位,不外乎是数组和字典的形式。
Label是Kubernetes系统中的一个核心概念。Label以key/value键值对的形式附加到任何对象上,如Pod,Service,Node,RC(ReplicationController)/RS(ReplicaSet)等。Label可以在创建对象时就附加到对象上,也可以在对象创建后通过API进行额外添加或修改。
在对于pods的调度过程中,我们常常需要用到kubernetes的label功能,它分为nodes节点上的label和pod部署是YML文件中的label。当部署文件中选择器的label内容和node上的满足一定关系式,pods才能够被成功部署到该节点。
在上面提供的API中,我们已经能能够读取node的label值了,下面我们试着修改它。
AP如下:
def push_node_label_value(self, node, label, value):
"""
:type node: str
:type label: str
:type value: str
"""
body = {
"metadata": {
"labels": {
label: value
}
}
}
if node in self.get_all_nodes_name():
self.coreApi.patch_node(node, body)
else:
print("nods is not exist")
为了验证label是否已经真的被修改,我首先获取当前的节点label值。在master节点上执行以下命令:
kubectl get nodes --show-labels
取出其中node01的输出结果如下图:
第一次结果
执行函数:
push_node_label_value("node01", "hardwareType", "arm64")
之后重新查看label,得到下图
第二次结果
发现label成功被修改。
网友评论