Kubernetes Python Client 初体验之node操作

今天讲一下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成功被修改。

原文地址:https://www.cnblogs.com/lippon/p/14117725.html