1 概述:

1.1 k3s是什么

k3s是经CNCF一致性认证的Kubernetes发行版,专为物联网及边缘计算设计。K3s 有以下增强功能:

  • 打包为单个二进制文件。
  • 使用基于sqlite3的轻量级存储后端作为默认存储机制(v1.19开始使用内置etcd)。同时支持使用 etcd3、MySQL 和 PostgreSQL 作为存储机制。
  • 封装在简单的启动程序中,通过该启动程序处理很多复杂的 TLS 和选项。
  • 默认情况下是安全的,对轻量级环境有合理的默认值。
  • 添加了简单但功能强大的batteries-included功能,例如:本地存储提供程序,服务负载均衡器,Helm controller 和 Traefik Ingress controller。
  • 所有 Kubernetes control-plane 组件的操作都封装在单个二进制文件和进程中,使 K3s 具有自动化和管理包括证书分发在内的复杂集群操作的能力。
  • 最大程度减轻了外部依赖性,K3s 仅需要 kernel 和 cgroup 挂载。 K3s 软件包需要的依赖项包括:
  • containerd(作为k3s-server或k3s-agent的子进程)
  • Flannel(作为k3s-server的线程)
  • CoreDNS(以pod的形式存在于集群中)
  • CNI
  • 主机实用程序(iptables、socat 等)
  • Ingress controller(Traefik)
  • 嵌入式服务负载均衡器(service load balancer)
  • 嵌入式网络策略控制器(network policy controller)


1.2 适用场景

K3s 适用于以下场景:

  • 边缘计算-Edge
  • 物联网-IoT
  • Development
  • ARM
  • 嵌 K8s


1.3 架构图

1.3.1 精简版

单机部署etcd docker_单机部署etcd docker


1.3.2 单master架构图

单机部署etcd docker_bc_02


1.3.3 高可用架构图

单机部署etcd docker_bc_03


2 单进程的细节

2.1 原k8s控制面板组件以线程形式存在

kubernetes控制面板中的组件(kube-apiserver、kube-scheduler、kube-controller-manager)、kube-proxy服务、flannel服务等是以进程形式存在节点上,在k3s,控制面板组件以系统线程形式存在。在代码中则是以协程方式启动组件。

单机部署etcd docker_bc_04

单机部署etcd docker_k3s_05


单进程k3s server下有着多个线程,其实它们就是kube-apiserver等。

单机部署etcd docker_docker_06


2.2 containerd以子进程形式存在

containerd是k3s默认的容器运行时,k3s server和k3s agent以子进程方式执行自带的containerd二进制文件(位于/var/lib/rancher/k3s/data/xxxxx/bin/目录下),因此containerd是k3s server或k3s agent的子进程。

单机部署etcd docker_单机部署etcd docker_07

单机部署etcd docker_k3s_08


通过ps命令,可见containerd是k3s server进程的子进程。

单机部署etcd docker_docker_09


containerd二进制文件位于:/var/lib/rancher/k3s/data/77457d0b09d8b94d6f5029bcbc70f94b7ae9c50a08b539b76612e713ea818256/bin/目录下,可见它是k3s自带的。

[root@edge02 tmp]# lsof -p 8452 | grep containerd
container 8452 root  txt       REG              253,0 125747904  67178187 /var/lib/rancher/k3s/data/77457d0b09d8b94d6f5029bcbc70f94b7ae9c50a08b539b76612e713ea818256/bin/containerd
container 8452 root  mem-W     REG              253,0    262144 100961995 /var/lib/rancher/k3s/agent/containerd/io.containerd.metadata.v1.bolt/meta.db
container 8452 root  mem-W     REG              253,0     65536 100962004 /var/lib/rancher/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/metadata.db
container 8452 root    7uW     REG              253,0    262144 100961995 /var/lib/rancher/k3s/agent/containerd/io.containerd.metadata.v1.bolt/meta.db
container 8452 root   13u     unix 0xffff8ad44529d400       0t0    477044 /run/k3s/containerd/containerd.sock.ttrpc
container 8452 root   14u     unix 0xffff8ad44529cc00       0t0    477046 /run/k3s/containerd/containerd.sock



3 部署

3.1 部署环境

3.1.1 版本信息如下:

a、操作系统:centos 7.6
b、内核: 3.10
c、k3s版本:v1.21.1+k3s1

3.1.2 节点列表

IP地址

主机名

角色

192.168.101.177

edge01

master1

192.168.101.178

edge02

master2

