You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GKE中atmoz/sftp部署无法使用持久化主机密钥求助

解决GKE上atmoz/sftp主机密钥持久化与容器启动问题

看起来你遇到了两个核心问题:主机密钥无法持久化导致每次重启告警,以及自定义command后容器进入CrashLoopBackOff。我来一步步帮你解决:


一、主机密钥持久化的正确姿势

你之前直接挂载整个/etc/ssh目录是错误的——atmoz/sftp镜像默认的sshd_config和其他SSH配置文件都在这个目录下,用ConfigMap覆盖整个目录会丢失原有配置,同时镜像启动脚本会检查密钥文件是否存在,出现覆盖提示后因为无人交互卡住,最终导致启动失败。

正确做法:单独挂载主机密钥文件

  1. 修正ConfigMap:把需要持久化的主机密钥(比如RSA、ED25519)单独存储,确保密钥格式完整(包含首尾标记和正确换行):
apiVersion: v1
data:
  ssh_host_rsa_key: |
    -----BEGIN RSA PRIVATE KEY-----
    <你的完整RSA私钥内容,保留所有换行>
    -----END RSA PRIVATE KEY-----
  ssh_host_ed25519_key: |
    -----BEGIN OPENSSH PRIVATE KEY-----
    <你的完整ED25519私钥内容>
    -----END OPENSSH PRIVATE KEY-----
kind: ConfigMap
metadata:
  name: ssh-host-keys
  namespace: default
  1. 修改Deployment的挂载配置:不要挂载整个/etc/ssh,而是将单个密钥文件挂载到对应路径,同时设置严格的权限(SSH要求密钥权限必须是0600):
# 在spec.template.spec.volumes下添加:
- configMap:
    name: ssh-host-keys
    defaultMode: 0600  # 关键!必须设置为600,否则SSH会拒绝使用密钥
  name: ssh-host-keys

# 在container.volumeMounts下添加:
- mountPath: /etc/ssh/ssh_host_rsa_key
  name: ssh-host-keys
  subPath: ssh_host_rsa_key  # 指定挂载ConfigMap中的单个文件
- mountPath: /etc/ssh/ssh_host_ed25519_key
  name: ssh-host-keys
  subPath: ssh_host_ed25519_key

这样配置后,atmoz/sftp启动时会检测到已存在的主机密钥,不会重新生成,解决每次重启密钥变更的问题。


二、关于echo命令导致CrashLoopBackOff的问题

这是正常现象:atmoz/sftp镜像默认的启动命令是启动sshd守护进程(长期运行),当你用command: ["echo", "hi"]覆盖后,容器执行完echo就立刻退出了。而Kubernetes的restartPolicy: Always会不断重启退出的容器,最终进入CrashLoopBackOff状态。

如果要测试容器环境是否正常,建议用长期运行的命令替代,比如:

command: ["sleep", "infinity"]

这样容器会一直运行,你可以进入容器排查问题:kubectl exec -it <pod-name> -- /bin/bash


三、额外排查建议

如果配置后还是启动失败,一定要查看Pod日志找具体原因:

kubectl logs <你的sftp-pod-name>

常见问题包括:

  • 密钥格式错误(比如ConfigMap中密钥缺少换行或首尾标记)
  • 密钥权限不正确(没有设置defaultMode: 0600)
  • 持久卷挂载权限问题(检查fsGroup是否正确)

内容的提问来源于stack exchange,提问作者Idan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:44:15