You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker部署的Python应用中生成DigitalOcean Kubernetes的kubeconfig

解决DigitalOcean Apps中Python应用连接K8s集群的kubeconfig问题

最优方案:运行时生成kubeconfig

在应用启动时直接通过DigitalOcean API获取集群kubeconfig内容,无需依赖本地文件,有两种实现方式:

方式1:调用doctl命令行(需容器内安装doctl)

先在Dockerfile中添加doctl安装步骤:

RUN curl -sSL https://github.com/digitalocean/doctl/releases/latest/download/doctl-linux-amd64 -o /usr/local/bin/doctl && \
    chmod +x /usr/local/bin/doctl

再修改Python代码,通过子进程生成并加载kubeconfig:

import kubernetes as k8s
import subprocess
import os
import yaml
from kubernetes.client.rest import ApiException

def init_k8s():
    # 从环境变量读取敏感信息
    DO_API_TOKEN = os.getenv("DO_API_TOKEN")
    CLUSTER_ID = os.getenv("DO_CLUSTER_ID")

    # 初始化doctl并获取kubeconfig内容
    subprocess.run(["doctl", "auth", "init", "-t", DO_API_TOKEN], check=True)
    kubeconfig_raw = subprocess.check_output([
        "doctl", "kubernetes", "cluster", "kubeconfig", "show", CLUSTER_ID
    ]).decode("utf-8")

    # 直接加载kubeconfig字典,无需写入文件
    k8s.config.load_kube_config(config_dict=yaml.safe_load(kubeconfig_raw))

    # 配置DigitalOcean API访问(若需调用其他DO API)
    configuration = k8s.client.Configuration()
    configuration.host = 'https://api.digitalocean.com'
    configuration.api_key = {'access-token': DO_API_TOKEN}

注意:需在DigitalOcean Apps的环境变量中配置DO_API_TOKEN和DO_CLUSTER_ID,禁止硬编码敏感信息。

方式2:直接调用DigitalOcean API(无需安装doctl)

用Python的requests库直接请求DO API获取kubeconfig,更轻量:

import kubernetes as k8s
import requests
import os
import yaml
from kubernetes.client.rest import ApiException

def init_k8s():
    DO_API_TOKEN = os.getenv("DO_API_TOKEN")
    CLUSTER_ID = os.getenv("DO_CLUSTER_ID")

    # 调用DO API获取kubeconfig
    headers = {"Authorization": f"Bearer {DO_API_TOKEN}"}
    response = requests.get(
        f"https://api.digitalocean.com/v2/kubernetes/clusters/{CLUSTER_ID}/kubeconfig",
        headers=headers
    )
    response.raise_for_status()
    kubeconfig_raw = response.text

    # 加载kubeconfig
    k8s.config.load_kube_config(config_dict=yaml.safe_load(kubeconfig_raw))

    # 配置DigitalOcean API访问
    configuration = k8s.client.Configuration()
    configuration.host = 'https://api.digitalocean.com'
    configuration.api_key = {'access-token': DO_API_TOKEN}

其他方案可行性分析

  • 构建阶段生成kubeconfig:不可行,构建时暴露API令牌会导致敏感信息泄露,不符合安全规范。
  • 映射现有kubeconfig到容器:不可行,应用部署在DigitalOcean Apps而非Kubernetes集群中,无卷映射选项。
  • 构建阶段复制kubeconfig:不可行,DigitalOcean Apps的构建流程不支持从本地复制文件到镜像。
  • 创建含kubeconfig的基础镜像:不可行,将机密kubeconfig放入公共镜像仓库会引发严重安全风险。

内容的提问来源于stack exchange,提问作者FN_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:30:30