使用 python api 在托管在 EKS 集群上的 Airflow 中运行 k8s 命令

时间:2021-02-01 16:29:50

标签: python kubernetes airflow amazon-eks

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

1 个答案:

答案 0 :(得分:1)

回答问题中的一些疑虑:

<块引用>

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

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

  • 来自: config.load_kube_config()
  • 至: config.load_incluster_config()

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


<块引用>

我怎样才能让气流使用它托管的集群的 kubeconfig?或者有没有我遗漏的替代方案......

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

您需要使用带有正确 ServiceAccountRolesRoleBindings

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


说明:

要运行我上面描述的此类设置,您需要参考以下 Kubernetes 文档:

如官方文档所述:

<块引用>

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

您需要使用 ServiceAccountRoles 为您的 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

其他资源: