K3S 是 Rancher 为物联网(IoT)和边缘计算环境开发的轻量级 Kubernetes 发行版本。相比原生的 Kubernetes,其移除了很多非必要的组件,例如云控制管理器(CCM)、内置的(In-Tree)的存储插件等,以及为ARM架构的基础设施做了优化。

K3s 的轻量级同时也体现在其打包成一个二进制可执行文件进行分发,状态存储除了支持 etcd 外,还支持 Sqlite3、MySQl和Postgres。其跟多特性可参考官方文档。

K3s 支持单节集群部署(可用于开发测试环境),也支持高可用的多节点集群。同时还可以通过 k3d 项目快速在本地开发环境使用Docker容器部署 k3s 集群作为开发环境。

这里我将演示通过虚拟机部署一个高可用的多节点集群(3个Servers节点 + 3个Agent节点)。

k3S架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3I2DzwSO-1658505658738)(https://k3s.io/img/how-it-works-k3s-revised.svg)]

上图是来自k3s官网的架构图,其架构与Kubernetes的架构是相似的,k3s的server节点也就是控制面节点,agent节点是工作负载节点。k3s默认使用 containerd 作为容器运行时。

更信息的部署架构可参考官方文档。

准备虚拟机节点

这里我们将部署 3 + 3 的集群,需要6台虚拟机,基本配置如下

主机名 IP vCPU 内存
homek3s-server1 192.168.0.150 1 2 GB
homek3s-server2 192.168.0.151 1 2 GB
homek3s-server3 192.168.0.152 1 2 GB
homek3s-agent1 192.168.0.154 2 4 GB
homek3s-agent2 192.168.0.155 2 4 GB
homek3s-agent3 192.168.0.156 2 4 GB

部署的最小需求,可参考官方文档。

K3s 支持大部分主流的Linux操作系统,这里我使用的是 openSUSE Leap Micro 15.2,其是一个基于openSUSE,为容器负载而设计的操作系统。

为了部署简单,这里我们禁用了系统的防火墙,如果开启防火墙,需要为Server节点开放如下端口

  • 6443/TCP - Kubernetes API 服务
  • 8472/UDP - Flannel VXLAN模式需要
  • 51820/UDP - Flannel Wireguard后端需要
  • 10250/TCP - Kubelet metrics需要
  • 2379-2380/TCP - 基于内嵌etcd高可用部署模式需要

启动Server节点

首先登陆到第一个Server节点 homek3s-server1,然后下载最新版本(v1.24.3+k3s1)的 k3s 二进制文件

# curl -sfL https://github.com/k3s-io/k3s/releases/download/v1.24.3%2Bk3s1/k3s -o /usr/local/bin/k3s
# chmod +x k3s
# k3s --version
k3s version v1.24.3+k3s1 (990ba0e8)
go version go1.18.1

k3s 支持一下几个子命令

  • k3s server - 用于运行管理服务节点
  • k3s agent - 用于运行agent工作节点
  • k3s kubectl - 运行 kubectl 命令
  • k3s crictl - 运行 crictl 容器管理命令

其他的命令帮助,请通过 k3s --help 查看。

这里我们将要创建一个使用内置etcd数据库的高可用集群,执行如下命令

# k3s server --cluster-init --advertise-address=192.168.0.150 --tls-san=homek3s.mengz.lan --write-kubeconfig-mode=644

参数 --cluster-init 是使用内置的etcd初始户一个新的集群;
参数 --advertise-address 是指定API服务器的监听IP地址,如果不指定,默认为节点的IP地址;
参数 --tls-san 是指定额外的域名或者IP地址作为TLS证书的SAN,使得我们从客户端可通过域名访问而API服务器。

运行成功后,在 homek3s-server1 打开另一个终端执行

# k3s kubectl get no
NAME              STATUS   ROLES                       AGE   VERSION
homek3s-server1   Ready    control-plane,etcd,master   27h   v1.24.3+k3s1

可以看到,集群中以及运行了一个节点,不过这时k3s服务是启动在前台的,我们需要配置一个 systemd 服务,让其以服务形式运行。
创建文件 /etc/systemd/system/k3s.service,内如如下

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
After=network-online.target
Wants=network-online.target[Service]
Type=notify
EnvironmentFile=-/etc/default/%N
EnvironmentFile=-/etc/sysconfig/%N
EnvironmentFile=-/etc/systemd/system/k3s.service.env
ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'
ExecStart=/usr/local/bin/k3s server
KillMode=process
Delegate=yes
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s[Install]
WantedBy=multi-user.target

终止刚才运行的k3s进程,然后执行

# systemctl enable --now k3s.server# systemctl status k3s
● k3s.service - Lightweight KubernetesLoaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: disabled)Active: active (running) since Fri 2022-07-22 03:31:21 CST; 18h agoDocs: https://k3s.ioProcess: 1121 ExecStartPre=/bin/sh -xc ! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service (code=exited, status=0/SUCCESS)Main PID: 1129 (k3s-server)Tasks: 120CGroup: /system.slice/k3s.service...

