in argocd ‘/tmp/_argocd-repo/../.git/index.lock‘: No space left on

Unable to load data: Failed to checkout FETCH_HEAD:
git checkout --force FETCH_HEAD failed exit status 128: fatal: Unable to create

'/tmp/_argocd-repo/637eecbf-7342-4ad9-a02c-aeabf9a667f5/.git/index.lock': No space left on device

================================

问题核心定位

报错 No space left on device 是关键 → ArgoCD 组件(通常是 argocd-repo-server)所在节点的磁盘空间耗尽 ,导致 Git 拉取代码时无法创建 .git/index.lock 临时文件,最终 checkout 失败。

分步解决方案

1. 紧急排查:确认磁盘空间占用(定位问题节点)

首先找到 argocd-repo-server Pod 所在节点,并检查节点磁盘使用情况:

bash 复制代码
# 1. 找到argocd-repo-server的Pod名称和所在节点
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-repo-server -o wide

# 示例输出(重点看NODE列):
# NAME                            READY   STATUS    RESTARTS   AGE   IP          NODE           NOMINATED NODE   READINESS GATES
# argocd-repo-server-7f98d7689c-9x8zl   1/1     Running   0          1d    10.244.2.3   node-01         <none>           <none>

# 2. 登录节点(或通过kubectl exec直接检查Pod挂载的磁盘)
# 方式1:登录节点检查磁盘
ssh node-01
df -h  # 查看所有磁盘挂载点的使用率(重点看 / 或 /tmp 分区)

# 方式2:直接在argocd-repo-server Pod内检查磁盘
kubectl exec -n argocd argocd-repo-server-7f98d7689c-9x8zl -- df -h

关键排查点

  • 节点的根分区(/)或 /tmp 分区使用率 ≥ 95%;
  • ArgoCD 的临时目录(/tmp/_argocd-repo/)所在分区满了。
2. 紧急释放空间(临时解决)
(1)清理 Pod 内临时文件(ArgoCD 缓存)

ArgoCD repo-server 会缓存 Git 仓库数据,清理缓存可快速释放空间:

bash 复制代码
# 进入argocd-repo-server Pod
kubectl exec -n argocd -it argocd-repo-server-7f98d7689c-9x8zl -- /bin/sh