192.168.101.179

edge03

master3

192.168.101.180

edge04

worker1


3.1.3 介质要求(在每个节点上执行)

需要下载k3s二进制文件,安装脚本k3s.sh,以及包含coredns等镜像的k3s-airgap-images-amd64.tar.gz。

cd /opt
wget https://github.com/k3s-io/k3s/releases/download/v1.21.1%2Bk3s1/k3s
wget https://github.com/k3s-io/k3s/releases/download/v1.21.1%2Bk3s1/k3s-airgap-images-amd64.tar.gz
curl -sfL https://get.k3s.io > k3s.sh



3.2 安装命令

3.2.1 master1执行的命令

# 位于master1
# master1的ip为192.168.101.177
cd /opt/
/bin/cp -f k3s /usr/local/bin/
chmod 755 k3s.sh
export INSTALL_K3S_VERSION=v1.21.1+k3s1
export INSTALL_K3S_EXEC="--cluster-init --disable traefik --disable-cloud-controlle --disable-network-policy"
export INSTALL_K3S_SKIP_DOWNLOAD=true
./k3s.sh server
gzip -d k3s-airgap-images-amd64.tar.gz
k3s ctr --namespace k8s.io image import k3s-airgap-images-amd64.tar
# token位于/var/lib/rancher/k3s/server/token文件
cat /var/lib/rancher/k3s/server/token
# 得知token为 K10e0d390ffe95e47bafc96eb6d4582796aa14f1486030731063d8f477713e194a4::server:c466dbcea8301a88ba669a8dfebfcfdf

token位于/var/lib/rancher/k3s/server/token文件,得知token为 K10e0d390ffe95e47bafc96eb6d4582796aa14f1486030731063d8f477713e194a4::server:c466dbcea8301a88ba669a8dfebfcfdf



3.2.2 master2执行的命令

# 位于master2
# master1的ip为192.168.101.177
cd /opt/
/bin/cp -f k3s /usr/local/bin/
chmod 755 k3s.sh
export K3S_MASTER_IP=192.168.101.177
export INSTALL_K3S_VERSION=v1.21.1+k3s1
export INSTALL_K3S_SKIP_DOWNLOAD=true
export K3S_URL=https://${K3S_MASTER_IP}:6443
export K3S_TOKEN="K10e0d390ffe95e47bafc96eb6d4582796aa14f1486030731063d8f477713e194a4::server:c466dbcea8301a88ba669a8dfebfcfdf"
./k3s.sh server
gzip -d k3s-airgap-images-amd64.tar.gz
k3s ctr --namespace k8s.io image import k3s-airgap-images-amd64.tar



3.2.3 master3执行的命令

#位于master3
#master1的ip为192.168.101.177
cd /opt/
/bin/cp -f k3s /usr/local/bin/
chmod 755 k3s.sh
export K3S_MASTER_IP=192.168.101.177
export INSTALL_K3S_VERSION=v1.21.1+k3s1
export INSTALL_K3S_SKIP_DOWNLOAD=true
export K3S_URL=https://${K3S_MASTER_IP}:6443
export K3S_TOKEN="K10e0d390ffe95e47bafc96eb6d4582796aa14f1486030731063d8f477713e194a4::server:c466dbcea8301a88ba669a8dfebfcfdf"
./k3s.sh server
gzip -d k3s-airgap-images-amd64.tar.gz
k3s ctr --namespace k8s.io image import k3s-airgap-images-amd64.tar



3.2.4 worker1执行的命令

# 位于worker1
# master1的ip为192.168.101.177
export K3S_MASTER_IP=192.168.101.177
export INSTALL_K3S_VERSION=v1.21.1+k3s1
export INSTALL_K3S_SKIP_DOWNLOAD=true
export K3S_URL=https://${K3S_MASTER_IP}:6443
export K3S_TOKEN="K10e0d390ffe95e47bafc96eb6d4582796aa14f1486030731063d8f477713e194a4::server:c466dbcea8301a88ba669a8dfebfcfdf"
./k3s.sh agent
gzip -d k3s-airgap-images-amd64.tar.gz
k3s ctr --namespace k8s.io image import k3s-airgap-images-amd64.tar



4 效果

单机部署etcd docker_bc_10


5 总结

本文介绍了在centos7上以离线方式部署k3s集群的过程,并从ps等系统命令和部分源码两方面解释k3s是将原本以进程形式存在的控制面板组件以线程形式启动,自带containerd运行时,containerd是k3s进程的子进程。