k3s介绍及部署
1 K3S的介绍
k3s 是 经过CNCF认证的由Rancher公司开发维护的一个轻量级的 Kubernetes 发行版 内核机制还是和k 8s 一样,但是剔除了很多外部依赖以及 K8s 的 alpha 、beta 特性,同时改变了部署方式和运行方式,目的是轻量化 K8s 简单来说, K3s就是阉割版 K8s,消耗资源极少 。它主要用于边缘计算 、物联网等场景。K3s 具有以下特点
---:安装简单, 占用资源少 只需要 512 M 内存就可以运行起来
---:apiserver 、 schedule 等组件全部简化,并以进程的形式运行在节点上 把程序都 打包为单个二进制文件 每个程序只需要占用 100M 内存
---:使用基于 sqlite3 的轻量级存储后端作为默认存储机制。同时支持使用 etcd3 、 MySQL 和 PostgreSQL作为存储机制
---:默认使用 local path provisioner 提供本地存储卷
---:默认安装了 Helm controller 和 Traefik Ingress controller
---:所有 Kubernetes control plane 组件的操作都封装在单个二进制文件和进程中,使 K3s 具有自动化和管理包括证书分发在内的 复杂集群操作的能力。
---:减少外部依赖,操作系统只需要安装较新的内核(centos7.6就可以,不需要升级内核)以及支持cgroup即可k3s安装包已经包含了 containerd、Flannel、CoreDNS,非常方便地一键式安装,不需要额外安装Docker、Flanne等组件。
1)边缘计算介绍
边缘计算也称为边缘处理,是一种将服务器放置在本地设备附近的 网络技术 解决数据传输的延迟问题。这样的处理 方式 是在传感器附近或 者 设备产生数据的位置进行的,因此称之为边缘。
“边缘”特指计算资源在地理分布上更加靠近设备,而远离云数据中心的资源节点。典型的边缘计算分为物联网(例如:智慧城市,智能家居,大型商店等)和非物联网(例如:游戏,CDN 等)场景。
举个例子:原来取钱存钱 ,必须去银行排队,那现在我们在住的附近有自动取款机,可以直接取钱,减少了排队等待时间,还能就近解决,更加安全
2)边缘计算应用场景
《福布斯》技术委员会的12 位成员研究了一些企业的用例,在这些用例中, 都使用了边缘计算:
应用一:改进医疗设备性能和数据管理
在医疗场景下,边缘计算主要帮助医疗保健体系的IT基础架构,具体来说,是防止医疗设备管理的应用程序发生延迟。在边缘计算的支持下,无需构建集中的数据中心,可对关键数据进行本地化,在安全性、响应速度和有效性上有更佳表现。
应用二:本地零售的实时数据分析
边缘计算的主要目的,是让运算尽可能接近数据源。在零售场景中,以往企业都是将各分支的数据汇总到中心位置进行分析,再进行决策和行动。而通过边缘计算,零售店铺可以在本地就进行数据处理和优化,这样组织的行动反馈就能更快更及时。
应用三:消费者数据隐私
处理高度敏感的消费者 数据的公司发现,由于数据泄漏成本高昂,云计算很危险。因此,许多这类公司 正在将边缘计算用于处理消费者数据,因为它为他们提供了更多的安全和控制选择。这可能会使企业工作流程复杂化,但它可以带来好处,特别是在医疗数据公司中。 Sean Byrnes, Outlier
应用四: 物联网
物联网是企业为获得更好的数据、客户体验、现场营销和更智能的流程而实施的智能的重大转变。边缘计算使网络的运行水平能够为物联网提供高性能。接近实时的速度意味着用户体验可以非常出色,并且可以为企业带来更好、更有效的运营。Frank Cit tadino, QOS Networks
应用五: 视频监控和分析
视频监控已经部署在边缘,以及视频分析。视频产生的数据是所有其他来源数据总和的 10 倍。这是一个很好的例子,说明您需要在数据中心之外开始处理的数据类型,以最大限度地减少通过网络移动和存储的数据量。此外,它还允许企业对可操作的数据做出实时决策 Bill Galloway Pivot3 Inc.
应用六:工业操作
工厂车间处理等工业操作需要海量数据的快速响应。这些数据中的大部分被丢弃,但能够通过检测边缘数据中的异常来使工厂操作员能够及时对工厂车间的 问题做出反应。这样可以间接减少停机从而提高生产率。 Randal Kenworthy Cognizant
应用七: 智能建筑
随着我们的会议室和设施变得越来越智能化,将会有一种把所有东西都放到云端的诱惑。考虑到安全性和稳定性,在站点上托管数据将会有一些好处。我们已经看到了基于云的照明在网络中断时可能会令人沮丧的问题,而工作场所的可靠性甚至更重要。 Luke Wallace, Bottle Rocket
应用八: 无人驾驶汽车
汽车行业已投入数十亿资金开发边缘计算技术。为了安全运行,这些车辆需要收集和分析有关其 周围环境,方向和天气状况的大量数据,以及与道路上的其他车辆进行通信。 Arnie Gordon Arlyn Scales
应用九: 机顶盒
Edge AI 可以在机顶盒设备上运行一个低占用空间的智能引擎,可以实时分析数据,对 AI 进行编码,在本地解决问题并向上游服务器提供智能反馈。与基本自动化(边缘机器人流程自动化机器人)相结合,AI 引擎可以自我修复并在本地解决许多问题。 Ankur Garg Hotify Inc.
1.2 为什么叫做K3S
我们希望安装的Kubernetes 在内存占用方面只是 原来 一半的大小。Kubernetes是一个10个字母的单词 ,简写为 k8s 所以,Kubernetes 一半大的东西就是有 5 个字母的单词,简写为 K3S。K3S没有全称,也没有官方的发音。
K3s适用于以下场景:
边缘计算 Edge
物联网 IoT
CI:持续集成
Development:开发
ARM
嵌入K8s
由于运行K3s 所需的资源相对较少,所以 K3s 也适用于开发和测试场景。在这些场景中,如果开发或测试人员需要对某些功能进行验证,或对某些问题进行重现,那么使用 K3s 不仅能够缩短启动集群的时间,还能够减少集群需要消耗的资源。与此同时, Rancher 中国团队推出了一款针对 K3s 的效率提升工具: AutoK3s 。只需要输入一行命令,即可快速创建 K3s 集群并添加指定数量的 master 节点和 worker节点。
ARM介绍:
ARM64和 ARMv7 都支持二进制文件和多源镜像。 k3s 在小到树莓派或大到 AWS a1.4xlarge 32GiB 服务器的环境中均能出色工作。
1.3 K3S架构
1)单节点 的 k3s 架构
k3s server节点是运行k3s server命令的机器(裸机或者虚拟机),而k3s Agent 节点是运行k3s agent命令的机器。
单点架构只有一个控制节点(在 K3s 里叫做server node,相当于 K8s 的 master node),而且K3s的数据存储使用 sqlite 并内置在了控制节点上
在这种配置中,每个 agent 节点都注册到同一个 server 节点。K3s 用户可以通过调用server节点上的K3s API来操作Kubernetes资源。
2)高可用 的 K3S 架构
虽然单节点k3s 集群可以满足各种用例,但对于 Kubernetes control plane 的正常运行至关重要的环境,可以在高可用配置中运行 K3s 。一个高可用 K3s 集群由以下几个部分组成:
---:K3s Server 节点 两个或者更多的server节点将为 Kubernetes API 提供服务并运行其他 control-plane 服务
---:外部数据库 外部数据存储(与单节点 k3s 设置中使用的嵌入式 SQLite 数据存储相反)
3)边缘计算应用案例 分析
在进行信息化、智能化改造的过程中,首先第一步,就是要获取底层系统的全方位的数据。因此 需要部署大量的边缘设备来采集数据、分析数据,通过这些数据进行建模,大量的边缘设备一般离散的分布在不同机房、厂区、甚至是不同的地理区域 。
需求 运维角度来讲:
---:管理这些边缘设备,保持边缘设备上运行的服务的高可用性;
---:快速的上线、升级
---:配置的快速更改与应用
以上案例来自曾永杰,上海全应科技有限公司运维经理,曾在华为西安研究所云计算部门承担软件测试工程师、项目交付、线上运维等工作职责,当前工作主要为 CI/CD 流程的建设与维护、应用的容器化改革和容器云平台的运维管理
2 K3S和K8S之间的区别
K8s和 k3s 各有优劣。若是你要进行大型的集群部署,建议你选择使用 K8s ;若是你处于边缘计算等小型部署的场景或仅仅须要部署一些非核心集群进行开发 测试,那么选择 k3s 则是性价比更高的选择。
---:云计算场景用k8s
---:边缘计算场景用 k3s
在实际的应用部署中,几乎没有任何差异,至少到目前为止,一般k8s能满足的场景,k3s也能满足,相信,通过不断的迭代,k3s在未来会更完善边缘场景。
3 K3S的安装部署
3.1 环境介绍
安装k3s服务的操作系统要求:
---:Linux 的内核版本在3.10以上
---:每台服务器上至少要有512MB的内存空间
---:硬盘中可用的存储空间必须大于500 MB
集群角色 | IP地址 | 安装组件 | 配置 |
---|---|---|---|
Server | 10.0.0.10 | K3s-server、containerd | 2C2G |
Agent | 10.0.0.11 | K3s-agent、containerd | 2C2G |
Agent | 10.0.0.12 | K3s-agent、containerd | 2C2G |
3.2 节点初始化(所有节点)
# 关闭防火墙
systemctl disable firewalld --now
# 关闭selinux
setenforce 0 && sed -i 's/enforcing/disabled/' /etc/selinux/config
# 关闭swap
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
# 根据规划设置主机名
hostnamectl set-hostname k3s-agent-02
# 将集群节点添加到hosts文件
cat <<EOF>> /etc/hosts
10.0.0.10 k3s-server-01
10.0.0.11 k3s-agent-01
10.0.0.12 k3s-agent-02
EOF
#时间同步
yum install chrony -y
systemctl enable chronyd
systemctl start chronyd
chronyc sources -v
#添加内核模块
cat <<EOF >> /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
#加载内核模块
modprobe overlay
modprobe br_netfilter
# 将桥接的IPv4 流量传递到iptables 的链
cat <<EOF >>/etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sysctl --system # 生效
#依赖工具安装
yum install -y yum-utils device-mapper-persistent-data lvm2 wget vim yum-utils net-tools epel-release
3.3 安装containerd(所有节点)
1)添加yum仓库
# 阿里云源
cat <<EOF >> /etc/yum.repos.d/docker-ce.repo
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
2)安装并启动
yum -y install containerd.io-1.4.4-3.1.el7.x86_64
systemctl enable containerd --now
#配置containerd
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改cgroup Driver为systemd
sed -i '/runc.options/a\ SystemdCgroup = true' /etc/containerd/config.toml && \
grep 'SystemdCgroup = true' -B 7 /etc/containerd/config.toml
# endpoint位置添加阿里云的镜像源
$ vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry.cn-hangzhou.aliyuncs.com" ,"https://registry-1.docker.io"]
# 更改sandbox_image
$ vim /etc/containerd/config.toml
...
[plugins."io.containerd.grpc.v1.cri"]
disable_tcp_service = true
stream_server_address = "127.0.0.1"
stream_server_port = "0"
stream_idle_timeout = "4h0m0s"
enable_selinux = false
selinux_category_range = 1024
# 将这里改为aliyun的镜像源
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
...
#重启containerd
systemctl enable containerd && systemctl start containerd
3)查看安装版本信息
ctr -version
4)containerd 常用命令
# 镜像
# 容器
# 其他指令
3.4 安装Server节点
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
sh -
#安装完成
Complete!
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s.service
[INFO] systemd: Enabling k3s unit
[INFO] systemd: Starting k3s
#开机自启
systemctl enable k3s --now
# 验证是否安装成功
k3s kubectl get nodes
# 查看系统服务启动状态
k3s kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system metrics-server-86cbb8457f-cltlf 1/1 Running 0 4m24s
kube-system coredns-7448499f4d-49f9x 1/1 Running 0 4m24s
kube-system local-path-provisioner-5ff76fc89d-hqgc4 1/1 Running 0 4m24s
kube-system helm-install-traefik-crd-j2q4f 0/1 Completed 0 4m24s
kube-system helm-install-traefik-h7bzb 0/1 Completed 1 4m24s
kube-system svclb-traefik-t2wrj 2/2 Running 0 3m31s
kube-system traefik-6b84f7cbc-2gnh7 1/1 Running 0 3m31s
3.5 提取join token
添加worker节点时。需要一个 join token 。 Join token 存在于master 节点的文件系统上。
cat /var/lib/rancher/k3s/server/node-token
3.6 安装agent节点
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn K3S_URL=https://10.0.0.10:6443 \
K3S_TOKEN=K10db4c785efcdf0a2f75717e7c2e5afdc371877fd829216e42446f58a9d7c5eded::server:138ddfea35b42e6a6810bc4ba730497b \
sh -
#k3s-agent-01
Complete!
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service
[INFO] systemd: Enabling k3s-agent unit
[INFO] systemd: Starting k3s-agent
#k3s-agent-02
Complete!
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service
[INFO] systemd: Enabling k3s-agent unit
[INFO] systemd: Starting k3s-agent
#查看节点信息
k3s kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-server-01 Ready control-plane,master 44m v1.21.7+k3s1
k3s-agent-01 Ready <none> 26m v1.21.7+k3s1
k3s-agent-02 Ready <none> 42s v1.21.7+k3s1
#配置加速源
拷贝配置文件,原文件不要删除
cp /var/lib/rancher/k3s/agent/etc/containerd/config.toml /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl
修改配置文件
/var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl最后增加以下配置
[plugins.cri.registry.mirrors]
[plugins.cri.registry.mirrors."docker.io"]
endpoint = ["https://vcw3fe1o.mirror.aliyuncs.com"]
重启k3s使配置生效
systemctl restart k3s
验证
[root@k3s-server-01 ~]# crictl info|grep -A 5 registry
"registry": {
"mirrors": {
"docker.io": {
"endpoint": [
"https://vcw3fe1o.mirror.aliyuncs.com"
],
4 K3S部署应用演示
cat <<eof >>./nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
apiVersion: v1
kind: Namespace
metadata:
name: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: nginx
spec:
selector:
app: nginx
type: ClusterIP
ports:
- port: 80
targetPort: 80
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nginx
namespace: nginx
spec:
entryPoints:
- web
routes:
- match: Host(`nginx.duxt.com`) && PathPrefix(`/`)
kind: Rule
services:
- name: nginx
port: 80
eof
[root@k3s-server-01 ~]# k3s kubectl apply -f nginx.yaml
namespace/nginx configured
deployment.apps/nginx configured
service/nginx configured
ingressroute.traefik.containo.us/nginx configured
[root@k3s-server-01 ~]# k3s kubectl get pod,svc,ingressroute -n nginx
NAME READY STATUS RESTARTS AGE
pod/nginx-75b69bd684-zm4hr 1/1 Running 0 5m13s
pod/nginx-75b69bd684-sl5pp 1/1 Running 0 5m13s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx ClusterIP 10.43.17.157 <none> 80/TCP 5m13s
NAME AGE
ingressroute.traefik.containo.us/nginx 5m12s
#持久化与k8s一致这里就不部署了详细的 Traefik的使用请参照官网