簡體   English   中英

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

[英]Run k8s commands within Airflow hosted on an EKS cluster using the python api

我目前有一個托管在 EKS 集群上的 Airflow 部署,並希望它運行一個報告,該報告將檢查另一個部署的日志記錄,並在發生任何錯誤時提醒我。

在本地,我可以毫無問題地運行它,因為我只需將 k8s python api 指向我的 kubeconfig,但是一旦部署,這將不起作用,因為 pod 上沒有帶有 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 放在部署中並不是一個好習慣。

如何讓 airflow 使用它托管的集群的 kubeconfig? 或者有沒有我想念的替代品......

回答問題中的一些擔憂:

我試過刪除 load_kube_config 命令,但這只會引發連接被拒絕錯誤,大概是因為它現在不知道任何集群,盡管它駐留在一個......

要在集群內(從Pod )運行您的代碼,您需要切換:

  • 來自: config.load_kube_config()
  • 到: config.load_incluster_config()

請閱讀下面的內容,因為我解決了運行 Kubernetes Python ZDB974A710CACE146 庫內部代碼所需的設置的 rest。


如何讓 airflow 使用它托管的集群的 kubeconfig? 或者有沒有我想念的替代品......

實際上,您缺少一個解決方案:

您將需要使用具有適當RolesRoleBindingsServiceAccount

讓我再解釋一下,並添加一個示例:


解釋:

要運行上述設置,您需要參考以下 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"]

這是一個允許查詢 Kubernetes API 等資源的Role > 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清單(在.spec.template.spec中)使用serviceAccount: python-job-sa並查詢 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))

Output:

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

附加資源:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM