GKE中atmoz/sftp部署无法使用持久化主机密钥求助
解决GKE上atmoz/sftp主机密钥持久化与容器启动问题
看起来你遇到了两个核心问题:主机密钥无法持久化导致每次重启告警,以及自定义command后容器进入CrashLoopBackOff。我来一步步帮你解决:
一、主机密钥持久化的正确姿势
你之前直接挂载整个/etc/ssh目录是错误的——atmoz/sftp镜像默认的sshd_config和其他SSH配置文件都在这个目录下,用ConfigMap覆盖整个目录会丢失原有配置,同时镜像启动脚本会检查密钥文件是否存在,出现覆盖提示后因为无人交互卡住,最终导致启动失败。
正确做法:单独挂载主机密钥文件
- 修正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
- 修改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
相关产品推荐
相关产品推荐

