封面

Kubernetes中通过HTTP代理克隆GitHub SSH仓库的解决方案

问题描述

今天遇到个问题,在Kubernetes环境中使用 Helm Chart 部署Odoo应用时,Init Containers在克隆GitHub仓库时遇到SSH连接超时问题:

ssh: connect to host github.com port 22: Operation timed out

fatal: Could not read from remote repository.

经过逐步排查和测试,我们发现问题是由于SSH代理配置不当导致的。http_proxy的环境变量或者git config设置的代理都只支持http和https,对git clone git@xxxxx是不生效的。想要让后者生效需要做ssh的代理。

解决方案

我选择了 ncat 来解决这个问题,ncat 是经典网络工具 Netcat(网络猫)的现代化升级版本,属于Nmap 项目的一部分,它是一款强大的命令行工具,可以用于在网络上进行数据读写、连接、调试和端口扫描等操作,支持TCP 和UDP 协议,并且增加了SSL 加密、代理连接等新功能。

1. 安装ncat工具

在所有需要通过SSH克隆GitHub仓库的Init Containers中安装ncat (alpine需要安装nmap-ncat而非ncat):

apk add --no-cache nmap-ncat netcat-openbsd openssh-client

2. 配置SSH代理

修改SSH配置文件,使用GitHub的HTTPS端口443并通过ncat建立代理连接:

# 在 ~/.ssh/config 中添加配置

Host github.com

HostName ssh.github.com

Port 443

StrictHostKeyChecking no

ProxyCommand /usr/bin/ncat --proxy-type http --proxy <ip>:<port> --proxy-auth username:password %h %p

关键配置说明:

HostName ssh.github.com: 使用GitHub的SSH代理服务器

Port 443: 使用HTTPS端口而非标准SSH端口22

ProxyCommand: 指定通过ncat建立代理连接

--proxy-type http: 指定代理类型为HTTP

--proxy <ip>:<port>: 指定代理服务器地址和端口

--proxy-auth username:password: 提供代理认证信息

3. Kubernetes部署配置

在 Helm Chart 的Deployment配置中,确保所有Git克隆相关的Init Containers都包含以下配置:

initContainers:

- name: setup-ssh-for-git

image: alpine/git

command: ['sh', '-c']

args:

- |

# 安装ncat工具

apk add --no-cache nmap-ncat netcat-openbsd openssh-client

# 配置SSH代理

echo -e "Host github.com
HostName ssh.github.com
Port 443
StrictHostKeyChecking no
ProxyCommand /usr/bin/ncat --proxy-type http --proxy <ip>:<port> --proxy-auth username:password %h %p" >> /root/.ssh/config

# 设置SSH密钥权限

chmod 600 /root/.ssh/id_rsa

chmod 644 /root/.ssh/known_hosts


通过HTTPS端口443连接,绕过防火墙对SSH端口22的限制

发布评论
全部评论(5)
最新
最早
avatarauth
置顶
花糕
821
作者
#1086051

下次改编辑器,我一定加上代码块功能

img
熙林
920
直接支持markdown吧
img
Sakurazuki
6
这个特别支持[stick-3]
显示全部 2 条回复>>
加载中...