这是后k3s进程将以服务的形式运行在后台了。

执行完上述步骤后,k3s将会生产集群的管理员 kubeconfig 文件 - /etc/rancher/k3s/k3s.yaml,可将该文件拷贝的本地环境,修改 server 内容

server: https://127.0.0.1:6443
server: https://192.168.0.150:6443

这样就可以在本地主机上使用 kubectl 访问集群了。

接下来,我们将在其他Server节点上启动k3s,并作为管理节点加入集群,首先在第一个节点 homek3s-server1 上获取到集群的Token

# cat /var/lib/rancher/k3s/server/node-token
K1087c3ff53c94a3c3b20475e84602f1e6d46f1b3903f2979f144800990897b06ac::server:fb8e7aa7ba23d7652942b09cb440ba24

SSH登陆其他Server节点(homek3s-server2homek3s-server3),执行如下步骤

  1. 下载相同版本的 k3s 二进制文件到 /usr/local/bin/k3s

  2. 执行如下命令加入集群

# k3s server --server=https://192.168.0.150:6443 --token=${NODE_TOKEN}

其中 ${NODE_TOKEN} 是上面从第一个节点获取的 Token 内容。

  1. 如第一个节点一样,配置 etc/systemd/system/k3s.service,将k3s进程启动以服务方式启动。

完成上述步骤后,通过 kubectl 查看节点

❯ k get no
NAME              STATUS   ROLES                       AGE   VERSION
homek3s-server1   Ready    control-plane,etcd,master   28h   v1.24.3+k3s1
homek3s-server2   Ready    control-plane,etcd,master   27h   v1.24.3+k3s1
homek3s-server3   Ready    control-plane,etcd,master   27h   v1.24.3+k3s1

启动Agent节点

在启动完3个管理节点(Server)的集群之后,我接下来继续添加工作节点(Agent)到集群中,登陆到3个Agent节点之下如下步骤(3个节点上的操作相同)

  1. 下载相同版本的 k3s 二进制文件到 /usr/local/bin/k3s (方法与Server节点上一样)

  2. 执行如下命令,以工作节点加入集群

# k3s agent --server=https://192.168.0.150:6443 --token=${NODE_TOKEN}

${NODE_TOKEN} 是上面获取的节点Token值。

执行成功之后,也需要将 k3s 的 agent 进程以服务方式启动,这里与Server节点有些不同,创建文件 /etc/systemd/system/k3s-agent.service,内容如下

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
After=network-online.target
Wants=network-online.target[Service]
Type=notify
EnvironmentFile=-/etc/default/%N
EnvironmentFile=-/etc/sysconfig/%N
EnvironmentFile=-/etc/systemd/system/k3s-agent.service.env
ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'
ExecStart=/usr/local/bin/k3s agent --server=${K3S_URL} --token=${K3S_TOKEN}
KillMode=process
Delegate=yes
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s[Install]
WantedBy=multi-user.target

然后再创建文件 /etc/systemd/system/k3s-agent.service.env,内容如下

