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

如何在K8s上为SparkOperator安全传递Azure DataLake访问密钥?

SparkOperator + Azure Data Lake Storage Gen2 安全认证解决方案

针对你在KIND集群通过SparkOperator运行PySpark作业访问ADLS2时,密钥明文存储的问题,以下是可行的安全传递方案及生产级认证替代方案:

一、用Kubernetes Secret安全传递存储密钥的正确方式

你之前尝试的挂载Secret、环境变量方式未成功,核心问题大概率是Spark配置引用环境变量的语法不对,按以下步骤操作即可解决:

1. 创建存储ADLS2密钥的K8s Secret

执行命令将密钥存入Secret:

kubectl create secret generic adls-storage-secret --from-literal=account-key="<你的ADLS2存储账户密钥>"

2. 配置SparkOperator Manifest

在SparkApplication的spec中,给driver和executor配置环境变量,并在sparkConf中通过Spark的环境变量引用语法$(变量名)读取密钥:

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: pyspark-adls-job
spec:
  type: Python
  pythonVersion: "3.8"
  mode: cluster
  image: "gcr.io/spark-operator/spark-py:v3.3.0"
  driver:
    cores: 1
    memory: "1Gi"
    env:
      - name: ADLS_ACCOUNT_KEY
        valueFrom:
          secretKeyRef:
            name: adls-storage-secret
            key: account-key
  executor:
    cores: 1
    instances: 2
    memory: "1Gi"
    env:
      - name: ADLS_ACCOUNT_KEY
        valueFrom:
          secretKeyRef:
            name: adls-storage-secret
            key: account-key
  # 关键:通过$(变量名)引用环境变量,避免硬编码
  sparkConf:
    spark.hadoop.fs.azure.account.key.<你的存储账户名>.dfs.core.windows.net: $(ADLS_ACCOUNT_KEY)

3. 验证配置

提交作业后,可通过查看driver日志或在PySpark代码中打印os.environ.get("ADLS_ACCOUNT_KEY"),确认环境变量已正确加载,且Spark配置中的密钥已替换。

二、Azure生产环境推荐的无密钥认证方案(更安全,无需管理密钥)

1. 托管身份(MSI)认证

如果你的KIND集群部署在Azure VM/VMSS上,给宿主VM分配系统分配或用户分配的托管身份,并将该身份添加到ADLS2的存储Blob数据参与者角色中,然后在SparkConf中配置MSI认证:

sparkConf:
  spark.hadoop.fs.azure.account.auth.type.<存储账户名>.dfs.core.windows.net: OAuth
  spark.hadoop.fs.azure.account.oauth.provider.type.<存储账户名>.dfs.core.windows.net: org.apache.hadoop.fs.azurebfs.oauth2.MsiAuthenticator
  # 使用用户分配MSI时需要填写Client ID,系统分配MSI可省略
  spark.hadoop.fs.azure.account.oauth2.client.id.<存储账户名>.dfs.core.windows.net: <用户分配MSI的Client ID>

2. 服务主体认证

创建Azure AD服务主体,赋予其ADLS2的权限,将服务主体的clientId、clientSecret、tenantId存入K8s Secret,通过环境变量传递给Spark作业:

  • 创建Secret:
kubectl create secret generic adls-sp-secret \
  --from-literal=client-id="<服务主体ID>" \
  --from-literal=client-secret="<服务主体密钥>" \
  --from-literal=tenant-id="<Azure租户ID>"
  • 配置SparkApplication:
spec:
  driver:
    env:
      - name: AZURE_CLIENT_ID
        valueFrom:
          secretKeyRef:
            name: adls-sp-secret
            key: client-id
      - name: AZURE_CLIENT_SECRET
        valueFrom:
          secretKeyRef:
            name: adls-sp-secret
            key: client-secret
      - name: AZURE_TENANT_ID
        valueFrom:
          secretKeyRef:
            name: adls-sp-secret
            key: tenant-id
  executor:
    env:
      - name: AZURE_CLIENT_ID
        valueFrom:
          secretKeyRef:
            name: adls-sp-secret
            key: client-id
      - name: AZURE_CLIENT_SECRET
        valueFrom:
          secretKeyRef:
            name: adls-sp-secret
            key: client-secret
      - name: AZURE_TENANT_ID
        valueFrom:
          secretKeyRef:
            name: adls-sp-secret
            key: tenant-id
  sparkConf:
    spark.hadoop.fs.azure.account.auth.type.<存储账户名>.dfs.core.windows.net: OAuth
    spark.hadoop.fs.azure.account.oauth.provider.type.<存储账户名>.dfs.core.windows.net: org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
    spark.hadoop.fs.azure.account.oauth2.client.id.<存储账户名>.dfs.core.windows.net: $(AZURE_CLIENT_ID)
    spark.hadoop.fs.azure.account.oauth2.client.secret.<存储账户名>.dfs.core.windows.net: $(AZURE_CLIENT_SECRET)
    spark.hadoop.fs.azure.account.oauth2.client.endpoint.<存储账户名>.dfs.core.windows.net: https://login.microsoftonline.com/$(AZURE_TENANT_ID)/oauth2/token

常见问题排查

  • 环境变量未生效:确认Spark版本在2.4及以上(支持$(VAR)语法),且driver和executor的env配置正确,SparkOperator版本支持环境变量传递。
  • 权限问题:检查K8s Secret的权限(默认所有ServiceAccount可读取,若有RBAC限制需调整),以及ADLS2的身份权限配置是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:04:49