我目前在 EKS 集群上托管了一个 Airflow 部署,并希望它运行报告来检查另一个部署的日志记录并在发生任何错误时提醒我。
在本地我可以毫无问题地运行它,因为我可以将 k8s python api 指向我的 kubeconfig,但是一旦部署,这将不起作用,因为没有带有 kubeconfig 的 $Home/.kube 目录吊舱。
with client.ApiClient(config.load_kube_config(config_file=k8s_config_file)) as api_client:
api_instance = client.CoreV1Api(api_client)
我已经尝试删除 load_kube_config 命令,但是这只会引发连接拒绝错误,大概是因为它现在不知道任何集群,尽管它驻留在一个...
我认为将 kubeconfig 放在部署上不是一个好习惯。
我怎样才能让气流使用它托管的集群的 kubeconfig? 或者有没有我遗漏的替代方案......
答案 0 :(得分:1)
回答问题中的一些疑虑:
<块引用>我已经尝试删除 load_kube_config 命令,但是这只会引发连接拒绝错误,大概是因为它现在不知道任何集群,尽管它驻留在一个...
要在集群内运行您的代码(来自 Pod
),您需要切换:
config.load_kube_config()
config.load_incluster_config()
请阅读下文,因为我解决了在集群内运行 Kubernetes Python API 库代码所需的其余设置。
我怎样才能让气流使用它托管的集群的 kubeconfig?或者有没有我遗漏的替代方案......
事实上,您缺少一个解决方案:
您需要使用带有正确 ServiceAccount
和 Roles
的 RoleBindings
。
让我再解释一下并添加一个示例:
要运行我上面描述的此类设置,您需要参考以下 Kubernetes 文档:
ServiceAccount
Role
和 RoleBinding
如官方文档所述:
<块引用>当您(人类)访问集群(例如,使用 kubectl
)时,apiserver 将您作为特定用户帐户进行身份验证。 Pod 内容器中的进程也可以联系 apiserver。 当他们这样做时,他们被验证为特定的服务帐户(例如,默认)。
您需要使用 ServiceAccount
和 Roles
为您的 RoleBidings
添加权限,以允许它查询 Kubernetes API 服务器。例如,您需要添加权限才能列出 Pods
。
我已经在 Serverfault 上回答了一个类似的案例。我鼓励你检查一下:
我允许自己复制和更改此答案的某些部分:
<块引用>ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: python-job-sa
此 ServiceAccount
将与将托管您的 Python 代码的 Deployment/Pod
一起使用。
ServiceAccount
分配特定权限apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: python-job-role
rules:
# This will give you access to pods
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
# This will give you access to pods logs
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get", "list", "watch"]
这是一个 Role
,允许查询 Kubernetes API 以获取诸如 > Pods
之类的资源。
Role
绑定到 ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: python-job-rolebinding
namespace: default
subjects:
- kind: ServiceAccount
name: python-job-sa
namespace: default
roleRef:
kind: Role
name: python-job-role
apiGroup: rbac.authorization.k8s.io
应用这些规则后,您可以使用 serviceAccount: python-job-sa
清单(在 Deployment
中)中的 .spec.template.spec
并查询 Kubernetes API,如下所示:
from kubernetes import client, config
config.load_incluster_config() # <-- IMPORTANT
v1 = client.CoreV1Api()
print("Listing pods with their IPs:")
ret = v1.list_namespaced_pod("default")
for i in ret.items:
print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))
输出:
Listing pods with their IPs:
10.88.0.12 default nginx-deployment-d6bcfb88d-q8s8s
10.88.0.13 default nginx-deployment-d6bcfb88d-zbdm6
10.88.0.11 default cloud-sdk
其他资源: