介绍
最近云服务商做活动,手里云主机又多了一个,国内的有三台了,可以组个 k8s 集群了。本文介绍如何跨 VPC 组网,机器情况如下。
| hostname | 外网ip | 内网ip | os |
|---|
| ten-1 | 62.234.xxx.xxx | 172.21.0.1 | CentOS 7.6 |
| ten-2 | 82.156.xxx.xxx | 10.0.8.1 | CentOS 7.9 |
| ten-3 | 81.70.xxx.xxx | 10.0.24.1 | CentOS 7.6 |
| MacBook | - | - | Darwin 10.15.6 |
WireGuard 是由 C 语言写的开源 VPN 方案。概括来讲更快、更简单、更安全,Linux 内核 5.6 版本开始自带。且支持全平台。Netmaker 是一个可视化操作工具,方便我们对 WrireGuard 的配置管理,相比于直接写配置,当节点多起来会便捷不少。
简单说下运行流程,Netmaker 分服务端和客户端,客户端是 netclient。我们在 Netmaker 上创建虚拟网络,然后在想要加入网络的节点上通过 netclient 加入。Netmaker 会对加入网络的节点自动同步 WireGuard 的配置信息,创建相应的路由规则,之后节点与节点之间的通信直接进行。
本文只是介绍了一部分 Netmaker 功能,更多内容请看 Netmaker 官方文档。
为了方便 CentOS 内核都已升级至 5.16,自带了 WireGuard。升级内核教程很多就不多说了。
Netmaker 部署
在 ten-1 上先创建所需目录
1 2
| $ mkdir -p /etc/netclient/config $ mkdir -p /data/netmaker
|
直接容器化部署,compose yml 如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| version: "3.4"
services: netmaker: container_name: netmaker image: gravitl/netmaker:v0.9.4 volumes: - /etc/netclient/config:/etc/netclient/config - dnsconfig:/root/config/dnsconfig - /usr/bin/wg:/usr/bin/wg - /data/netmaker:/root/data cap_add: - NET_ADMIN restart: always network_mode: host environment: SERVER_HOST: "SERVER_PUBLIC_IP" COREDNS_ADDR: "SERVER_PUBLIC_IP" GRPC_SSL: "off" DNS_MODE: "on" CLIENT_MODE: "on" API_PORT: "8081" GRPC_PORT: "50051" SERVER_GRPC_WIREGUARD: "off" CORS_ALLOWED_ORIGIN: "*" DATABASE: "sqlite" netmaker-ui: container_name: netmaker-ui depends_on: - netmaker image: gravitl/netmaker-ui:v0.9.4 links: - "netmaker:api" ports: - "127.0.0.1:8082:80" environment: BACKEND_URL: "https://api.NETMAKER_BASE_DOMAIN" restart: always coredns: depends_on: - netmaker image: coredns/coredns command: -conf /root/dnsconfig/Corefile container_name: coredns restart: always network_mode: host volumes: - dnsconfig:/root/dnsconfig volumes: dnsconfig: {}
|
更多参数配置请参考
如果你是直接用公网ip方式访问 netmaker ui 那直接把注释说明的地方修改下跑起来就可以进入下一节了。

如果你使用域名访问,可以参考下我的方案。
首先解析域名 api.NETMAKER_BASE_DOMAIN,dashboard.NETMAKER_BASE_DOMAIN 至 ten-1。
然后我使用 Traefik 将域名 dashboard.NETMAKER_BASE_DOMAIN 反代 netmaker ui 也就是 127.0.0.1:8082。你可以参考官网选择 Caddy 或 Nginx。
Traefik 配置就不贴了,之前文章写过很多次。
Netmaker 创建网络
打开 Netmaker UI,首次打开会创建一个用户,然后登录。

- Networks 虚拟网络管理
- Nodes 节点管理,Ingress 和 Egress 网关配置等。
- Access Keys 密钥管理
- External Clients 安卓或苹果端加入网络使用
- DNS
- Users 配置用户管理网络,支持多租户
然后进入 Networks 创建一个虚拟网络,比如 10.1.0.0/16。

- 网络默认监听端口是 51821 记得对该端口放行(运行Netmaker的节点)
这样虚拟网络就创建成功了。
加入节点
加入节点有两种方式,先说第一种:
在网络里点 Access keys 创建 Key,获得 Token。


uses 代表这个 Key 可以用于几个节点

然后去要加入网络的节点上执行 Install Commands 加入网络。执行的逻辑就是下载 netclient 然后通过 Token 加入网络,Token 里面包含了 Netmaker 的服务端配置信息。
所以你也可以从 这里 手动下载 netclient 执行:netclient join -t TOKEN 。
第二种是进入网络把 Without Keys 打开

