混合集群搭建:私服+公有云服务器

162 阅读7分钟

背景: 1.手上只有一个 2 核 4G 的云服务器,之前搭建单节点集群,内存差点就不够了,资金有限,暂时不能扩容(非新用户云服务器太贵了!)。2.此外我还有一个台式主机,性能还不错:6 核 16G。3.体验到了 kubenetes 集群运维的方便之处,想着用两个机器搭建一个集群。

搭建思路

  1. 台式主机无公网 ip,无法直接从外部访问
  2. 因而搭建的集群不在一个局域网(一个局域网下集群比较好搭建)
  3. 搭建的集群甚至不算是混合公有云集群(混合云集群比局域网集群难度上一个台阶,但是也有教程1,可以通过公网 ip 相互通信)

集群 server 节点和 agent 节点之间需要多个端口通信,这里我们建立 socket 隧道使得公网机器能够访问本地设备,即建立 socket5 隧道:公网设备可以通过访问内网(通过访问本地设备的局域网 ip)。但是这里本地设备不能通过 socket5 局域网 ip 访问公网,因此,我们使用公网 ip 访问。具体通信过程如下图所示。

hybrid_cluster.svg

探索

本节讲集群搭建过程中用到的诸如 k3s、k9s、docker 等工具背景,如果您已有相关背景,可以直接跳到下一节。

集群

Kubernetes(通常简称为 K8s)是一个用于自动部署、扩展和管理容器化应用程序的开源平台。在 Kubernetes 生态系统中,有一些轻量级的实现可以帮助节省资源。

k3s

k3s2 是一个轻量级 Kubernetes 发行版,专注于资源和性能优化。它的设计目标是简化安装和维护,并尽可能减少运行 Kubernetes 集群所需的资源。k3s 的二进制文件很小,运行所需的内存和 CPU 也相对较少。

k3s.svg

k9s

k9s3 是一个基于命令行的 Kubernetes 集群管理工具,它提供了一个交互式的界面,用于在终端中直观地管理和监控 Kubernetes 集群。k9s 为管理员和开发人员提供了一个方便快捷的方式来浏览、筛选和操作 Kubernetes 资源。

k9s.png

istio 服务网格

Istio4 是一个开源的服务网格(Service Mesh)平台,它提供了一套用于连接、保护、监控和维护微服务的工具和技术。服务网格是一个用于处理服务之间通信的基础设施层,它可以自动化服务之间的通信,提供了诸如负载均衡、故障恢复、安全性等功能。

service-mesh.svg

WSL

WSL 2(Windows Subsystem for Linux 2)是在 Windows 10 上的一个功能,允许用户在 Windows 系统上运行 Linux 发行版。与之前的 WSL 1 不同,WSL 2 使用了真正的 Linux 内核,这带来了更好的性能和兼容性。

Docker

Docker 是一个开源平台,用于构建、部署和运行容器化应用程序。它允许开发人员将应用程序及其依赖关系打包到一个称为容器的独立单元中,然后可以在任何支持 Docker 的环境中运行。

现在,您可以在 Windows 中结合使用 WSL 2 和 Docker,以便在本地开发环境中运行容器化应用程序,而无需使用虚拟机等额外的虚拟化技术。

nps

nps5 是一款轻量级、高性能、功能强大的内网穿透代理服务器。支持 tcp、udp、socks5、http 等几乎所有流量转发,可用来访问内网网站、本地支付接口调试、ssh 访问、远程桌面,内网 dns 解析、内网 socks5 代理等等,并带有功能强大的 web 管理端。

前置条件

本地设备

本文中,本地设备使用 windows+WSL2+Docker, 您也可以使用别的平台。

  1. windows
  2. WSL2
  3. Docker

云服务器

本文中,云服务器使用 ubuntu20.04,您也可以使用别的系统平台。

  1. ubuntu

步骤

nps 代理安装(之后使用 socket5)

  1. 进入这里下载对应的文件:github.com/ehang-io/np… 包括 server 和 client 共两个文件。下载完后,两个文件分别放在本地(client 文件),云服务器(server 文件)。

  2. 在 server 端,解压文件并安装

tar -xzvf linux_amd64_server.tar.gz
sudo ./nps install
  1. 云服务器端,通过公网 ip+8080 访问 nps 网页端,登录(默认用户名密码为 admin,123)

