搭建K3s集群
K8s环境部署
简介
搭建 K3s + Rancher + Longhorn + MetalLB环境
K3s
K3s是一款轻量级Kubernetes发行版,其核心优势在于:
- 极致轻量:单个二进制文件不到100MB,仅需512MB内存即可运行,启动和资源消耗远低于标准集群。
- 功能齐全:通过CNCF认证,100%兼容标准Kubernetes API,并内置了常用组件,开箱即用。
- 灵活的数据存储:可以使用外部数据库(mariadb)替代etcd,降低初始资源。
Rancher
Rancher是一个开源容器管理平台,核心能力包括:
- 统一纳管:可集中管理任意K8s集群(包括K3s/RKE2、云厂商托管集群及已有集群)。
- 降低门槛:提供直观图形界面及开箱即用的CI/CD、监控、服务网格等工具链。
- 安全合规:支持AD/LDAP对接及精细化RBAC,实现跨集群统一安全策略。
Longhorn
Longhorn 是一款专为 Kubernetes 设计的轻量级、可靠且易用的分布式块存储系统,它通过容器和微服务将现有存储资源转化为持久卷,并提供企业级的数据备份与恢复能力。
部署教程
在进行具体操作前,请先仔细阅读各小节开头附的参考文档。
本教程全程使用国内镜像源,无需翻墙即可完成部署。
将以仿真项目中的虚拟机集群为例,结合openresty中证书工具,将相关部署方法具体体现在命令示例之中。
先决条件
参考文档:为高可用 K3s Kubernetes 集群设置基础设施 | Rancher
生产环境etcd需要占用较多内存(2G以上)和CPU。轻负载(Pod 创建/删除不频繁)时,可以用外部数据库替代,这里以mariadb为例。
数据库密码不推荐加特殊符号(如@),避免转义的麻烦
安装K8s
参考教程:为 Rancher 设置高可用 K3s Kubernetes 集群 | Rancher
- 连接到准备用于运行Rancher Server的其中一个节点(node 1),该节点为主节点。
- 安装K3s Server
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_VERSION=v1.34.6+k3s1 \
sh -s - server \
--write-kubeconfig-mode 644 \
--datastore-endpoint="mysql://tsysmart:TSYSmart2026@tcp(10.1.9.146:3306)/rancher_db"
- 获取主节点令牌:
cat /var/lib/rancher/k3s/server/token
# example
K1014e38e918cd9c051fc3d043d22401b302c7b9c64427c81efc7bf4de9764961b9::server:6bb33a9be8eb1a30c3c521110d0e14f1
- 添加另一个K3s主节点(node 2)
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.34.6+k3s1 sh -s - server --datastore-endpoint="mysql://tsysmart:TSYSmart2026@tcp(10.1.9.146:3306)/rancher_db" --token "K1014e38e918cd9c051fc3d043d22401b302c7b9c64427c81efc7bf4de9764961b9::server:6bb33a9be8eb1a30c3c521110d0e14f1"
- 添加一个工作节点(node 3)
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://10.1.9.130:6443 K3S_TOKEN="K1014e38e918cd9c051fc3d043d22401b302c7b9c64427c81efc7bf4de9764961b9::server:6bb33a9be8eb1a30c3c521110d0e14f1" sh -
- 检查K3s是否正常运行。在其中一个K3s Server主节点上运行以下命令,来确认K3s是否已经设置成功:
k3s kubectl get nodes
# Example
NAME STATUS ROLES AGE VERSION
node 1 Ready control-plane 5d20h v1.34.6+k3s1
node 3 Ready <none> 48s v1.34.6+k3s1
node 2 Ready control-plane 5d20h v1.34.6+k3s1
安装Rancher
参考教程:在 Kubernetes 集群上安装/升级 Rancher | Rancher
- 添加Helm Chart仓库
helm repo add rancher-stable https://charts.rancher.cn/server-charts/stable --force-update
- 创建默认命名空间
cattle-system
kubectl create namespace cattle-system
- 选择SSL配置
我们选择你已有的证书这种方法。使用openresty/cert-tools生成证书
sh create_server_cert.sh rancher.optsimu.tsysmart.cn
mv server.key tls.key
mv server.crt tls.crt
- 通过helm安装Rancher
helm install rancher rancher-stable/rancher --namespace cattle-system --set hostname=rancher.optsimu.tsysmart.cn --set bootstrapPassword=admin --set ingress.tls.source=secret --set privateCA=true --version 2.13.3
- 添加TLS密文
使用kubectl创建tls类型的密文
kubectl -n rancher-system create secret tls tls-rancher-ingress --cert=tls.crt --key=tls.key
使用私有CA签名证书
kubectl -n cattle-system create secret generic tls-ca \
--from-file=ca.crt
- 添加密文后,检查 Rancher 是否已成功运行:
- 检查 deployment 的状态:
验证Rancher Server是否部署成功
kubectl -n cattle-system rollout status deploy/rancher
可以看到如下输出
deployment "rancher" successfully rolled out
kubectl -n cattle-system get deploy rancher
可以看到如下输出,DESIRED 和 AVAILABLE的个数应该相同。
NAME READY UP-TO-DATE AVAILABLE AGE
rancher 3/3 3 3 3d4h
配置Harbor镜像源
- 进入rancher前端页面(生成证书时传递的域名)后,左侧导航栏找到
Storage - 展开或点击
Storage,在下拉菜单中选择Secrets - 点击页面顶部的蓝色按钮
Create
- 在创建页面:
Namespace:选择你要使用的命名空间Name:输入一个名称,如harbor-authRegistry Address:选择 "Custom",然后输入公司的 Harbor 地址https://harbor.tsysmart.cn/Username和Password:输入 LDAP的登录凭证
- 验证:添加工作负载
namespace、name、replicas必填- 填写
Container Image(镜像地址) Pullll Serects选择第4步的harbor-auth
Pod最后应为Running状态,如图所示:
安装Longhorn
- 安装依赖,所有节点都需要
TODO: 主机上的基本配置(nfs目录等)
sudo apt-get update
sudo apt-get install open-iscsi nfs-common -y
sudo systemctl enable --now iscsid
- 使用
kubectl安装
请根据rancher页面,集群的app中搜索longhorn版本号,更改下面命令中的版本(v1.11.1)
# 1. 在有网络的机器下载对应版本的官方安装文档
wget https://raw.githubusercontent.com/longhorn/longhorn/v1.11.1/deploy/longhorn.yaml
# 2. 在master节点上执行安装
kubectl apply -f longhorn.yaml
- 配置NodePort
apiVersion: v1
kind: Service
metadata:
name: longhorn-frontend-nodeport
namespace: longhorn-system
spec:
type: NodePort
selector:
app: longhorn-ui
ports:
- port: 80
targetPort: 8000
nodePort: 30808
执行命令
kubectl apply -f longhorn-np.yaml
安装MetalLB
- 在所有的master节点,修改k3s.service
ExecStart增加参数,禁用klipper
--disable=servicelb
- 所有master节点,重启k3s
systemctl daemon-reload
systemctl restart k3s
- 在一台master上安装MetalLB
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
- 观察所有pod是否启动
kubectl get pods -n metallb-system -w
# 结果如下
NAME READY STATUS RESTARTS AGE
controller-5995677bd5-5d2gh 1/1 Running 0 34m
speaker-fgntg 1/1 Running 0 34m
speaker-fnkdm 1/1 Running 0 34m
speaker-h7bdh 1/1 Running 0 34m
speaker-z6rw4 1/1 Running 0 34m
- 配置IP池
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: my-ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.100-192.168.1.200
- 192.168.2.0/24
autoAssign: true
#kubectl apply -f ip-pool.yaml
#kubectl get ipaddresspools -n metallb-system
开启imageVolume特性
- 确认 K8s 版本支持
imageVolume
kubectl explain pod.spec.volumes.image
*# 有以下输出说明版本带有该功能*
*# KIND: Pod*
*# VERSION: v1*
*# FIELD: image <ImageVolumeSource>*
- 在 master 和 worker 节点开启
ImageVolume特性门控
- master修改/etc/rancher/k3s/config.yaml,并重启k3s
kube-apiserver-arg:
- "feature-gates=ImageVolume=true"
kube-controller-manager-arg:
- "feature-gates=ImageVolume=true"
kubelet-arg:
- "feature-gates=ImageVolume=true"
- worker修改/etc/rancher/k3s/config.yaml,并重启k3s-agent
kubelet-arg:
- "feature-gates=ImageVolume=true"
备忘
镜像源
harbor内需要提供mirrord-pause:3.6镜像(已经上传)
否则需要在所有节点配置镜像加速
mkdir -p /etc/rancher/k3s
cat >> /etc/rancher/k3s/registries.yaml << EOF
mirrors:
docker.io:
endpoint:
- "https://docker.xuanyuan.me"
- "https://docker.1ms.run"
- "https://docker.m.daocloud.io"
- "https://hub-mirror.c.163.com"
- "https://mirror.ccs.tencentyun.com"
- "https://registry-1.docker.io"
gcr.io:
endpoint:
- "https://gcr.m.daocloud.io"
quay.io:
endpoint:
- "https://quay.m.daocloud.io"
registry.k8s.io:
endpoint:
- "https://k8s.m.daocloud.io"
EOF
所有节点执行:
# master节点重启k3s,worker节点重启k3s-agent
systemctl restart k3s (k3s-agent)