[英]interact with API added by k8s operator using native k8s python client
[英]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? 或者有沒有我想念的替代品......
實際上,您缺少一個解決方案:
您將需要使用具有適當Roles
和RoleBindings
的ServiceAccount
。
讓我再解釋一下,並添加一個示例:
要運行上述設置,您需要參考以下 Kubernetes 文檔:
ServiceAccount
Role
和角色RoleBinding
如官方文檔中所述:
當您(人類)訪問集群時(例如,使用
kubectl
),您將被 apiserver 認證為特定的用戶帳戶。 pod 內容器中的進程也可以聯系 apiserver。 當他們這樣做時,他們被認證為一個特定的服務帳戶(例如,默認) 。
您需要使用Roles
和RoleBidings
向您的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.