目的
我想从正在运行的Pod内连接并调用Kubernetes REST API,有问题的Kubernetes是使用IAM身份验证的AWS EKS集群。所有这些都使用Kubernetes Python库。
我尝试过的
从我的python file
内部:
from kubernetes import client, config
config.load_incluster_config()
v1 = client.CoreV1Api()
ret = v1.list_pod_for_all_namespaces(watch=False)
上面的命令抛出
403
错误,我相信这是由于AWS EKS使用的身份验证机制不同。我已经知道的作品
ApiToken = 'eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.xxx.yyy'
configuration = client.Configuration()
configuration.host = 'https://abc.sk1.us-east-1.eks.amazonaws.com'
configuration.verify_ssl = False
configuration.debug = True
configuration.api_key = {"authorization": "Bearer " + ApiToken}
client.Configuration.set_default(configuration)
尽管上述方法有效,但我必须对通过kubectl在本地生成的 token 进行硬编码,并将其检入代码中,这会带来安全风险。
是否存在使用AWS EKS对Kubernetes python lib进行身份验证的更合适方法?
最佳答案
您可以使用以下方法获取 token 。假设您已经在pod / server / laptop上成功安装并配置了aws-iam-authenticator。
def get_token(cluster_name):
args = ("/usr/local/bin/aws-iam-authenticator", "token", "-i", cluster_name, "--token-only")
popen = subprocess.Popen(args, stdout=subprocess.PIPE)
popen.wait()
return popen.stdout.read().rstrip()
api_token = get_token("<cluster_name>")
configuration = client.Configuration()
configuration.host = '<api_endpoint>'
configuration.verify_ssl = False
configuration.debug = True
configuration.api_key['authorization'] = "Bearer " + api_token
configuration.assert_hostname = True
configuration.verify_ssl = False
client.Configuration.set_default(configuration)
v1 = client.CoreV1Api()
ret = v1.list_pod_for_all_namespaces(watch=False)
print ret
有一个kubernetes-client / python-base的PR,它增加了对exec插件Attempt to implement exec-plugins support in kubeconfig的支持。