# 清理临时仓库目录(核心)
rm -rf /tmp/_argocd-repo/*

# 清理其他临时文件
rm -rf /tmp/*
exit
(2)清理节点上的无用文件(长期)

登录节点后执行以下操作释放空间:

bash 复制代码
# 1. 清理docker/containerd镜像(最有效)
docker system prune -a -f  # 清理未使用的镜像、容器、卷(containerd用 ctr images prune -a -f)

# 2. 清理K8s无用Pod(已终止的)
kubectl delete pods --all-namespaces --field-selector=status.phase=Failed
kubectl delete pods --all-namespaces --field-selector=status.phase=Succeeded

# 3. 清理节点日志(/var/log 目录)
find /var/log -type f -size +100M -delete  # 删除大于100M的日志文件
journalctl --vacuum-size=1G  # 清理systemd日志

# 4. 检查大文件(定位占用空间的文件)
du -sh /var/lib/docker/*  # 查看docker目录大小
find / -type f -size +1G -exec ls -lh {} \;  # 查找大于1G的文件
3. 长期解决方案(避免再次发生)
(1)给 ArgoCD Repo Server 配置临时目录持久化/扩容

修改 argocd-repo-server 的 Deployment,为 /tmp 目录挂载临时存储卷,并设置大小限制:

yaml 复制代码
# 编辑argocd-repo-server的Deployment
kubectl edit deployment argocd-repo-server -n argocd

spec.template.spec.containers[0] 下添加 volumeMounts,并在 spec.template.spec 下添加 volumes

yaml 复制代码
spec:
  template:
    spec:
      containers:
      - name: argocd-repo-server
        # 原有配置...
        volumeMounts:
        - name: tmp-dir
          mountPath: /tmp
          # 设置目录大小限制(可选)
          resources:
            limits:
              ephemeral-storage: 10Gi  # 限制临时存储使用10Gi
            requests:
              ephemeral-storage: 5Gi
      volumes:
      - name: tmp-dir
        emptyDir:
          medium: Memory  # 用内存作为临时目录(更快,也可改为emptyDir: {}使用磁盘)
          sizeLimit: 5Gi  # 限制临时目录大小
(2)配置 ArgoCD 仓库缓存自动清理

ArgoCD 支持配置仓库缓存的 TTL(过期时间),修改 argocd-cm ConfigMap:

bash 复制代码
kubectl edit configmap argocd-cm -n argocd

添加以下配置,让缓存自动过期清理:

yaml 复制代码
data:
  # 仓库缓存TTL:1小时(可根据需求调整,如24h)
  repo.cache.ttl: 1h
  # 禁用不必要的缓存(可选)
  repo.cache.enabled: "true"

修改后重启 argocd-repo-server

bash 复制代码
kubectl rollout restart deployment argocd-repo-server -n argocd
(3)监控节点磁盘使用率(提前预警)

配置 Prometheus + Grafana 监控节点磁盘使用率,设置告警阈值(如使用率≥85%时告警):

  • 监控指标:node_filesystem_usage_bytes / node_filesystem_size_bytes

  • 告警规则示例:

    yaml 复制代码
    groups:
    - name: node-disk-alert
      rules:
      - alert: NodeDiskFull
        expr: 100 * (node_filesystem_usage_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "节点 {{ $labels.node }} 磁盘使用率过高"
          description: "节点 {{ $labels.node }} 的 / 分区使用率已达 {{ $value | humanizePercentage }},请及时清理空间。"
4. 验证修复效果
bash 复制代码
# 重启argocd-repo-server(确保配置生效)
kubectl rollout restart deployment argocd-repo-server -n argocd

# 检查Pod状态
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-repo-server

# 重新触发ArgoCD同步(验证Git checkout是否正常)
argocd app sync <your-app-name>  # 或在UI上手动同步

常见问题补充

  • 如果是ArgoCD部署在PVC上导致空间满
    检查 ArgoCD 使用的 PVC(如 argocd-repo-server 的数据卷),执行 kubectl exec -n argocd argocd-repo-server-xxx -- df -h /data,若 /data 分区满,需扩容 PVC:

    bash 复制代码
    kubectl patch pvc <pvc-name> -n argocd -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
  • Git checkout 仍失败
    确认清理完空间后,删除 ArgoCD 对应的 repo 缓存目录(/tmp/_argocd-repo/<repo-id>),再重新同步。

========================================

d-wx------. 4 argocd argocd 4096 Nov 4 05:06 _argocd-repo

$ du -hs

du: cannot read directory './_argocd-repo': Permission denied

问题核心

当前 du -hs权限拒绝 ,是因为 _argocd-repo 目录的权限为 d-wx------(仅拥有者有写入+执行权限,无读取权限),且你当前执行命令的用户不是 argocd(目录属主),导致无法遍历目录统计大小。

解决方案(按优先级排序)

1. 以 argocd 用户身份执行 du(推荐,无风险)

利用 kubectl exec 直接切换到 argocd 用户(Pod 内默认属主),或用 sudo(节点上)读取目录:

bash 复制代码
# 场景1:在argocd-repo-server Pod内操作(推荐)
kubectl exec -n argocd -it argocd-repo-server-<pod后缀> -- su - argocd -c "du -hs /tmp/_argocd-repo"

# 场景2:如果在节点的/tmp目录下(需节点有sudo权限)
sudo -u argocd du -hs ./argocd-repo
2. 临时修改目录权限(应急清理,清理后恢复)

若无法切换用户,可临时添加目录的读取权限,统计/清理后再恢复(避免权限漏洞):

bash 复制代码
# 1. 临时添加读权限(仅目录所有者可执行)
kubectl exec -n argocd -it argocd-repo-server-<pod后缀> -- chmod u+r /tmp/_argocd-repo

# 2. 统计大小
kubectl exec -n argocd -it argocd-repo-server-<pod后缀> -- du -hs /tmp/_argocd-repo

# 3. 清理目录内文件(核心:释放空间)
kubectl exec -n argocd -it argocd-repo-server-<pod后缀> -- rm -rf /tmp/_argocd-repo/*

# 4. 恢复原权限(关键:避免安全风险)
kubectl exec -n argocd -it argocd-repo-server-<pod后缀> -- chmod u-r /tmp/_argocd-repo
3. 直接强制删除目录(终极应急,无权限也能删)

若仅需清理空间,无需统计大小,可直接用 root 用户强制删除目录(Pod 内 kubectl exec 默认是 root):

bash 复制代码
# Pod内root用户直接删除缓存目录(会自动重建,无影响)
kubectl exec -n argocd -it argocd-repo-server-<pod后缀> -- rm -rf /tmp/_argocd-repo/*

关键说明

  1. 权限背景_argocd-repo 目录权限 d-wx------ 是 ArgoCD 的安全设计(仅允许写入/执行,禁止读取),避免非授权用户查看仓库缓存;

  2. 清理无风险_argocd-repo 是临时缓存目录,删除后 ArgoCD 会重新拉取 Git 仓库数据,不会影响核心配置;

  3. 验证清理效果

    bash 复制代码
    # 清理后检查磁盘空间
    kubectl exec -n argocd -it argocd-repo-server-<pod后缀> -- df -h /tmp

长期优化:避免重复权限问题

在之前配置的 argocd-repo-server Deployment 中,给 /tmp 挂载 emptyDir 卷时,可指定目录属主(确保权限可控):

yaml 复制代码
spec:
  template:
    spec:
      securityContext:
        fsGroup: 999  # argocd用户的gid(默认999)
      containers:
      - name: argocd-repo-server
        securityContext:
          runAsUser: 999  # argocd用户的uid(默认999)
          runAsGroup: 999
        volumeMounts:
        - name: tmp-dir
          mountPath: /tmp
          subPath: _argocd-repo  # 仅挂载缓存子目录
      volumes:
      - name: tmp-dir
        emptyDir:
          sizeLimit: 5Gi

如果需要我帮你编写一键清理 ArgoCD 缓存且自动恢复权限的脚本,可以补充完整的执行环境(如 Pod 名称固定前缀、节点权限等),我会针对性完善。

相关推荐
尔嵘4 小时前
git操作
大数据·git·elasticsearch
大柏怎么被偷了6 小时前
【Git】企业级开发模型
git
Garfield20056 小时前
Git 分支拓扑实践
git·拓扑
DKNG6 小时前
【Windows Host】 hosts配置增加访问github流畅度
人工智能·git·github
一个很帅的帅哥9 小时前
git命令大全
大数据·git·elasticsearch
凯子坚持 c9 小时前
Git 远程仓库操作与深度进阶指南
git
勇敢牛牛_9 小时前
RustRover 2025.3 在WSL中GIT操作十分缓慢的问题
git·rust·rustrover
编程小白gogogo11 小时前
创建git仓库并推送苍穹外卖初始项目
git
cat_milk11 小时前
【git】git的基础使用二
git