然后在节点上执行
netclient join --dnson no --network ten --apiserver NETMAKE_DOMAIN_OR_IP:8081 --grpcserver NETMAKE_DOMAIN_OR_IP:50051
在 Nodes 下对刚加入的节点执行同意加入

macOS 的加入
也是先下载 netclient,下载时候注意平台如果是 M1 芯片下载 darwin-arm64,之后安装 wireguard-tools:
1
| $ brew install wireguard-tools
|
然后执行 netclient join 就行了。
查看节点
在节点上执行 wg 可以看到加入的虚拟网络和链接的节点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| $ wg interface: nm-ten public key: aH4j5K2TiYhhwI9Bz0tmxxxx private key: (hidden) listening port: 51821
peer: mbv8tihsqvvtgcejLGB+xxxxx endpoint: 81.70.xxx.xxx:51821 allowed ips: 10.1.0.3/32 latest handshake: 35 seconds ago transfer: 14.37 MiB received, 54.71 MiB sent persistent keepalive: every 20 seconds
peer: WDEfuS8deFQyd6syZJNtaxxxx endpoint: 82.156.xxx.xxx:51821 allowed ips: 10.1.0.2/32 latest handshake: 35 seconds ago transfer: 36.74 MiB received, 542.48 MiB sent persistent keepalive: every 20 seconds
|
已经成功分配了ip,ping 一下试试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| $ ping 10.1.0.2 PING 10.1.0.2 (10.1.0.2) 56(84) bytes of data. 64 bytes from 10.1.0.2: icmp_seq=1 ttl=64 time=8.69 ms 64 bytes from 10.1.0.2: icmp_seq=2 ttl=64 time=9.74 ms 64 bytes from 10.1.0.2: icmp_seq=3 ttl=64 time=51.0 ms ^C --- 10.1.0.2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 8.698/23.165/51.057/19.727 ms
$ ping 10.1.0.3 PING 10.1.0.3 (10.1.0.3) 56(84) bytes of data. 64 bytes from 10.1.0.3: icmp_seq=1 ttl=64 time=0.893 ms 64 bytes from 10.1.0.3: icmp_seq=2 ttl=64 time=0.948 ms 64 bytes from 10.1.0.3: icmp_seq=3 ttl=64 time=1.01 ms ^C --- 10.1.0.3 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2032ms rtt min/avg/max/mdev = 0.893/0.951/1.014/0.060 ms
|
网络已经打通了!
Ingress GateWay 和 External Clients
外部客户端,就是可以访问虚拟网络资源,但是虚拟网络内节点不能反过来访问该外部客户端。通过 Ingress GateWay 入口网关实现。
具体就是选择一个节点开启 Ingress GateWay 使其变成一个中继节点,然后在其上添加外部客户端 External Clients 生成配置文件及二维码。中继节点负责为外部客户端的流量请求进行转发。
Linux、macOS、Windows 可以通过 wg-quick up /path/to/config 命令接入网络。
Android 和 iOS 下载 WireGuard App 通过扫描配置二维码就可以接入网络了。
- 生成的配置是固定的,网络节点配置修改后需要重新生成配置
Egress GateWay
比如我现在的组网状态下,ten-2 节点私有局域网段是 10.0.8.0/22,ten 网络内其它节点想要访问该私有局域网段的其它服务器,通过 Egress GateWay 出口网关可以实现。
在 ten-2 节点上创建出口网关后通过 wg 查看配置同步完成网络就打通了。另外通过逗号分隔可以支持多个网段。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| $ wg interface: nm-ten public key: aH4j5K2TiYhhwI9Bz0tmxxxx private key: (hidden) listening port: 51821
peer: mbv8tihsqvvtgcejLGB+xxxxx endpoint: 81.70.xxx.xxx:51821 allowed ips: 10.1.0.3/32 latest handshake: 55 seconds ago transfer: 644.40 MiB received, 24.83 MiB sent persistent keepalive: every 20 seconds
peer: WDEfuS8deFQyd6syZJNtaxxxx endpoint: 82.156.xxx.xxx:51821 allowed ips: 10.1.0.2/32, 10.0.8.0/22 latest handshake: 44 seconds ago transfer: 569.67 MiB received, 38.38 MiB sent persistent keepalive: every 20 seconds
|
其它
组网成功后部署了 k8s 集群, 可以进一步折腾了。
另外推荐一个 k8s 可视化管理工具 Lens,号称是 k8s 的 IDE,操作 k8s 相当方便。

