我的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 Authorizer和NodeRestriction admission plugin。
根据描述,这正是我想要的。
我的问题是我不知道该如何告诉Kubernetes。
这是否适合这种情况?如果是,我应该怎么做?我什至应该如何从工作节点执行kubectl命令?
预先感谢:)