nps_web.png

  1. 云服务器端,添加新的客户端(之后本地设备使用),如图所示,添加备注,配置参数。

nps_add_client.png

  1. 云服务器端,刷新页面可以看到新的客户端列表,copy 下面的客户端命令,之后本地设备使用

nps_add_client_cmd.png

  1. 本地设备端,解压 client 文件,使用管理员打开 cmd 工具,并跳转到文件所在目录,执行上面 copy 命令(因为是 windows,前面./npc替换为./npc.exe install,替换下面**为你 copy 的值。
./npc.exe install -server=***:8024 -vkey=****** -type=tcp
./npc.exe start
  1. 云服务器端,刷新页面,查看刚刚端客户端列表,是否显示设备在线,若显示在线则安装成功。否则排查下问题,比如云服务器对应端口是否开放。

  2. 本地设备端,将 nps 改成开机启动,具体的,找到计算机管理,找到 nps 客户端,选中

nps_client_win.png

  1. 本地设备端,选中恢复按钮,失败都选为重启服务。 nps_client_win_long.png

  2. 云服务器端,添加 socket5 连接,其中端口是服务的端口,比如 8025。

nps_socket5.png

  1. 刷新查看 socket5 是否在线

nps_socket_list.png

  1. 测试环节,测试云服务是否可以访问本地服。本地设备端,启动一个服务(比如 flask demo:python run.py,这里 flask 启动要设为"0.0.0.0")

  2. 测试环节,测试云服务是否可以访问本地服。云服务器端测试,下面 8025 是步骤 10 中端口,172.28.80.200:5000 是本地设备局域网 ip,5000,是 flask 端口。有正确回应,则 nps 全部安装成功。

curl --socks5-hostname 127.0.0.1:8025  172.28.80.200:5000

k3s 集群搭建

  1. 服务器端使用 socket5 代理 export ALL_PROXY=socks5://127.0.0.1:8025
  2. 服务器端,安装 k3s,下面代码中****,替换为你的服务器公网 ip
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="--disable=traefik --node-external-ip=116.******.62 --flannel-backend=wireguard-native --flannel-external-ip"  sh -
  1. 服务端测试 安装是否成功,看到 server 节点,说明安装成功。
kubectl get nodes
  1. 复制 server 端的 config,以及 token,之后使用
cat /etc/rancher/k3s/k3s.yaml ##这里是config
cat /var/lib/rancher/k3s/server/node-token ## 这里字符类似*****server:*****,只需要server:后面的一段。
  1. 本地端,将 cofig,copy 到 .kube/config,并修改其中 ip 为 server 公网 ip。假设已经安装 kubectl,k9s。然后查看,可以看到 master node
kubectl get nodes
k9s
  1. 本地端,使用 docker 安装 agent,下面代码中****,分别替换为公网 ip,刚刚复制的 server 端 token,本地局域网 ip。
sudo docker run \
  --privileged \
  --name k3s-client-win \
  --hostname k3s-client-win \
  -d rancher/k3s:v1.24.10-k3s1 \
  agent --server https://********:6443 --token ****** --node-external-ip ******
  1. 再次查看 node,看是不是新增了一个。若是,说明添加成功,否则排查一下,比如服务端口6是否开放。
kubectl get nodes
k9s

istio 配置

上面搭建起来了本地设备+云服务器集群,由于有两个节点,其中一个不能从外网访问,因此我们需要对流量做额外处理。

使用 istio,可以添加一个如下配置,指定流量流入入口 ingressgateway,node:kubernetes.io/hostname: hecs-361752

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: ingress
spec:
  profile: empty # Do not install CRDs or the control plane
  components:
    ingressGateways:
      - name: istio-ingressgateway
        namespace: istio-system
        nodeSelector:
          kubernetes.io/hostname: hecs-361752
        enabled: true
        label:
          # Set a unique label for the gateway. This is required to ensure Gateways
          # can select this workload
          istio: ingressgateway
  values:
    gateways:
      istio-ingressgateway:
        # Enable gateway injection
        injectionTemplate: gateway

总结

本文提供一个思路,使用公网 ip+内网隧道通信,建立起来本地设备与云服务器的集群。

Footnotes

  1. docs.k3s.io/installatio…

  2. www.rancher.cn/k3s/

  3. k9scli.io/

  4. istio.io/

  5. github.com/ehang-io/np…

  6. docs.k3s.io/installatio…