【问题标题】:Run k8s commands within Airflow hosted on an EKS cluster using the python api使用 python api 在 EKS 集群上托管的 Airflow 中运行 k8s 命令
【发布时间】:2021-05-05 20:22:09
【问题描述】:

我目前在 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? 或者有没有我错过的替代方案......

【问题讨论】:

  • 您可以使用 kubeconfig 匹配具有有限权限的 k8s 用户,而不是 k8s 集群所有者的 k8s 用户

标签: python kubernetes airflow amazon-eks


【解决方案1】:

回答问题中的一些疑虑:

我尝试删除 load_kube_config 命令,但这只会引发连接被拒绝错误,可能是因为它现在不知道任何集群,尽管它驻留在一个集群中......

要在集群内运行您的代码(来自Pod),您需要切换:

  • 来自: config.load_kube_config()
  • 收件人: config.load_incluster_config()

请阅读下文,因为我解决了在集群内运行 Kubernetes Python API 库代码所需的其余设置。


如何让气流使用它所在集群的 kubeconfig?或者有没有我想念的替代品......

事实上,您缺少一个解决方案:

您需要使用ServiceAccount 和正确的RolesRoleBindings

让我再解释一下并添加一个示例:


说明:

要运行上述设置,您需要参考以下 Kubernetes 文档:

如官方文档所述:

当您(人类)访问集群时(例如,使用kubectl),您将被 apiserver 验证为特定的用户帐户。 pod 内容器中的进程也可以联系 apiserver。 当他们这样做时,他们被认证为特定的服务帐户(例如,默认)

您需要使用RolesRoleBidings 为您的ServiceAccount 添加权限,以允许它查询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

应用这些规则后,您可以在 Deployment 清单中使用 serviceAccount: python-job-sa(在 .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

其他资源:

【讨论】:

  • 嗨,戴维,非常感谢您的回答。我会努力实现的!
猜你喜欢
  • 2020-08-13
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 2018-08-23
  • 2019-07-09
  • 2019-09-30
  • 2021-12-11
相关资源
最近更新 更多