K3S_URL="https://192.168.0.150:6443"
K3S_TOKEN="K1087c3ff58c94a3c3b20475e84602f8e6d46f1b3903f2979f144800990897b06ac::server:fb8e7aa7ba23d7652942b09cb440ba24"

注意,将以上的 K3S_TOKEN 替换成你的值。
然后执行

# sysetmctl enable --now k3s-agent.service

3个Agent节点都启动完成之后,使用 kubectl 查看节点

❯ k get no
NAME              STATUS   ROLES                       AGE   VERSION
homek3s-agent1    Ready    <none>                      27h   v1.24.3+k3s1
homek3s-agent2    Ready    <none>                      26h   v1.24.3+k3s1
homek3s-agent3    Ready    <none>                      26h   v1.24.3+k3s1
homek3s-server1   Ready    control-plane,etcd,master   28h   v1.24.3+k3s1
homek3s-server2   Ready    control-plane,etcd,master   27h   v1.24.3+k3s1
homek3s-server3   Ready    control-plane,etcd,master   27h   v1.24.3+k3s1

可以看到,我们以及通过K3S部署了一个3+3的高可用Kubernetes集群。

部署应用

成功启动一个K3S集群,除了Kubernetes必要的组件之外,还自动为集群部署以下组件

  • Flennel作为CNI插件
  • rancher-local-path 作为默认的存储类插件
  • Traefik 作为 Ingress 控制器
  • kipper Load Balancer 作为服务的负载均均衡控制器

Traefik的Load Balancer类型的服务就直接通过每个节点的 80 和 443 端口暴露了

❯ k get svc -n kube-system
traefik          LoadBalancer   10.43.66.163   192.168.0.150,192.168.0.151,192.168.0.152,192.168.0.154,192.168.0.155,192.168.0.156   80:30833/TCP,443:32747/TCP   28h

因此,我们可以直接创建应用,并通过Ingress向外暴露服务,这里我们创建一个简单的Web服务,也就是 Docker的教程,创建如下资源文件 docker-tour.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:labels:com.docker.project: tutorialname: tutorial
spec:replicas: 1selector:matchLabels:com.docker.project: tutorialstrategy:type: Recreatetemplate:metadata:labels:com.docker.project: tutorialspec:containers:- image: docker/getting-startedname: tutorialports:- containerPort: 80protocol: TCPresources: {}restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:name: tutorial
spec:ports:- name: 80-tcpport: 80protocol: TCPtargetPort: 80selector:com.docker.project: tutorialtype: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: tutoriallabels:com.docker.project: tutorial
spec:#  ingressClassName: contourrules:- host: "tour.homek3s.lan"http:paths:- pathType: Prefixpath: "/"backend:service:name: tutorialport:number: 80

然后执行

❯ kubectl apply -f docker-tour.yaml

在你的内部DNS服务器,或者 /etc/hosts 中配置域名解析,将 tour.homek3s.lan 解析到任何一个节点的IP地址,如

192.168.0.150   tour.homek3s.lan

通过浏览器访问 https://tour.homek3s.lan/ ,将打开部署的应用。

总结

这里演示了如果通过K3S部署一个高可用的Kubernetes集群,使用k3s内置etcd的方式作为入门,k3s还支持使用外部的数据存储以及其他更多的部署选项,可参考官方文档。K3s作为一个轻量级的kubernetes版本,以了单一的二进制文件 - k3s进行分发,可以快速部署开发测试,以及边缘生产级别的集群。
后期将会继续探索另一款开源的轻量级Kubeernets版本 - K0S。

同时发布在 我的博客

