介绍
最近云服务商做活动,手里云主机又多了一个,国内的有三台了,可以组个 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 相当方便。