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 精简版
1.3.2 单master架构图
1.3.3 高可用架构图
2 单进程的细节
2.1 原k8s控制面板组件以线程形式存在
kubernetes控制面板中的组件(kube-apiserver、kube-scheduler、kube-controller-manager)、kube-proxy服务、flannel服务等是以进程形式存在节点上,在k3s,控制面板组件以系统线程形式存在。在代码中则是以协程方式启动组件。
单进程k3s server下有着多个线程,其实它们就是kube-apiserver等。
2.2 containerd以子进程形式存在
containerd是k3s默认的容器运行时,k3s server和k3s agent以子进程方式执行自带的containerd二进制文件(位于/var/lib/rancher/k3s/data/xxxxx/bin/目录下),因此containerd是k3s server或k3s agent的子进程。
通过ps命令,可见containerd是k3s server进程的子进程。
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 效果
5 总结
本文介绍了在centos7上以离线方式部署k3s集群的过程,并从ps等系统命令和部分源码两方面解释k3s是将原本以进程形式存在的控制面板组件以线程形式启动,自带containerd运行时,containerd是k3s进程的子进程。