EKS上Jenkins DIND Agent挂载EFS失败求助
问题排查与解决方案
一、botocore依赖缺失问题修复
虽然你提到镜像已安装boto3和botocore,但报错提示依赖缺失,大概率是镜像构建过程存在问题,按以下步骤验证修复:
- 检查Dockerfile安装命令:
针对jenkins/jnlp-agent-docker(Debian/Ubuntu基础镜像),确保命令正确:
针对RUN apt-get update && apt-get install -y python3 python3-pip \ && pip3 install --no-cache-dir boto3 botocoredocker:27.0.3-dind(Alpine基础镜像),注意Alpine的包管理前缀:
避免使用静默安装参数(如RUN apk add --no-cache python3 py3-pip \ && pip3 install --no-cache-dir boto3 botocore-q),以便排查包下载失败问题。 - 本地验证镜像依赖:
运行镜像进入容器,检查依赖是否存在:
若无法找到,重新构建镜像并确认安装命令执行无报错。docker run -it --rm <你的DIND镜像名> /bin/bash pip3 list | grep botocore
二、EFS DNS解析失败问题排查
Pod卡在ContainerCreating阶段且EFS DNS解析失败,从以下维度排查:
- 确认EFS CSI驱动部署状态:
检查驱动Pod是否正常运行:
若未部署,通过kubectl部署AWS官方EFS CSI驱动manifest,同时确保EKS节点拥有EFS访问的IAM权限。kubectl get pods -n kube-system -l app.kubernetes.io/name=aws-efs-csi-driver - 检查VPC与子网DNS配置:
确保EFS挂载目标与EKS节点在同一VPC,且挂载目标所在子网已启用DNS解析(VPC控制台子网配置中勾选对应选项)。 - 配置Pod DNS策略:
在Jenkins代理Pod模板中,指定DNS策略为ClusterFirst,避免自定义策略导致解析异常:spec: dnsPolicy: ClusterFirst - 手动验证botocore获取挂载IP:
依赖正常的情况下,在容器内执行以下代码测试:
若能输出挂载IP,说明问题出在CSI驱动挂载逻辑;若仍报错,回到镜像依赖排查环节。import botocore.session session = botocore.session.get_session() efs_client = session.create_client('efs') mounts = efs_client.describe_mount_targets(FileSystemId='<你的EFS ID>') print([mt['IpAddress'] for mt in mounts['MountTargets']])
三、Jenkins DIND代理额外配置要点
- 启用特权模式:
DIND容器需特权模式才能正常运行,在Helm Values中配置:agent: podTemplates: dind-agent: containers: - name: docker-dind image: <你的DIND镜像名> privileged: true - 检查EFS PVC存储类:
确保PVC使用EFS专用存储类,存储类配置示例:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: efs-storage-class provisioner: efs.csi.aws.com parameters: provisioningMode: efs-ap fileSystemId: <你的EFS ID> directoryPerms: "755"
内容的提问来源于stack exchange,提问作者Doug
相关产品推荐
相关产品推荐

