Kubernetes封锁自己的节点(来自工作节点的访问API)

时间:2020-08-14 14:07:43

标签: python kubernetes

我的Workernodes位于办公室中。 当用户登录时,该节点上的所有正在运行的Pod应该被逐出,并且该节点处于警戒状态,而当他注销时,该节点应该可以重新调度。 到目前为止,我已经将逐出部分与Python脚本,Kubernetes库,相应命名空间中的角色和服务帐户一起使用了。

import kubernetes.client
from kubernetes.client.rest import ApiException
from pprint import pprint
import os
import sys


def evict(configuration):
    with kubernetes.client.ApiClient(configuration) as api_client:
        # api_instance = kubernetes.client.AdmissionregistrationApi(api_client)
        v1api = kubernetes.client.CoreV1Api(api_client)
        hostname = os.uname()[1]

        try:
            api_response = v1api.list_namespaced_pod("jhub", label_selector="component=singleuser-server")

            for i in api_response.items:
                if i.spec.node_name == hostname:
                    eviction_body = kubernetes.client.models.v1beta1_eviction.V1beta1Eviction(
                        metadata=kubernetes.client.V1ObjectMeta(name=i.metadata.name, namespace=i.metadata.namespace))

                    api_response = v1api.create_namespaced_pod_eviction(name=i.metadata.name,
                                                                        namespace=i.metadata.namespace, body=eviction_body)
            cordon_body = {
                "spec": {
                    "unschedulable": True
                }
            }
            api_response = v1api.patch_node(hostname, body=cordon_body)
            pprint(api_response)
        except ApiException as e:
            print("Exception when calling Api\n%s" % e)


def join(configuration):
    with kubernetes.client.ApiClient(configuration) as api_client:
        v1api = kubernetes.client.CoreV1Api(api_client)
        hostname = os.uname()[1]
        cordon_body = {
            "spec": {
                "unschedulable": False
            }
        }        
        api_response = v1api.patch_node(hostname, body=cordon_body)
        pprint(api_response)

def main(arg):
    configuration = kubernetes.client.Configuration()
    configuration.verify_ssl = False
    configuration.api_key['authorization'] = '<Token>'
    configuration.api_key_prefix['authorization'] = 'Bearer'

    # Defining host is optional and default to http://localhost
    configuration.host = "https://192.168.2.209:6443"

    if arg == "evict":
        evict(configuration)
    elif arg == "join":
        join(configuration)


if __name__ == '__main__':
    if len(sys.argv) == 2:
        if sys.argv[1] in ("evict", "join"):
            main(sys.argv[1])
        else:
            raise ValueError("Unknown Argument: valid arguments are 'join' and 'evict'")
    else:
        raise ValueError("Only one argument accepted")

但这是我的问题,我想授予最少的特权。由于该服务帐户只能访问名称空间内的Pod,因此我无法对该节点进行警戒以防止重新计划。

我了解了roles的使用权限。 但是它在这里说我应该使用Node AuthorizerNodeRestriction admission plugin
根据描述,这正是我想要的。
我的问题是我不知道该如何告诉Kubernetes。
这是否适合这种情况?如果是,我应该怎么做?我什至应该如何从工作节点执行kubectl命令?

预先感谢:)

0 个答案:

没有答案