搭建K3s集群

Share
搭建K3s集群
Photo by Joseph Barrientos / Unsplash

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与k8s版本兼容矩阵

参考教程:为 Rancher 设置高可用 K3s Kubernetes 集群 | Rancher
  1. 连接到准备用于运行Rancher Server的其中一个节点(node 1),该节点为主节点。
  2. 安装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"

  1. 获取主节点令牌:
cat /var/lib/rancher/k3s/server/token

# example
K1014e38e918cd9c051fc3d043d22401b302c7b9c64427c81efc7bf4de9764961b9::server:6bb33a9be8eb1a30c3c521110d0e14f1
  1. 添加另一个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"
  1. 添加一个工作节点(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 -
  1. 检查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

  1. 添加Helm Chart仓库
helm repo add rancher-stable https://charts.rancher.cn/server-charts/stable --force-update
  1. 创建默认命名空间cattle-system
kubectl create namespace cattle-system
  1. 选择SSL配置

我们选择你已有的证书这种方法。使用openresty/cert-tools生成证书

sh create_server_cert.sh rancher.optsimu.tsysmart.cn
mv server.key tls.key
mv server.crt tls.crt
  1. 通过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
  1. 添加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

可以看到如下输出,DESIREDAVAILABLE的个数应该相同。

NAME      READY   UP-TO-DATE   AVAILABLE   AGE
rancher   3/3     3            3           3d4h

配置Harbor镜像源

  1. 进入rancher前端页面(生成证书时传递的域名)后,左侧导航栏找到 Storage
  2. 展开或点击 Storage,在下拉菜单中选择 Secrets
  3. 点击页面顶部的蓝色按钮 Create
Image
  1. 在创建页面:
    • Namespace:选择你要使用的命名空间
    • Name:输入一个名称,如 harbor-auth
    • Registry Address:选择 "Custom",然后输入公司的 Harbor 地址https://harbor.tsysmart.cn/
    • UsernamePassword:输入 LDAP的登录凭证
Image
  1. 验证:添加工作负载
  • namespacenamereplicas必填
  • 填写Container Image(镜像地址)
  • Pullll Serects选择第4步的harbor-auth

Pod最后应为Running状态,如图所示:

Image

安装Longhorn

  1. 安装依赖,所有节点都需要

TODO: 主机上的基本配置(nfs目录等)

sudo apt-get update 
sudo apt-get install open-iscsi nfs-common -y
sudo systemctl enable --now iscsid
  1. 使用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
  1. 配置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

  1. 在所有的master节点,修改k3s.service ExecStart增加参数,禁用klipper
--disable=servicelb
  1. 所有master节点,重启k3s
systemctl daemon-reload
systemctl restart k3s
  1. 在一台master上安装MetalLB
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
  1. 观察所有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

  1. 配置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 特性门控
  1. 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"
  1. 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)

Read more

【避坑指南】从 TinyDB 文件损坏,聊聊文件截断与磁盘刷盘的底层原理

【避坑指南】从 TinyDB 文件损坏,聊聊文件截断与磁盘刷盘的底层原理

在 Python 轻量级开发中,TinyDB 因其“零部署、文件即数据库、支持对象化查询”的特性,成为了存储配置信息、多租户元数据的神器。 但在高频写入或异常崩溃的场景下,你是否遇到过这样的诡异现象:导出的 JSON 文件末尾莫名其妙多出了几个 NULNUL(\x00)空字节,导致整个数据库报 JSON 无法解析的错误? 本文将带你还原这个经典的“文件空洞”Bug,并分享如何通过自定义存储类 MyJSONStorage 彻底解决它。 一、 现象还原:消失的尾巴与诡异的 NUL 在默认情况下,TinyDB 的 JSONStorage 是这样写入文件的: 1. seek(0) 指针回到文件开头。 2. write(json_data) 写入序列化后的 JSON 字符串。 3. truncate(

By 樊泽豪
Docker常用操作

Docker常用操作

安装 Windows安装Docker到F盘(非系统盘) Start-Process -FilePath 'Docker_Desktop_Installer.exe' -Wait -ArgumentList "install --installation-dir=F:\DockerDesktop" 改变容器、镜像文件位置 以管理员权限启动Docker Desktop,Settings-Resources-Disk iamge location 配置dockerhub国内源 阿里云:容器镜像服务 (aliyun.com) 其他源 more /etc/docker/daemon.json 输入以下文件: { "registry-mirrors": [ "https://kk8u6omk.mirror.aliyuncs.com", "https:

By 樊泽豪
如何在 Ghost 博客中添加类似 Word 的左侧固定目录(纯干货)

如何在 Ghost 博客中添加类似 Word 的左侧固定目录(纯干货)

当我们在 Ghost 博客中撰写长文时,一个类似 Word 导航窗格的目录能极大提升读者的阅读体验。本文将分享如何通过 Code Injection(代码注入) 快速实现一个完全静止、不随点击乱跳、长标题自动换行的优雅左侧悬浮目录。 实现效果 * 完全固定: 目录稳居文章左侧,只有正文跟随鼠标滚动。 * 绝对静止: 修复了常见插件点击目录项时,目录自身会产生二次跳动的痛点。 * 清晰完整: 长标题自动换行显示,绝不裁剪文字。 * 移动端友好: 在手机或平板等小屏幕上自动隐藏,防止遮挡正文。 部署步骤 无需修改任何主题源文件,只需登录 Ghost 后台,进入 Settings -> Code Injection(代码注入),将以下两段代码全选覆盖粘贴即可。 1. 注入到 【Site Header】 在 Site Header 框中复制并完全粘贴以下代码(包含 Tocbot 官方样式与自定义微调

By 樊泽豪
Git Worktree 完全指南:告别分支切换焦虑

Git Worktree 完全指南:告别分支切换焦虑

在多个分支间频繁切换,每次都要重新加载环境、重启服务?git worktree 让你同时拥有多个工作目录,互不干扰,效率翻倍。 为什么需要 Worktree? 日常开发中,我们经常面临这样的场景: * 正在 feature 分支开发新功能,突然要紧急修复 hotfix 分支的 Bug * 想同时对比两个分支的代码差异,或者并行跑两个版本的服务 * 每次切换分支,IDE 都要重新索引,编译缓存失效,等待时间漫长 常规的 git checkout 或 git switch 虽然能切换分支,但同一时间只能在一个分支上工作。如果你切走再切回来,之前的环境(如依赖安装、编译产物)可能已经丢失或需要重建。 git worktree 的解决方案:在同一个 Git 仓库中,创建多个独立的工作目录,每个目录对应不同的分支,它们共享同一个 .git 对象库(

By 樊泽豪