介绍
最近云服务商做活动,手里云主机又多了一个,国内的有三台了,可以组个 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 上先创建所需目录
$ mkdir -p /etc/netclient/config
$ mkdir -p /data/netmaker
直接容器化部署,compose yml 如下:
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" # dns 不需要直接 off 把下面 coredns 部分也注释
CLIENT_MODE: "on" # 开启 CLIENT_MODE 则默认将 netmaker server 也当做网络节点
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" # 如果你没有域名直接用公网ip就改成 "80:80"
environment:
BACKEND_URL: "https://api.NETMAKER_BASE_DOMAIN" # 无证书用http,如果你没有域名直接用公网ip就改成 "http://SERVER_PUBLIC_IP:8081"
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:
$ brew install wireguard-tools
然后执行 netclient join 就行了。
查看节点
在节点上执行 wg 可以看到加入的虚拟网络和链接的节点。
$ 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
- 网络不通请检查
endpoint端口的连通性
已经成功分配了ip,ping 一下试试。
$ 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 查看配置同步完成网络就打通了。另外通过逗号分隔可以支持多个网段。

$ 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 相当方便。

