基础网络环境已经准备好了,本篇就简单介绍下k3s的安装过程,很简单仅作为备忘录~

文档地址:

还是简单分析下安装需求、选项:

  1. 基于netmaker构成的虚拟子网安装,所以node-ip就是netmaker分配的IP
  2. 节点外部IP就是公网IP
  3. fiannel使用的网络接口和node-ip接口对应,即wireguard的iface
  4. 穷人没有load balancer(lb需要云服务商提供),直接不部署还是直接用rancher的servicelb好了
  5. 不用默认的traefik,想自己部署ingress-ngixtraefik v2真香!
  6. 安装过程使用国内的加速 镜像,参考快速入门指南
  7. 推荐加--cluster-init参数,使用嵌入式etcd数据库,以便后期的迁移

控制平面部署

1
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server --node-ip <NETMAKER_IP> --node-external-ip <MASTER_PUBLIC_IP> --flannel-iface <NM_INTERFACE_NAME> --cluster-init

控制平面最好是有公网IP的。网络插件就用了默认的flannel以及默认配置,flannel可配置项目较少,若有其他需求可以换。

当提示安装完成后,在/var/lib/rancher/k3s/server/node-token路径下获取K3S_TOKEN,下面部署Worker节点要用到。

Worker节点部署

  • <K3S_TOKEN>:控制平面生成的TOKEN
  • <MASTER_NODE_IP>:即为控制平面的IP地址,可以选择的有netmaker内网IP或者域名、公网IP或者域名,我这里选择了netmaker内网域名
  • <NETMAKER_IP>:各自节点的netmaker内网的IP
  • <NODE_PUBLIC_IP>:各自节点的公网IP,没有就不写此项
  • <NM_INTERFACE_NAME>:各自节点上netmaker的interface名字,一般是nm-开头的那个

有公网IP节点

1
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://<MASTER_NODE_IP>:6443 K3S_TOKEN=<K3S_TOKEN> sh -s - --node-ip <NETMAKER_IP> --flannel-iface <NM_INTERFACE_NAME> --node-external-ip <NODE_PUBLIC_IP>

无公网IP节点

1
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://<MASTER_NODE_IP>:6443 K3S_TOKEN=<K3S_TOKEN> sh -s - --node-ip <NETMAKER_IP> --flannel-iface <NM_INTERFACE_NAME>

检验安装

待全部节点安装完成后,在控制平面上运行kubectl get nodes -o wide查看节点状态

image-20211108165812654

全部显示ready就是可以了~在每个节点上运行个sleep pod:

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
apiVersion: v1
kind: Pod
metadata:
name: alpine-m01
spec:
containers:
- name: alpine-m01
image: alpine
# Just spin & wait forever
command: [ "/bin/sh", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
nodeSelector:
kubernetes.io/hostname: m01-k3s
---

apiVersion: v1
kind: Pod
metadata:
name: alpine-s01
spec:
containers:
- name: alpine-s01
image: alpine
# Just spin & wait forever
command: [ "/bin/sh", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
nodeSelector:
kubernetes.io/hostname: s01-k3s
---

apiVersion: v1
kind: Pod
metadata:
name: alpine-s02
spec:
containers:
- name: alpine-s02
image: alpine
# Just spin & wait forever
command: [ "/bin/sh", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
nodeSelector:
kubernetes.io/hostname: s02-k3s

完美~

image-20211108172152863

分别进入这三个pod,测试下网络

image-20211108172537233

可以看到都是通的,只是没有公网ip的节点网络状态不太好,似乎由于UDP打洞带来的延迟,刚开始的数据包是会丢掉的~没辙

本地kubectl配置

要操作k3s集群不可能每次都登陆控制平面是吧~在本地安装kubectl命令行工具就行了,然后将控制平面上的/etc/rancher/k3s/k3s.yaml复制到集群外部的计算机上的~/.kube/config并将其中的localhost修改为控制平面的IP或者域名并开放6443端口即可。

对于有多个集群管理的需要,推荐kubecm这个项目,地址在这里。这个工具可以合并多个config文件并且支持快速切换集群,就很偷懒~

image-20211108173503865