如何在Kubernetes集群部署/使用sslh?求集成Ingress Controller方案
在Kubernetes集群中部署并集成sslh与Nginx Ingress Controller的方案
我之前刚好折腾过这个场景,分享下验证可行的实操方案,既能实现80端口分流SSH和HTTP流量,又能和Nginx Ingress无缝集成。
一、基础部署:用DaemonSet运行sslh
因为sslh需要监听节点的外部端口(这里是80),用DaemonSet部署最合适——每个节点都会运行一个sslh实例,确保外部流量不管打到哪个节点都能被处理。
示例DaemonSet配置
apiVersion: apps/v1 kind: DaemonSet metadata: name: sslh namespace: kube-system spec: selector: matchLabels: app: sslh template: metadata: labels: app: sslh spec: hostNetwork: true # 直接使用节点网络,方便监听节点80端口 containers: - name: sslh image: linuxserver/sslh:latest # 这个镜像维护得比较好,参数配置友好 args: - "--listen" - "0.0.0.0:80" # 监听节点的80端口 - "--ssh" - "ssh-service.default.svc.cluster.local:22" # 转发SSH流量到集群内的SSH服务(替换成你的服务地址) - "--http" - "nginx-ingress-controller.ingress-nginx.svc.cluster.local:80" # 转发HTTP流量到Nginx Ingress的服务 - "--foreground" # 让容器在前台运行,避免退出 securityContext: privileged: true # 需要特权模式才能处理流量转发
关键配置说明
- hostNetwork: true:让sslh直接使用节点的网络栈,这样能直接监听节点的80端口,不用额外配置hostPort。
- 后端服务地址:
ssh-service.default.svc.cluster.local:22:替换成你集群中提供SSH服务的Service地址(如果是要连接节点本身的SSH,这里可以填127.0.0.1:22)。nginx-ingress-controller.ingress-nginx.svc.cluster.local:80:这个是Nginx Ingress Controller的Service默认地址,你可以通过kubectl get svc -n ingress-nginx确认具体地址和端口。
二、集成Nginx Ingress Controller的核心逻辑
这套方案的核心是流量分层:
- 外部流量先打到节点的80端口,被sslh接收;
- sslh通过协议识别,把SSH流量转发到集群内的SSH服务,把HTTP流量转发到Nginx Ingress Controller;
- Nginx Ingress继续按原有规则处理HTTP/HTTPS请求,完全不影响原有Ingress配置。
三、验证功能是否正常
- 验证HTTP流量:用
curl http://<节点IP>,应该能返回你Ingress配置的正常HTTP响应; - 验证SSH流量:用
ssh <用户名>@<节点IP> -p 80,应该能成功连接到你的SSH服务(如果是节点本身的SSH,就是节点的用户)。
踩过的小坑提醒
- 如果节点本身的80端口已经被其他服务占用(比如直接运行的Nginx),需要先停止该服务,否则sslh启动会失败;
- 如果你不想用
hostNetwork,可以改用hostPort: 80,但要注意节点端口冲突的问题; - 部分云厂商的节点安全组需要开放80端口的TCP流量,否则外部无法访问。
内容的提问来源于stack exchange,提问作者JoaoCC
相关产品推荐
相关产品推荐

