Flink Operator启用azure-fs-hadoop访问Azure Blob存储实操指南
问题根因
直接在flink-main-container下配置command的写法完全错误——该操作会覆盖Flink官方镜像内置的启动入口命令,导致JobManager、TaskManager的原生启动逻辑直接失效,不仅你要的拷贝jar包操作不会按预期执行,整个Flink进程都无法正常启动。
方案1:构建预安装Azure插件的自定义镜像(生产环境优先选)
这种方案不需要Pod启动时临时拉文件,启动速度快、稳定性最高,是生产环境的标准做法。
编写Dockerfile如下:
FROM flink:1.15 # 手动在插件目录创建azure-fs-hadoop文件夹 RUN mkdir -p /opt/flink/plugins/azure-fs-hadoop # 将以下4个对应版本的jar包放到该目录下: # 1. flink-azure-fs-hadoop-1.15.0.jar(Flink官方Azure文件系统插件) # 2. hadoop-azure-3.3.4.jar(Hadoop Azure依赖) # 3. azure-storage-blob-12.21.0.jar(Azure Blob SDK) # 4. azure-core-1.34.0.jar(Azure核心SDK) # 可以提前把这些包下载到本地构建上下文,用COPY指令复制进镜像,避免构建时联网拉取 COPY *.jar /opt/flink/plugins/azure-fs-hadoop/
构建镜像推送到自己的私有镜像仓库后,直接把FlinkDeployment配置里的image字段替换为自定义镜像地址即可,不需要额外配置command、initContainer逻辑。
方案2:通过initContainer启动时自动拷贝插件(无需自定义镜像)
如果不想维护自定义镜像,可以用initContainer提前把需要的jar包下载到共享存储卷,再挂载到Flink主容器的对应插件目录,注意绝对不要覆盖主容器的command字段。
核心配置修改参考如下,其余原有业务配置保持不变:
spec: podTemplate: spec: volumes: - name: flink-data emptyDir: {} # 新增独立卷存放Azure插件jar包 - name: flink-azure-plugin emptyDir: {} containers: - name: flink-main-container volumeMounts: - mountPath: /opt/flink/data name: flink-data # 将插件卷挂载到Flink主容器的插件目录 - mountPath: /opt/flink/plugins/azure-fs-hadoop name: flink-azure-plugin # 不要在此处配置command,避免覆盖原生启动逻辑 jobManager: resource: memory: "2048m" cpu: 1 podTemplate: spec: initContainers: # 保留原有拉取业务jar的initContainer配置 - name: fetch-jar image: cirrusci/wget volumeMounts: - mountPath: /opt/flink/data name: flink-data command: - "wget" - "LINK_TO_CUSTOM_JAR_FILE_ON_AZURE_BLOB_STORAGE" - "-O" - "/opt/flink/data/test.jar" # 新增拉取Azure插件的initContainer - name: fetch-azure-plugin image: cirrusci/wget volumeMounts: - mountPath: /opt/flink/plugins/azure-fs-hadoop name: flink-azure-plugin command: - sh - -c - | # 下载对应版本的4个Azure插件依赖包到挂载目录 wget -O flink-azure-fs-hadoop-1.15.0.jar <flink-azure插件包内网可访问下载地址> wget -O hadoop-azure-3.3.4.jar <hadoop-azure依赖包内网可访问下载地址> wget -O azure-storage-blob-12.21.0.jar <azure blob sdk内网可访问下载地址> wget -O azure-core-1.34.0.jar <azure core sdk内网可访问下载地址> containers: - name: flink-main-container volumeMounts: - mountPath: /opt/flink/plugins/azure-fs-hadoop name: flink-azure-plugin taskManager: resource: memory: "2048m" cpu: 1 # TaskManager必须同步挂载插件目录,否则会报类找不到错误 podTemplate: spec: initContainers: - name: fetch-azure-plugin image: cirrusci/wget volumeMounts: - mountPath: /opt/flink/plugins/azure-fs-hadoop name: flink-azure-plugin command: - sh - -c - | # 下载对应版本的4个Azure插件依赖包到挂载目录 wget -O flink-azure-fs-hadoop-1.15.0.jar <flink-azure插件包内网可访问下载地址> wget -O hadoop-azure-3.3.4.jar <hadoop-azure依赖包内网可访问下载地址> wget -O azure-storage-blob-12.21.0.jar <azure blob sdk内网可访问下载地址> wget -O azure-core-1.34.0.jar <azure core sdk内网可访问下载地址> containers: - name: flink-main-container volumeMounts: - mountPath: /opt/flink/plugins/azure-fs-hadoop name: flink-azure-plugin
后续配置注意
插件部署完成后,需要在flinkConfiguration段补充Azure Blob的认证配置,根据你实际使用的认证方式填写对应参数即可:
- 存储账户Key认证:添加配置项
fs.azure.account.key.<你的存储账户名>.blob.core.windows.net: <你的存储账户Key> - Azure托管身份认证:添加配置项
fs.azure.account.auth.type: ManagedIdentity
注意:不要只给JobManager配置插件挂载,TaskManager同样需要访问Azure文件系统,缺省插件包会直接导致任务运行失败。
内容的提问来源于stack exchange,提问作者Jakub Socha
相关产品推荐
相关产品推荐

