作者:SRE運維部落格
部落格地址: https://www.cnsre.cn/
雙十一各大雲廠商紛紛撒種子種韭菜(搶使用者),良心雲
也是一如既往的良心,新使用者更是通過某寶 148
就可以買到三年 2C4G8M
的輕量應用伺服器。於是我也出售薅了羊毛入手了一臺。
但是對於各種元件本身就對資源消耗比較大的 k8s
來說,跑起來還是有點費力的,於是我打算將這臺例項部署一臺輕量級的 Kubernetes
: k3s
k8s VS k3s
k3s 是 Rancher 推出的輕量級 k8s。k3s 本身包含了 k8s 的原始碼,而二進位制包卻只有 60M
但是本質上和 k8s 沒有區別。但為了降低資源佔用,k3s 和 k8s 還是有一些區別的,主要是:
- 使用了相比 Docker 更輕量的 containerd 作為容器執行時(Docker 並不是唯一的容器選擇)。
- 去掉了 k8s 的 Legacy, alpha, non-default features。
- 用 sqlite3 作為預設的儲存,而不是 etcd。
- 其他的一些優化,最終 k3s 只是一個 binary 檔案,非常易於部署。、
所以 k3s 適用於邊緣計算,IoT 等資源緊張的場景。同時 k3s 也是非常容易部署的,官網上提供了一鍵部署的指令碼。
k3s的優點
- k3s將安裝Kubernetes所需的一切打包進僅有60MB大小的二進位制檔案中,並且完全實現了Kubernetes API。為了減少執行Kubernetes所需的記憶體,Rancher刪除了很多不必要的驅動程式,並用附加元件對其進行替換。
- k3s是一款完全通過CNCF認證的Kubernetes發行版,這意味著你可以編寫YAML來對完整版的Kubernetes進行操作,並且它們也將適用於k3s叢集。
- 由於它只需要極低的資源就可以執行,因此它能夠在任何512MB RAM以上的裝置上執行叢集,換言之,我們可以讓pod在master和節點上執行。
k3s的缺點
- 首先,當前k3s的版本(k3s v0.8.1)僅能執行單個master,這意味著如果你的master當機,那麼你就無法管理你的叢集,即便已有叢集要繼續執行。但是在k3s v0.10的版本中,多主模式已經是實驗性功能,也許在下一個版本中能夠GA。
- 其次,在單個master的k3s中,預設的資料儲存是SQLite,這對於小型資料庫十分友好,但是如果遭受重擊,那麼SQLite將成為主要痛點。但是,Kubernetes控制平面中發生的更改更多是與頻繁更新部署、排程Pod等有關,因此對於小型開發/測試叢集而言,資料庫不會造成太大負載。
結論
K8s和k3s各有優劣,使用場景也有所區別,因此不能一概而論。如果你要進行大型的叢集部署,那麼我建議你選擇使用K8s;
如果你像我一樣只是為了開發或者測試,那麼選擇k3s則是價效比更高的選擇。
安裝 k3s
確保你是一臺乾淨的 CentOS7
伺服器。
按照慣例先更新,更新前順便把源換為國內的yum源。
# 改國內yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 更新
yum update -y
修改主機名
hostnamectl set-hostname k3s-master
修改完畢後,斷開重連一下。
{{< alert theme="warning" dir="ltr" >}}
⚠️ 注意
K3s 預設將使用 containerd
作為容器環境,請在下邊選擇 使用Docker安裝
或者使用Containerd安裝
。
{{< /alert >}}
{{< tabs 使用docker安裝 使用containerd安裝>}}
{{< tab >}}
使用 docker 安裝
# 安裝 docker-ce
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
# 解決核心檢查問題 重啟生效
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
systemctl enable docker
systemctl start docker
# 修改 docker 源
cat << EOF > /etc/docker/daemon.json
{
"registry-mirrors":["https://3laho3y3.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
# 安裝 docker 結束
# 關 firewalld 防火牆
systemctl stop firewalld
systemctl disable firewalld
# 安裝 k3s
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - --docker
{{< /tab >}}
{{< tab >}}
使用 containerd 安裝
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
{{< /tab >}}
{{< /tabs >}}
安裝完檢查
安裝完成後,可以執行以下命令進行主機檢查。
# 執行配置檢查
k3s check-config
# 檢視節點狀態以及 k3s 版本
[root@k3s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
vm-16-8-centos Ready control-plane,master 52m v1.21.5+k3s2
# 檢視所有 pod 資訊
[root@k3s-master ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system local-path-provisioner-5ff76fc89d-bbps4 1/1 Running 0 52m
kube-system coredns-7448499f4d-42v9x 1/1 Running 0 52m
kube-system metrics-server-86cbb8457f-xqlrg 1/1 Running 0 52m
kube-system helm-install-traefik-crd-9wk9v 0/1 Completed 0 52m
kube-system helm-install-traefik-d8llf 0/1 Completed 3 52m
kube-system svclb-traefik-jqxvf 2/2 Running 0 49m
kube-system traefik-97b44b794-wv6zv 1/1 Running 0 49m
截止到這裡 k3s 已經安裝完畢。
安裝 nfs
安裝 nfs 服務
yum -y install nfs-utils
systemctl start nfs && systemctl enable nfs
建立nfs目錄
mkdir -p /home/k8s/nfs
修改許可權
chmod -R 755 /home/k8s/nfs
編輯export檔案
cat >>/etc/exports << EOF
/home/k8s/nfs *(rw,no_root_squash,sync)
EOF
配置生效
exportfs -r
啟動rpcbind、nfs服務
systemctl restart rpcbind && systemctl enable rpcbind
systemctl restart nfs && systemctl enable nfs
到這裡 k3s 以及 nfs 已經安裝完成,下面就可以去體驗了。
如果想以上都比較麻煩,你可以用下面的一鍵安裝指令碼來執行
一鍵安裝 k3s 指令碼
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
LANG=en_US.UTF-8
RD="\033[31m" # 錯誤訊息
GR="\033[32m" # 成功訊息
YL="\033[33m" # 告警訊息
BL="\033[36m" # 日誌訊息
PL='\033[0m'
clear
echo -e "${YL}##################################################${PL}"
echo -e "${YL}#${PL} ${GR}指令碼名稱${PL}: 一鍵安裝 k3s 指令碼 ${YL}#${PL}"
echo -e "${YL}#${PL} ${GR}作 者${PL}: sre運維部落格 ${YL}#${PL}"
echo -e "${YL}#${PL} ${GR}網 址${PL}: https:www.cnsre.cn ${YL}#${PL}"
echo -e "${YL}#${PL} ${GR}文章地址${PL}: https://cnsre.cn/posts/211109907029/ ${YL}#${PL}"
echo -e "${YL}##################################################${PL}"
sleep 0.5
set -e
echo
echo
echo
echo -e "${RD}是否確定安裝 dockerb版本的 k3s? ${PL}"
read -r -p "確定請按 y 任意鍵則退出!請選擇:[y/n]" input
if [[ $input != "y" ]]; then
exit 1
else
echo -e "$GR正在開始安裝 dockerb版本的 k3s$PL"
fi
if [ `command -v docker` ];then
echo -e "${YL}docker 已經安裝,正在新增docker加速源${PL}"
else
echo -e "${GR}install docker${PL}"
curl https://download.daocloud.io/docker/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
yum -y install https://download.daocloud.io/docker/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
curl -fsSL https://get.daocloud.io/docker | bash -s docker --mirror Aliyun
fi
sudo mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["http://f1361db2.m.daocloud.io"]
}
EOF
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
if [ `command -v k3s` ];then
echo -e "${YL}k3s 已經安裝${PL}"
exit 1
else
export K3S_NODE_NAME=${HOSTNAME//_/-}
export INSTALL_K3S_EXEC="--docker --kube-apiserver-arg service-node-port-range=1-65000 --no-deploy traefik --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 666"
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
fi
echo -e "${GR}export K3S_TOKEN=$(cat /var/lib/rancher/k3s/server/node-token)${PL}"
echo -e "${GR}export K3S_URL=https://$(ip addr | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -E -v "^127\.|^255\.|^0\." | head -n 1):6443${PL}"
echo -e "${GR}安裝結束,請重啟伺服器${PL}"
read -r -p "確定請按 y 任意鍵則退出!請選擇:[y/n]" input
if [[ $input != "y" ]]; then
reboot
else
exit 1
fi
作者:SRE運維部落格
部落格地址: https://www.cnsre.cn/