k3s
特点
- 资源需求低
- 裁减了很多非核心功能
1
2
3
4
|
https://k3s.io/
https://github.com/k3s-io/k3s/
https://docs.k3s.io/
https://docs.k3s.io/installation/configuration
|
注解
- sqlite3 作为默认存储后端, 也支持 etcd3, MySQL 和 Postgres
- 区分控制面(server), 工作节点(agent)
内置组件
- containerd
- 内置 Flannel cni
- Traefik Ingress controller
- ServiceLB Load-Balancer controller
- Kube-router Network Policy controller
- Local-path-provisioner Persistent Volume controller
- Spegel distributed container image registry mirror, 仓库镜像
- Host utilities (iptables, socat, etc)
组件
servicelb
支持 service LoadBalancer
原理:
在集群的每个节点上, 自动创建一个 DaemonSet 类型, 名为 svc- 的 Pod,
这个 pod 会生成 iptable 规则, 将外部发往节点特定端口的流量, 转发给实际提供服务的应用 Pod
pod 也带健康检查, 动态调节规则;
两种工作模式, 会根据节点配置自动选择
-
外部 IP 模式(推荐):
如果节点配置了外部 IP(如云服务器的公网 IP),
ServiceLB 会直接使用该 IP 作为服务的 EXTERNAL-IP;
外部流量直接到达节点的物理网卡, 然后被转发
-
内部 IP 模式:
如果节点没有配置外部 IP(如纯内网环境), ServiceLB 会退而使用节点的内网 IP;
外部流量需要先经过 NAT(网络地址转换)才能到达节点
cni
Flannel VXLAN
Flannel WireGuard
部署
常用部署环境变量
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
|
# 安装时跳过下载镜像, 离线安装
INSTALL_K3S_SKIP_DOWNLOAD=true
# 当没跳过二进制程序安装时,指定k3s版本安装的版本,默认为最新版
INSTALL_K3S_VERSION=v1.18.6-k3s1
# k3s二进制程序所在路径
INSTALL_K3S_BIN_DIR=/usr/local/bin
# 指定k3s server地址, 用于注册agent节点
K3S_URL=https://xxx:6443
# 设置k3s启动参数,当K3S_URL未设置时,默认为server, 反之为agent
# 对应server节点系统程序为 k3s
# 对应agent节点系统程序为 k3s-agent
INSTALL_K3S_EXEC="server"
# 从文件中获取k3s启动参数, 默认为 /etc/rancher/k3s/config.yaml
# 该参数用于替代INSTALL_K3S_EXEC变量,该变量在v1.19.1-k3s1+版本支持
# 参考文档: https://docs.k3s.io/installation/configuration
K3S_CONFIG_FILE=xxx
# 启动参数为server时, 指定server的token,token存放路径为/var/lib/rancher/k3s/server/node-token
# 启动参数为agent时, 指定连接server的token
K3S_TOKEN=xxx
# 和K3S_TOKEN作用一致,区别在于该参数会从文件地区token
K3S_TOKEN_FILE=xxx
|
启动参数
server启动参数
在 INSTALL_K3S_EXEC 变量中指定server启动参数,
例如INSTALL_K3S_EXEC=“server xxx”, 多个参数使用空格分隔
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
|
# 初始化集群
--cluster-init
# k3s数据持久化目录, 默认为 /var/lib/rancher/k3s
--data-dir /var/lib/rancher/k3s
# 安装k3s集群时禁止部署的服务
# 可以为coredns、servicelb、traefik、local-storage、metrics-server
--disable traefik
# 关闭ccm
--disable-cloud-controller
# 指定apiserver参数, 多个参数指定多次
--kube-apiserver-arg
# 指定scheduler参数, 多个参数指定多次
--kube-scheduler-arg key=value
# 指定controller-manager参数, 多个参数指定多次
--kube-controller-manager-arg key=value
# 指定kubelet参数, 多个参数指定多次
--kubelet-arg key=value
# flannel网络配置, 可以为vxlan或host-gw, 默认为vxlan
--flannel-backend=vxlan
# 集群网络划分
--cluster-cidr=10.42.0.0/16
--service-cidr=10.43.0.0/16
# 指定etcd快照策略
--etcd-snapshot-schedule-cron='10 0 1-31 1-12 0-6'
|
agent 启动参数
1
2
3
4
5
|
# k3s数据持久化目录, 默认为/var/lib/rancher/k3s
--data-dir /var/lib/rancher/k3s
# 指定kubelet参数, 多个参数指定多次
--kubelet-arg key=value
|
自动部署
1
2
3
4
5
6
|
systemctl disable firewalld --now
# or
firewall-cmd --permanent --add-port=6443/tcp #apiserver
firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16 #pods
firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16 #services
firewall-cmd --reload
|
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
|
curl -sfL https://get.k3s.io | sh -
# 查看节点1
sudo k3s kubectl get node
# 可以先导出脚本
# curl https://get.k3s.io > install-k3s.sh
# 初始化参数
curl -fL https://get.k3s.io | sh -s - server \
--node-ip=192.168.80.10 \
--flannel-backend none \ # 关闭 flannel
--disable-cloud-controller
--cluster-init \
--node-external-ip=192.168.80.80 \
--disable-kube-proxy \
--disable-network-policy \
--disable-helm-controller \
# 选择性禁用组件
--disable=traefik,local-storage,metrics-server,servicelb,coredns
--token # 固定后续节点加入的token
# 国内环境安装 k3s
INSTALL_K3S_MIRROR=cn curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | sh -s - server \
--disable-cloud-controller \
--disable-network-policy \
--disable-helm-controller \
--disable=traefik,local-storage,metrics-server \
--system-default-registry=registry.cn-hangzhou.aliyuncs.com
# 获取随机产生的 K3S_TOKEN: /var/lib/rancher/k3s/server/node-token
|
新节点加入集群
1
2
3
4
5
6
7
|
curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
curl -sfL https://get.k3s.io | \
K3S_TOKEN=${NODE_TOKEN} sh -s - agent \
--server https://192.168.80.80:6443 \
--node-ip=${WORKER_ADDR} \ # 固定节点ip - 多网卡或多ip时
--node-external-ip=${WORKER_ADDR} # 固定外部ip
|
离线安装
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
|
# 下载安装脚本
curl -o install.sh https://get.k3s.io
# 准备 cli 和 镜像压缩包 github
k3s
k3s-airgap-images-amd64.tar
# 预加载镜像
sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp ./k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
chmod +x k3s
cp k3s /usr/local/bin/
# 执行安装脚本
chmod +x install.sh
INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
systemctl status k3s
journalctl -u k3s -f
k3s kubectl get node
# 导出 kubeconfig
k3s kubectl config view --raw > k3s
|
k3s目录结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 连接k3s集群的认证文件 kubeconfig
/etc/rancher/k3s/k3s.yaml
# k3s在启动之后会部署的清单文件目录,可以提前创建该目录并将需要部署的应用放置其中
# 当k3s启动或文件修改时间出现变化时就会重新apply改目录下资源清单
/var/lib/rancher/k3s/server/manifests
# k3s server的token信息
/var/lib/rancher/k3s/server/node-token
# k3s证书目录
/var/lib/rancher/k3s/server/tls
# k3s containerd配置文件
/var/lib/rancher/k3s/agent/etc/containerd
# k3s cni网络接口配置文件
/var/lib/rancher/k3s/agent/etc/cni/
# k3s flannel配置文件
/var/lib/rancher/k3s/agent/etc/flannel/
|
k3s 管理 cli
1
2
3
4
5
6
7
8
9
|
# 检查k3s启动状态
k3s kubectl get pod -n kube-system
# 管理容器
k3s ctr
k3s ctr version
k3s ctr i ls -q
crictl rmi --prune # 清理镜像
|
进入对应容器
1
2
3
4
5
|
# 获取 pid, 查看 pid 对应containerd的task
k3s ctr t ls | grep 25101
# 通过task id进入容器
k3s ctr t exec --exec-id xxxxx TASKID /bin/sh
|
升级 k3s
- 下载新的 k3s 二进制程序和安装脚本
- 替换当前的 k3s 二进制程序和安装脚本
- 使用相同的环境变量重新执行安装脚本即可
- 升级时一次升级一个 server 节点, 然后升级所有 agent 节点
简单办法就是将下载的二进制文件替换旧文件, 先停后启;
k3s 存储
k3s 集群默认提供了 local-path 作为 storageclass 来进行持久化存储;
该 storageclass 由系统名称空间的 deploy 资源 local-path-provisioner 进行控制
k3s网络
提供了klipper-lb用于实现LoadBalancer访问
一个集群中LoadBalancer的port端口唯一不可重复
延长证书有效期
创建 /etc/default/k3s 文件
1
|
CATTLE_NEW_SIGNED_CERT_EXPIRATION_DAYS=3650
|
手动触发证书轮转并重启
1
2
|
k3s certificate rotate
systemctl restart k3s
|
备份恢复
自动备份机制
k3s内置etcd集群的快照目录默认为k3s数据目录下的/server/db/snapshots,
默认每12小时进行一次备份, 部署时通过k3s参数–etcd-disable-snapshots来指定备份策略
1
2
3
|
INSTALL_K3S_EXEC="server \
--etcd-disable-snapshots=true \
--etcd-snapshot-schedule-cron='0 */5 * * *'"
|
手动备份
1
2
3
4
5
6
|
ETCDCTL_ENDPOINTS='https://127.0.0.1:2379' \
ETCDCTL_CACERT='/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt' \
ETCDCTL_CERT='/var/lib/rancher/k3s/server/tls/etcd/server-client.crt' \
ETCDCTL_KEY='/var/lib/rancher/k3s/server/tls/etcd/server-client.key' \
ETCDCTL_API=3 \
./etcdctl snapshot save /tmp/mysnapshot.db
|
恢复数据
恢复数据时需要指定集群之前的token, 同时需要指定所有启动参数,
将下面命令中的 –WITH-OTHER-ARGS 修改为对应的启动参数,
启动参数中需要去除 cluster-init 或 –cluster
1
2
3
4
5
6
7
|
k3s server \
--cluster-reset \
--cluster-reset-restore-path=/tmp/mysnapshot.db \
--WITH-OTHER-ARGS \
--token=mastergo
systemctl restart k3s
|