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的使用請參照官網