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 名称固定前缀、节点权限等),我会针对性完善。

相关推荐
阿正的梦工坊几秒前
Git Rebase 是什么?为什么需要它?
人工智能·git
ASEpochs1 小时前
Vsocde中‘sh’不是内部或外部命令,也不是可运行的程序或批量处理文件--已解决
git·vscode·bash
coding消烦员2 小时前
在 Windows 内网搭建 Git 仓库:共享普通仓库 vs 中心 bare 仓库
windows·git
李@十一₂⁰2 小时前
git多分支管理
大数据·git·elasticsearch
爱写代码的派大星3 小时前
git 拉取和合并
git
Kp独立开发6 小时前
开源项目二次开发最佳实践:Fork + 分支隔离与同步
git·开源
Galaxy~5679 小时前
Git常见命令及用法
大数据·git·elasticsearch
MindCareers10 小时前
Beta Sprint Day 5-6: Android Development Improvement + UI Fixes
android·c++·git·sql·ui·visual studio·sprint
TTGGGFF10 小时前
报错解决:git clone git@github.com: Permission denied (publickey)权限拒绝问题
git·github
吻等离子12 小时前
Git版本管理:掌握Git Checkout 回溯备份与标签管理
git