K3s跨云厂商部署

为什么要打造跨云厂商部署,因为云服务资源非常有限的,部署容器效率等等方面,造成这么一需求来,本篇采用k3s做为方案

Wireguard

Wireguard 能让处于不同网络的主机组成一个子网,是一种高性能的廉价组网方案,是基于最前沿密码学构建的轻量、快速、安全、现代化的开源VPN Wireguard还是个跨平台,小到微型嵌入式设备,大到超级计算机,常用Windows、MacOS、Linux、iOS和安卓操作系统平台,WireGuard都能按照预期高效运行,该代码将被合并到到Linux主线5.6内核中

Netmaker

Netmaker 是一个用来配置 WireGuard 全互联模式的可视化工具,它的功能非常强大,不仅支持 UDP 打洞、NAT 穿透、多租户,还可以使用 Kubernetes 配置清单来部署,客户端几乎适配了所有平台,包括 Linux, Mac 和 Windows,还可以通过 WireGuard 原生客户端连接 iPhone 和 Android

K3s

K3s 是一个完全兼容,轻量级的 Kubernetes 发行版

环境准备

需要三台机器,一个公网IP

机器清单

NodeLocalIPNetworkOSSpecification
Masteraliyun1.x.x.xVPC/EIPUbuntu 22.04.1 LTS2C2G
Node1VM10.x.x.xLan Private IPCentos 78C8G
Node2VM10.x.x.xLan Private IPCentos 72C4G

内核升级

目前wg已经被合并到5.6内核了,如果你的机器内核大于这个版本,你需要装wireguard-tools工具即可,升级内核或者下载wireguard工具该链接如下

Installation - WireGuard

apt install wireguard
wg --version

网络规划与部署

Wireguard可以使用wg命令操作,操作wg有Netmaker和Wg Gen Web易用的工具,这里使用Netmaker

安装Netmaker

Netmaker 需要安装到有公网IP节点上[Master]

另外还需要域名,如果不需要域名,下载好自行把对应的domain改成IP

dashboard.example.com
api.example.com
broker.example.com
nm.example.com

安全防火墙需要放行 TCP:80 443 UDP:51820-51830

wget -qO /root/nm-quick-interactive.sh https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/nm-quick-interactive.sh && sudo chmod +x /root/nm-quick-interactive.sh && sudo /root/nm-quick-interactive.sh

访问Netmaker

  • 访问https://dashboard.<your domain>

创建网络

输入名称和IP,不想操作可以点击AUTOFILL,创建成功在列表会显示dev

创建Access Key

name 设置密钥的名称

uses 代表这个网络能使用多少节点,这里设置为10

安装netclient

在 master/node1/node2 安装 netclient 执行建立连接

使用教程

curl -sL 'https://apt.netmaker.org/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/netclient.asc
curl -sL 'https://apt.netmaker.org/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/netclient.list
apt update
apt install netclient
netclient -v

建立连接

netclient join -t <AccessToken>

建立连接

netclient connect -n dev

断开连接

netclient disconnect -n dev

验证网络

wg

安装k3s

安装使用教程

要求

两个节点不能具有相同的主机名。如果多个节点有相同的主机名,

使用--with-node-id选项为每个节点附加一个随机后缀,或者使用--node-name或$K3S_NODE_NAME为添加到集群的每个节点设计一个独特的名称

硬件

最少使用2c2g

网络

K3s Server 需要 6443 端口才能被所有节点访问

使用 Flannel Wireguard 后端时,节点需要能够通过 UDP 端口 51820 和 51821(使用 IPv6 时)访问其他节点。该节点不应侦听任何其他端口。K3s 使用反向隧道建立节点与 Server 的出站连接,所有 kubelet 流量都通过该隧道进行。但是,如果你不使用 Flannel 并提供自己的自定义 CNI,那么 K3s 不需要 Flannel 所需的端口

本篇文档使用 wg 打通需要flannel cni配合

在[node1]安装k3s server

flannel 使用教程

为什么要在 node1 节点安装k3s server,是因为云服务资源不够,需要在内网安装,内部服务器随便折腾

使用国内链接下载,server exec flannel-iface 加上wg定义的网卡名称

安装

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="server --flannel-iface nm-dev" sh -

停止

sh /usr/local/bin/k3s-killall.sh

卸载

sh /usr/local/bin/k3s-uninstall.sh

获取token

cat /var/lib/rancher/k3s/server/node-token

查看节点

kubectl get nodes

在[master/node2]安装k3s agent

安装

10.x.x.x 是 node1 wg的ip

public ip 是对外显示的ip

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://10.x.x.x:6443 K3S_TOKEN=<token> INSTALL_K3S_EXEC="agent --flannel-iface nm-dev --node-external-ip <public ip>" sh -

卸载

sh /usr/local/bin/k3s-agent-uninstall.sh

将[node1]文件移动到对应的master/node2节点,否则agent 无法执行 kubectl 命令

scp -r /etc/rancher/k3s/k3s.yaml root@[master/node2]:/etc/rancher/k3s/

在master/node2节点修改k3s.yaml

server: https://{node1}:6443

添加变量

echo "export KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> ~/.bash_profile
source ~/.bash_profile

查看节点

kubectl get nodes

验证部署

创建 namespace

kubectl create namespace dev

创建 nginx.yaml 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pc-deployment
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80


---

apiVersion: v1
kind: Service
metadata:
  name: service-nodeport
  namespace: dev
spec:
  selector:
    app: nginx-pod
  type: LoadBalancer
  ports:
  - port: 30800
    targetPort: 80

执行文件

kubectl create -f nginx.yaml

查看pod,svc

kubectl get pods,svc -n dev -owide

访问部署各个节点nginx

curl -I http://<public ip>:30800