K3S - 轻量级Kubernetes集群相关推荐

  1. 轻量级Kubernetes之k3s:5:集群搭建

    在前面的文章中对k3s进行了一些概要信息和安装选项以及离线安装方式的介绍,这篇文章通过具体的实例来介绍如何使用k3s搭建kubernetes集群. 集群环境准备 hostname IP 内存 硬盘 操 ...

  2. 轻量级Kubernetes之k3s:7:集群一键部署脚本

    使用k3s来进行kubernetes集群部署,对于初学者,相较于vagrant.minikube甚至kubeadm在使用上都会更加流畅.在easypack上封装了一个200行左右的脚本,就可以轻松实现 ...

  3. 使用k3s部署轻量Kubernetes集群快速教程

    k3s是轻量级的Kubernetes.安装简单,占用资源少,只需要512M内存就可以运行起来,所有的二进制程序都不到 100MB. 自 2019 年 3 月发布以来,备受全球开发者们关注.至今,Git ...

  4. 使用 K3s 和 WireGuard 网络快速部署一个多云环境的 Kubernetes 集群

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 每日言论 SQLite 的应用太广泛,测试量也很惊人.每个版本发布之前,都要进行各种单元测试.参数测试.模糊测试, ...

  5. 巧用 K3s 和 Traefik 快速搭建本地 Kubernetes 集群

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 完整的 Kubernetes 集群往往非常复杂,需要较高的资源,往往我们在开发期间需要一个完整的 Kubernet ...

  6. 推荐一款可快速全量交付 Kubernetes 集群分布式应用的神器 Sealer

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 什么是集群镜像 顾名思义,和操作系统 .iso 镜像或 Docker 镜像类似,集群镜像是用一定的技术手段把整个集 ...

  7. 简单部署 rancher 管理kubernetes集群(3)

    rancher 简单使用 运行docker 容器 环境部署 关闭防火墙与selinux systemctl stop firewalld systemctl disable firewalldsed ...

  8. 使用 K3d 在 Docker 中运行 Kubernetes 集群

    K3d是一个围绕 Rancher/SUSE K3s Kubernetes 发行版的开源包装器,可让您在 Docker 中运行控制平面.整个堆栈在 Docker 中运行,为您提供轻量级且易于设置的完全容 ...

  9. 使用Minikube部署本地Kubernetes集群(二十九)

    前言 使用Minikube部署本地k8s集群相对比较简单,非常推荐将其用于本地k8s开发环境,唯一麻烦点的仅仅是网络问题. 在本篇教程中,我们使用了国内的镜像来完成本地k8s集群的搭建.如果搭建过程中 ...

最新文章

  1. 编译与部署dubbo管控平台dubbo-admin
  2. WPF:Animation动画--AnimationTiming动画时机
  3. 网络编程套接字(一)
  4. 动态规划 dynamic programming
  5. fiddler抓包1-抓小程序https包
  6. java中double类型占几个字节_Java中基本数据类型占几个字节多少位
  7. JavaScript 模块化编程
  8. 南方cass提取坐标生成表格_如何在CAD中或者CASS中将坐标导入到EXCEL表格(个人笔记)...
  9. 怎么修改MAC电脑名字,三步教你修改MAC电脑的名字
  10. HTML中svg的作用,html中的svg可以用来干什么
  11. 【Android】安卓webview播放视频白屏解决方法
  12. windows任务栏透明_如何使Windows 10任务栏完全透明
  13. 数澜科技X浙江优创:推动平台应用双向融合,共建金融生态合作新标杆
  14. 企业邮箱如何设置邮件模板
  15. Allegro16.6 DXF导入生成板框
  16. lua菜鸟教程_初学者必看:Lua入门学习教程
  17. Android最火的开源项目
  18. MySQL如何查看当前表结构
  19. 三级等保备案去哪查_民贷天下通过国家信息安全等级保护三级备案
  20. 青岛海尔2018年实现净利润74.4亿元 净利率约4.06%

热门文章

  1. Win10+Qt4.8.5+Opencv2.4.3+QtCreator3.0.0
  2. iPhone11霸占高端手机市场,安卓手机难望其项背
  3. Java 数据转换/进制转换 工具类
  4. camus执行任务,偶发性异常
  5. FlowLayout的使用
  6. 强连通分量 圆桌骑士
  7. Qt使用QAudioInput、QAudioOutput实现局域网的音频通话
  8. android land,Mirror Land
  9. Linux下 C 遍历目录(opendir,readdir函数)
  10. 一个开源的网易云音乐api项目