EKS集群中Trivy无法扫描镜像问题求助
根据错误日志,核心问题集中在containerd套接字无法访问和ECR镜像拉取未授权两个方面,以下是针对性的修复步骤:
一、修复containerd套接字访问问题
错误提示containerd socket not found: /run/containerd/containerd.sock,即使挂载了主机套接字,仍需确保挂载配置、权限及SELinux上下文匹配Bottlerocket OS的环境:
1. 完善Helm Chart的套接字挂载配置
在Trivy Operator的Helm values文件中添加主机套接字的挂载规则:
operator: extraVolumes: - name: containerd-sock hostPath: path: /run/containerd/containerd.sock type: Socket extraVolumeMounts: - name: containerd-sock mountPath: /run/containerd/containerd.sock readOnly: true
2. 调整SELinux上下文配置
当前使用的control_t类型无法匹配containerd套接字的SELinux标签,需修改为container_runtime_t:
securityContext: seLinuxOptions: user: system_u role: system_r type: container_runtime_t level: s0-s0:c0.c1023
可先在Bottlerocket节点执行ls -Z /run/containerd/containerd.sock,确认套接字的SELinux标签,确保配置的type字段与之一致。
3. 验证容器内套接字可用性
临时启动调试Pod,确认容器内可正常访问挂载的套接字:
kubectl run -it --rm debug --image=alpine --overrides='{"spec":{"containers":[{"name":"debug","image":"alpine","command":["sh"],"volumeMounts":[{"name":"containerd-sock","mountPath":"/run/containerd/containerd.sock"}]}],"volumes":[{"name":"containerd-sock","hostPath":{"path":"/run/containerd/containerd.sock","type":"Socket"}}]}}'
进入容器后执行stat /run/containerd/containerd.sock,确认文件存在且可访问。
二、修复ECR镜像拉取401未授权问题
针对AWS GovCloud ECR的拉取权限,需为Trivy Operator的ServiceAccount配置合法的访问凭证:
1. 通过IRSA绑定IAM角色(推荐)
若集群已启用IRSA,创建包含ECR拉取权限的IAM Policy:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability", "ecr:GetAuthorizationToken" ], "Resource": "*" } ] }
将该Policy绑定到Trivy Operator的ServiceAccount,并在Helm values中配置IRSA注解:
operator: serviceAccount: annotations: eks.amazonaws.com/role-arn: arn:aws-us-gov:iam::023620263533:role/trivy-operator-ecr-access
2. 挂载ECR凭证Secret(无IRSA时使用)
生成ECR临时凭证并创建Kubernetes Secret:
aws ecr get-login-password --region us-gov-east-1 | kubectl create secret docker-registry ecr-secret --docker-server=023620263533.dkr.ecr.us-gov-east-1.amazonaws.com --docker-username=AWS --docker-password=-
在Helm values中配置使用该Secret:
trivy: imagePullSecrets: - name: ecr-secret
三、验证修复效果
重新部署Trivy Operator:
helm upgrade --install trivy-operator aquasecurity/trivy-operator --namespace trivy-system --version 0.6.0-rc3 --values your-values.yaml
检查扫描Job状态:
kubectl get jobs -n trivy-system
确认VulnerabilityReports CRD生成:
kubectl get vulnerabilityreports
内容的提问来源于stack exchange,提问作者user1314147

