问题描述
在K3s集群中运行了一个包括1个主节点和2个工作节点的集群,同时在同一主机(主节点)上运行了一个Docker容器中的Traefik反向代理。Traefik容器实际上已经在80端口和443端口上为不同的子域名提供了TLS的反向代理功能,这部分已经成功运行。用户希望也能够通过SSH连接(仅限于一个子域名),但是迄今为止尝试没有成功。
用户已经采取了以下措施:
1. 开放了22端口,通过UFW允许访问(在Ubuntu 22.04上)。
2. 针对Traefik设置了以下规则(部分内容摘录):
tcp:
routers:
giti-ssh:
entrypoints:
- "https" # 也尝试过使用ssh entrypoint
rule: "HostSNI(`*`)"
tls: {}
service: giti-ssh
services:
giti-ssh:
loadBalancer:
servers:
- address: "10.42.0.232:22"
- 使用Flannel和MetalLB在K3s中运行,外部IP范围是10.42.0.230-250。
- 通过”ip a”命令查看网络接口的信息(部分内容摘录)。
然而,用户尝试连接容器内的SSH服务时遇到问题,用户怀疑这与Traefik的HostSNI设置有关,或者可能涉及iptables的配置问题。
用户的容器已经设置好,用于SSH的服务正在监听22端口,类型为LoadBalancer。用户可以通过Traefik反向代理从另一个服务和IP连接到该容器的443端口,但在22端口上遇到问题,用户认为这与Traefik的HostSNI设置或者iptables配置有关。
相关版本:
– Docker: 最新版本(仅用于测试,计划使用带标签的版本)
– Traefik: 最新版本(仅用于测试,计划使用带标签的版本)
– K3s: v1.24.6+k3s1
用户还尝试连接1932/udp端口(用于Minecraft),因此他认为在非http(s)端口上运行Traefik可能更加复杂。
用户希望能够得到一些关于如何实现此目标的提示和建议。
解决方案
请注意以下操作可能因版本差异或具体实现而异。建议在操作之前做好备份。
方案1
在这种情况下,我们需要在Traefik反向代理上设置适当的规则,以便能够将SSH流量转发到指定的K3s容器上。此外,我们需要确保Traefik监听并处理SSH流量。以下是一种可能的解决方案步骤:
-
在Traefik的配置中,我们需要将SSH流量的入口点添加到规则中。我们可以使用
tcp
入口点并指定适当的规则。请确保规则匹配所需的子域名。 -
配置Traefik的服务以将SSH流量转发到K3s容器。这需要确保服务的配置正确,并且服务器的地址和端口与容器的SSH服务一致。
-
确保防火墙允许SSH流量通过,这已经在UFW中开放了22端口,但确保没有其他防火墙规则阻止SSH流量。
-
验证Traefik的日志,以确保它正在正确地处理SSH流量并将其转发到指定的K3s容器。
以下是一个示例的Traefik配置(部分内容摘录):
# 配置TCP入口点
tcp:
routers:
ssh-router:
entrypoints:
- "ssh"
rule: "HostSNI(`ssh.example.com`)" # 使用所需的子域名
tls: {} # 可以留空
service: ssh-service
# 配置SSH服务
services:
ssh-service:
loadBalancer:
servers:
- address: "10.42.0.232:22" # 将此地址和端口设置为目标容器的SSH服务
请注意,上述配置需要根据你的具体情况进行调整。确保将子域名、容器地址和端口等配置与你的环境匹配。
方案2
另一种方法是考虑不经过Traefik,直接在K3s中设置SSH的端口转发。这种方法不需要涉及Traefik的TCP规则配置。以下是一个可能的解决方案步骤:
-
在K3s中创建一个Service,将SSH端口(例如22)转发到需要接收SSH连接的容器。
-
通过K3s的Service将SSH流量直接转发到容器。
-
确保防火墙允许SSH流量通过,确保UFW没有阻止SSH流量。
-
验证通过K3s的Service是否可以正确将SSH流量转发到容器。
这种方法可以避免Traefik的TCP规则配置,但需要确保K3s的Service配置正确。
以下是一个示例的K3s Service配置(部分内容摘录):
apiVersion: v1
kind: Service
metadata:
name: ssh-service
spec:
ports:
- protocol: TCP
port: 22 # 指定要转发的端口
targetPort: 22 # 指定容器的SSH端口
selector:
app: your_ssh_container # 替换为你的容器的标签
请注意,上述配置需要根据你的具体情况进行调整。确保端口、容