繼 K3s 之后,又來個(gè) K0s...

最近兩年一直在使用 kubeadm 部署 kubernetes 集群,總體來說配合一些自己小腳本還有一些自動(dòng)化工具還算是方便;但是全容器化穩(wěn)定性確實(shí)擔(dān)憂,也遇到過莫名其妙的證書過期錯(cuò)誤,最后重啟大法解決這種問題;所以也在探索比較方便的二進(jìn)制部署方式,比如這個(gè) k0s。
一、k0s 介紹
The Simple, Solid & Certified Kubernetes Distribution.
k0s 可以認(rèn)為是一個(gè)下游的 Kubernetes 發(fā)行版,與原生 Kubernetes 相比,k0s 并未閹割大量 Kubernetes 功能;k0s 主要閹割部分基本上只有樹內(nèi) Cloud provider,其他的都與原生 Kubernetes 相同。
k0s 自行編譯 Kubernetes 源碼生成 Kubernetes 二進(jìn)制文件,然后在安裝后將二進(jìn)制文件釋放到宿主機(jī)再啟動(dòng);這種情況下所有功能幾乎與原生 Kubernetes 沒有差異。
二、k0sctl 使用
k0sctl 是 k0s 為了方便快速部署集群所提供的工具,有點(diǎn)類似于 kubeadm,但是其擴(kuò)展性要比 kubeadm 好得多。在多節(jié)點(diǎn)的情況下,k0sctl 通過 ssh 鏈接目標(biāo)主機(jī)然后按照步驟釋放文件并啟動(dòng) Kubernetes 相關(guān)服務(wù),從而完成集群初始化。
2.1、k0sctl 安裝集群
安裝過程中會(huì)自動(dòng)下載相關(guān)鏡像,需要保證所有節(jié)點(diǎn)可以扶墻,如何離線安裝后面講解。**安裝前保證目標(biāo)機(jī)器的 hostname 為非域名形式,否則可能會(huì)出現(xiàn)一些問題。**以下是一個(gè)簡單的啟動(dòng)集群示例:
首先安裝 k0sctl
# 安裝 k0sctl
$ wget https://github.com/k0sproject/k0sctl/releases/download/v0.9.0/k0sctl-linux-x64
$ chmod +x k0sctl-linux-x64
$ mv k0sctl-linux-x64 /usr/local/bin/k0sctl
然后編寫 k0sctl.yaml 配置文件
apiVersion: k0sctl.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s-cluster
spec:
hosts:
- ssh:
address: 10.0.0.11
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: controller+worker
- ssh:
address: 10.0.0.12
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: controller+worker
- ssh:
address: 10.0.0.13
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: controller+worker
- ssh:
address: 10.0.0.14
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: worker
- ssh:
address: 10.0.0.15
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: worker
k0s:
version: 1.21.2+k0s.1
config:
apiVersion: k0s.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s
spec:
api:
address: 10.0.0.11
port: 6443
k0sApiPort: 9443
sans:
- 10.0.0.11
- 10.0.0.12
- 10.0.0.13
storage:
type: etcd
etcd:
peerAddress: 10.0.0.11
network:
kubeProxy:
disabled: false
mode: ipvs
最后執(zhí)行 apply 命令安裝即可,安裝前確保你的操作機(jī)器可以 ssh 免密登陸所有目標(biāo)機(jī)器:
$ k0sctl apply -c bak.yaml
?????????????????????????????????????█████████ █████████ ███
?????????????????????????????????????███ ███ ███
?????????????????????????????????????███ ███ ███
?????????????????????????????????????███ ███ ███
?????????????????????????????????????█████████ ███ ██████████
k0sctl 0.0.0 Copyright 2021, k0sctl authors.
Anonymized telemetry of usage will be sent to the authors.
By continuing to use k0sctl you agree to these terms:
https://k0sproject.io/licenses/eula
INFO ==> Running phase: Connect to hosts
INFO [ssh] 10.0.0.15:22: connected
INFO [ssh] 10.0.0.11:22: connected
INFO [ssh] 10.0.0.12:22: connected
INFO [ssh] 10.0.0.14:22: connected
INFO [ssh] 10.0.0.13:22: connected
INFO ==> Running phase: Detect host operating systems
INFO [ssh] 10.0.0.11:22: is running Ubuntu 20.04.2 LTS
INFO [ssh] 10.0.0.12:22: is running Ubuntu 20.04.2 LTS
INFO [ssh] 10.0.0.14:22: is running Ubuntu 20.04.2 LTS
INFO [ssh] 10.0.0.13:22: is running Ubuntu 20.04.2 LTS
INFO [ssh] 10.0.0.15:22: is running Ubuntu 20.04.2 LTS
INFO ==> Running phase: Prepare hosts
INFO ==> Running phase: Gather host facts
INFO [ssh] 10.0.0.11:22: discovered ens33 as private interface
INFO [ssh] 10.0.0.13:22: discovered ens33 as private interface
INFO [ssh] 10.0.0.12:22: discovered ens33 as private interface
INFO ==> Running phase: Download k0s on hosts
INFO [ssh] 10.0.0.11:22: downloading k0s 1.21.2+k0s.1
INFO [ssh] 10.0.0.13:22: downloading k0s 1.21.2+k0s.1
INFO [ssh] 10.0.0.12:22: downloading k0s 1.21.2+k0s.1
INFO [ssh] 10.0.0.15:22: downloading k0s 1.21.2+k0s.1
INFO [ssh] 10.0.0.14:22: downloading k0s 1.21.2+k0s.1
......
稍等片刻后帶有三個(gè) Master 和兩個(gè) Node 的集群將安裝完成:
# 注意: 目標(biāo)機(jī)器 hostname 不應(yīng)當(dāng)為域名形式,這里的樣例是已經(jīng)修復(fù)了這個(gè)問題
$ k0s kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k1.node Ready <none> 10m v1.21.2+k0s 10.0.0.11 <none> Ubuntu 20.04.2 LTS 5.4.0-77-generic containerd://1.4.6
k2.node Ready <none> 10m v1.21.2+k0s 10.0.0.12 <none> Ubuntu 20.04.2 LTS 5.4.0-77-generic containerd://1.4.6
k3.node Ready <none> 10m v1.21.2+k0s 10.0.0.13 <none> Ubuntu 20.04.2 LTS 5.4.0-77-generic containerd://1.4.6
k4.node Ready <none> 10m v1.21.2+k0s 10.0.0.14 <none> Ubuntu 20.04.2 LTS 5.4.0-77-generic containerd://1.4.6
k5.node Ready <none> 10m v1.21.2+k0s 10.0.0.15 <none> Ubuntu 20.04.2 LTS 5.4.0-77-generic containerd://1.4.6
2.2、k0sctl 的擴(kuò)展方式
與 kubeadm 不同,k0sctl 幾乎提供了所有安裝細(xì)節(jié)的可定制化選項(xiàng),其通過三種行為來完成擴(kuò)展:
文件上傳: k0sctl 允許定義在安裝前的文件上傳,在安裝之前 k0sctl 會(huì)把已經(jīng)定義的相關(guān)文件全部上傳到目標(biāo)主機(jī),包括不限于 k0s 本身二進(jìn)制文件、離線鏡像包、其他安裝文件、其他輔助腳本等。 Manifests 與 Helm: 當(dāng)將特定的文件上傳到 master 節(jié)點(diǎn)的 /var/lib/k0s/manifests目錄時(shí),k0s 在安裝過程中會(huì)自動(dòng)應(yīng)用這些配置,類似 kubelet 的 static pod 一樣,只不過 k0s 允許全部資源(包括不限于 deployment、daemonset、namespace 等);同樣也可以直接在k0sctl.yaml添加 Helm 配置,k0s 也會(huì)以同樣的方式幫你管理。輔助腳本: 可以在每個(gè)主機(jī)下配置 hooks選項(xiàng)來實(shí)現(xiàn)執(zhí)行一些特定的腳本(文檔里沒有,需要看源碼),以便在特定情況下做點(diǎn)騷操作。
2.3、k0sctl 使用離線鏡像包
基于上面的擴(kuò)展,k0s 還方便的幫我們集成了離線鏡像包的自動(dòng)導(dǎo)入,我們只需要定義一個(gè)文件上傳,將鏡像包上傳到 /var/lib/k0s/images/ 目錄后,k0s 會(huì)自定將其倒入到 containerd 中而無需我們手動(dòng)干預(yù):
apiVersion: k0sctl.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s-cluster
spec:
hosts:
- ssh:
address: 10.0.0.11
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: controller+worker
# files 配置將會(huì)在安裝前將相關(guān)文件上傳到目標(biāo)主機(jī)
files:
- name: image-bundle
src: /Users/bleem/tmp/bundle_file
# 在該目錄下的 image 壓縮包將會(huì)被自動(dòng)導(dǎo)入到 containerd 中
dstDir: /var/lib/k0s/images/
perm: 0755
......
關(guān)于 image 壓縮包(bundle_file)如何下載以及自己自定義問題請參考官方 Airgap install[1] 文檔。

2.4、切換 CNI 插件
默認(rèn)情況下 k0s 內(nèi)部集成了兩個(gè) CNI 插件: calico 和 kube-router;如果我們使用其他的 CNI 插件例如 flannel,我們只需要將默認(rèn)的 CNI 插件設(shè)置為 custom,然后將 flannel 的部署 yaml 上傳到一臺(tái) master 的 /var/lib/k0s/manifests 目錄即可,k0s 會(huì)自動(dòng)幫我門執(zhí)行 apply -f xxxx.yaml 這種操作。
下面是切換到 flannel 的樣例,需要注意的是 flannel 官方鏡像不會(huì)幫你安裝 CNI 的二進(jìn)制文件,我們需要借助文件上傳自己安裝(CNI GitHub 插件下載地址[2]):
apiVersion: k0sctl.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s-cluster
spec:
hosts:
- ssh:
address: 10.0.0.11
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: controller+worker
files:
# 將 flannel 的 yaml 放到 manifests 里(需要單獨(dú)創(chuàng)建一個(gè)目錄)
- name: flannel
src: /Users/bleem/tmp/kube-flannel.yaml
dstDir: /var/lib/k0s/manifests/flannel
perm: 0644
# 自己安裝一下 CNI 插件
- name: cni-plugins
src: /Users/bleem/tmp/cni-plugins/*
dstDir: /opt/cni/bin/
perm: 0755
k0s:
version: v1.21.2+k0s.1
config:
apiVersion: k0s.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s
spec:
api:
address: 10.0.0.11
port: 6443
k0sApiPort: 9443
sans:
- 10.0.0.11
- 10.0.0.12
- 10.0.0.13
storage:
type: etcd
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12
# 這里指定 CNI 為 custom 自定義類型,這樣
# k0s 就不會(huì)安裝 calico/kube-router 了
provider: custom
2.5、上傳 k0s 二進(jìn)制文件
除了普通文件、鏡像壓縮包等,默認(rèn)情況下 k0sctl 在安裝集群時(shí)還會(huì)在目標(biāo)機(jī)器上下載 k0s 二進(jìn)制文件;當(dāng)然在離線環(huán)境下這一步也可以通過一個(gè)簡單的配置來實(shí)現(xiàn)離線上傳:
apiVersion: k0sctl.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s-cluster
spec:
hosts:
- ssh:
address: 10.0.0.11
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: controller+worker
# 聲明需要上傳二進(jìn)制文件
uploadBinary: true
# 指定二進(jìn)制文件位置
k0sBinaryPath: /Users/bleem/tmp/k0s
files:
- name: flannel
src: /Users/bleem/tmp/kube-flannel.yaml
dstDir: /var/lib/k0s/manifests/flannel
perm: 0644
......
2.6、更換鏡像版本
默認(rèn)情況下 k0s 版本號(hào)與 Kubernetes 保持一致,但是如果期望某個(gè)組件使用特定的版本,則可以直接配置這些內(nèi)置組件的鏡像名稱:
apiVersion: k0sctl.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s-cluster
spec:
hosts:
- ssh:
address: 10.0.0.11
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: controller+worker
uploadBinary: true
k0sBinaryPath: /Users/bleem/tmp/k0s
files:
- name: flannel
src: /Users/bleem/tmp/kube-flannel.yaml
dstDir: /var/lib/k0s/manifests/flannel
perm: 0644
......
k0s:
version: v1.21.2+k0s.1
config:
apiVersion: k0s.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s
spec:
api:
address: 10.0.0.11
port: 6443
k0sApiPort: 9443
sans:
- 10.0.0.11
- 10.0.0.12
- 10.0.0.13
# 指定內(nèi)部組件的鏡像使用的版本
images:
#konnectivity:
# image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-agent
# version: v0.0.21
#metricsserver:
# image: gcr.io/k8s-staging-metrics-server/metrics-server
# version: v0.3.7
kubeproxy:
image: k8s.gcr.io/kube-proxy
version: v1.21.3
#coredns:
# image: docker.io/coredns/coredns
# version: 1.7.0
#calico:
# cni:
# image: docker.io/calico/cni
# version: v3.18.1
# node:
# image: docker.io/calico/node
# version: v3.18.1
# kubecontrollers:
# image: docker.io/calico/kube-controllers
# version: v3.18.1
#kuberouter:
# cni:
# image: docker.io/cloudnativelabs/kube-router
# version: v1.2.1
# cniInstaller:
# image: quay.io/k0sproject/cni-node
# version: 0.1.0
default_pull_policy: IfNotPresent
#default_pull_policy: Never
2.7、調(diào)整 master 組件參數(shù)
熟悉 Kubernetes 的應(yīng)該清楚,master 上三大組件: apiserver、controller、scheduler 管控整個(gè)集群;在 k0sctl 安裝集群的過程中也允許自定義這些組件的參數(shù),這些調(diào)整通過修改使用的 k0sctl.yaml 配置文件完成。
spec.api.extraArgs: 用于自定義 kube-apiserver 的自定義參數(shù)(kv map)spec.scheduler.extraArgs: 用于自定義 kube-scheduler 的自定義參數(shù)(kv map)spec.controllerManager.extraArgs: 用于自定義 kube-controller-manager 自定義參數(shù)(kv map)spec.workerProfiles: 用于覆蓋 kubelet-config.yaml 中的配置,該配置最終將于默認(rèn)的 kubelet-config.yaml 合并
除此之外在 Host 配置中還有一個(gè) InstallFlags 配置用于傳遞 k0s 安裝時(shí)的其他配置選項(xiàng)。
三、k0s HA 搭建
其實(shí)上面的第二部分主要都是介紹 k0sctl 一些基礎(chǔ)功能,為的就是給下面這部分 HA 生產(chǎn)級(jí)部署做鋪墊。
就目前來說,k0s HA 僅支持獨(dú)立負(fù)載均衡器的 HA 架構(gòu);**即外部需要有一個(gè)高可用的 4 層負(fù)載均衡器,其他所有 Node 節(jié)點(diǎn)鏈接這個(gè)負(fù)載均衡器實(shí)現(xiàn) master 的高可用。**在使用 k0sctl 命令搭建 HA 集群時(shí)很簡單,只需要添加一個(gè)外部負(fù)載均衡器地址即可;以下是一個(gè)完整的,全離線狀態(tài)下的 HA 集群搭建配置。
3.1、外部負(fù)載均衡器
在搭建之前我們假設(shè)已經(jīng)有一個(gè)外部的高可用的 4 層負(fù)載均衡器,且負(fù)載均衡器已經(jīng)負(fù)載了以下端口:
6443(for Kubernetes API): 負(fù)載均衡器 6443 負(fù)載所有 master 節(jié)點(diǎn)的 64439443 (for controller join API): 負(fù)載均衡器 9443 負(fù)載所有 master 節(jié)點(diǎn)的 94438132 (for Konnectivity agent): 負(fù)載均衡器 8132 負(fù)載所有 master 節(jié)點(diǎn)的 81328133 (for Konnectivity server): 負(fù)載均衡器 8133 負(fù)載所有 master 節(jié)點(diǎn)的 8133
以下為一個(gè) nginx 4 層代理的樣例:
error_log syslog:server=unix:/dev/log notice;
worker_processes auto;
events {
multi_accept on;
use epoll;
worker_connections 1024;
}
stream {
upstream kube_apiserver {
least_conn;
server 10.0.0.11:6443;
server 10.0.0.12:6443;
server 10.0.0.13:6443;
}
upstream konnectivity_agent {
least_conn;
server 10.0.0.11:8132;
server 10.0.0.12:8132;
server 10.0.0.13:8132;
}
upstream konnectivity_server {
least_conn;
server 10.0.0.11:8133;
server 10.0.0.12:8133;
server 10.0.0.13:8133;
}
upstream controller_join_api {
least_conn;
server 10.0.0.11:9443;
server 10.0.0.12:9443;
server 10.0.0.13:9443;
}
server {
listen 0.0.0.0:6443;
proxy_pass kube_apiserver;
proxy_timeout 10m;
proxy_connect_timeout 1s;
}
server {
listen 0.0.0.0:8132;
proxy_pass konnectivity_agent;
proxy_timeout 10m;
proxy_connect_timeout 1s;
}
server {
listen 0.0.0.0:8133;
proxy_pass konnectivity_server;
proxy_timeout 10m;
proxy_connect_timeout 1s;
}
server {
listen 0.0.0.0:9443;
proxy_pass controller_join_api;
proxy_timeout 10m;
proxy_connect_timeout 1s;
}
}
3.2、搭建 HA 集群
以下為 k0sctl 的 HA + 離線部署樣例配置:
apiVersion: k0sctl.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s-cluster
spec:
hosts:
- ssh:
address: 10.0.0.11
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
# role 支持的值
# 'controller' 單 master
# 'worker' 單 worker
# 'controller+worker' master 和 worker 都運(yùn)行
role: controller+worker
# 從本地 上傳 k0s bin 文件,不要在目標(biāo)機(jī)器下載
uploadBinary: true
k0sBinaryPath: /Users/bleem/tmp/k0s
# 上傳其他文件
files:
# 上傳 flannel 配置,使用自定的 flannel 替換內(nèi)置的 calico
- name: flannel
src: /Users/bleem/tmp/kube-flannel.yaml
dstDir: /var/lib/k0s/manifests/flannel
perm: 0644
# 上傳打包好的 image 鏡像包,k0s 會(huì)自動(dòng)導(dǎo)入到 containerd
- name: image-bundle
src: /Users/bleem/tmp/bundle_file
dstDir: /var/lib/k0s/images/
perm: 0755
# 使用 flannel 后每個(gè)機(jī)器要上傳對應(yīng)的 CNI 插件
- name: cni-plugins
src: /Users/bleem/tmp/cni-plugins/*
dstDir: /opt/cni/bin/
perm: 0755
- ssh:
address: 10.0.0.12
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: controller+worker
uploadBinary: true
k0sBinaryPath: /Users/bleem/tmp/k0s
files:
- name: image-bundle
src: /Users/bleem/tmp/bundle_file
dstDir: /var/lib/k0s/images/
perm: 0755
- name: cni-plugins
src: /Users/bleem/tmp/cni-plugins/*
dstDir: /opt/cni/bin/
perm: 0755
- ssh:
address: 10.0.0.13
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: controller+worker
uploadBinary: true
k0sBinaryPath: /Users/bleem/tmp/k0s
files:
- name: image-bundle
src: /Users/bleem/tmp/bundle_file
dstDir: /var/lib/k0s/images/
perm: 0755
- name: cni-plugins
src: /Users/bleem/tmp/cni-plugins/*
dstDir: /opt/cni/bin/
perm: 0755
- ssh:
address: 10.0.0.14
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: worker
uploadBinary: true
k0sBinaryPath: /Users/bleem/tmp/k0s
files:
- name: image-bundle
src: /Users/bleem/tmp/bundle_file
dstDir: /var/lib/k0s/images/
perm: 0755
- name: cni-plugins
src: /Users/bleem/tmp/cni-plugins/*
dstDir: /opt/cni/bin/
perm: 0755
- ssh:
address: 10.0.0.15
user: root
port: 22
keyPath: /Users/bleem/.ssh/id_rsa
role: worker
uploadBinary: true
k0sBinaryPath: /Users/bleem/tmp/k0s
files:
- name: image-bundle
src: /Users/bleem/tmp/bundle_file
dstDir: /var/lib/k0s/images/
perm: 0755
- name: cni-plugins
src: /Users/bleem/tmp/cni-plugins/*
dstDir: /opt/cni/bin/
perm: 0755
k0s:
version: v1.21.2+k0s.1
config:
apiVersion: k0s.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s
spec:
api:
# 此處填寫外部的負(fù)載均衡器地址,所有 kubelet 會(huì)鏈接這個(gè)地址
externalAddress: 10.0.0.20
# 不要忘了為外部負(fù)載均衡器添加 api 證書的 SAN
sans:
- 10.0.0.11
- 10.0.0.12
- 10.0.0.13
- 10.0.0.20
# 存儲(chǔ)類型使用 etcd,etcd 集群由 k0s 自動(dòng)管理
storage:
type: etcd
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12
# 網(wǎng)絡(luò)插件使用 custom,然后讓 flannel 接管
provider: custom
kubeProxy:
disabled: false
# 開啟 kubelet 的 ipvs 模式
mode: ipvs
# 不發(fā)送任何匿名統(tǒng)計(jì)信息
telemetry:
enabled: false
images:
default_pull_policy: IfNotPresent
最后只需要執(zhí)行 k0sctl apply -c k0sctl.yaml 稍等幾分鐘集群就搭建好了,安裝過程中可以看到相關(guān)文件的上傳流程:

3.3、證書續(xù)簽和管理
kubeadm 集群默認(rèn)證書有效期是一年,到期要通過 kubeadm 重新簽署;k0s 集群也差不多一樣,但是不同的是 k0s 集群更加暴力;只要 CA(默認(rèn) 10 年) 不丟,k0s 每次重啟都強(qiáng)行重新生成一年有效期的證書,所以在 HA 的環(huán)境下,快到期時(shí)重啟一下 k0s 服務(wù)就行。
k0sctl 安裝完的集群默認(rèn)只有一個(gè) k0scontroller.service 服務(wù),master、node 上所有服務(wù)都由這個(gè)服務(wù)啟動(dòng),所以到期之前 systemctl restart k0scontroller.service 一下就行。
四、集群備份和恢復(fù)
k0sctl 提供了集群備份和恢復(fù)功能,默認(rèn)情況下只需要執(zhí)行 k0sctl backup 即可完成集群備份,該命令會(huì)在當(dāng)前目錄下生成一個(gè) k0s_backup_TIMESTAMP.tar.gz 備份文件。
需要恢復(fù)集群時(shí)使用 k0sctl apply --restore-from k0s_backup_TIMESTAMP.tar.gz 命令進(jìn)行恢復(fù)即可;需要注意的是恢復(fù)命令等同于在新機(jī)器重新安裝集群,所以有一定風(fēng)險(xiǎn)。
經(jīng)過連續(xù)兩天的測試,感覺這個(gè)備份恢復(fù)功能并不算靠譜,還是推薦使用 Velero 備份集群。
五、其他高級(jí)功能
5.1、Etcd 替換
在小規(guī)模集群場景下可能并不需要特別完善的 Etcd 作為存儲(chǔ),k0s 借助于 kine 庫可以實(shí)現(xiàn)使用 SQLite 或 MySQL 等傳統(tǒng)數(shù)據(jù)庫作為集群存儲(chǔ);如果想要切換存儲(chǔ)只需要調(diào)整 k0sctl.yaml 配置即可:
apiVersion: k0s.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s
spec:
storage:
type: kine
kine:
dataSource: "sqlite:///var/lib/k0s/db/state.db?more=rwc&_journal=WAL&cache=shared"
5.2、集群用戶管理
使用 k0sctl 搭建的集群通過 k0s 命令可以很方便的為集群添加用戶,以下是添加樣例:
$ k0s kubeconfig create --groups "system:masters" testUser > k0s.config
5.3、Containerd 配置
在不做配置的情況下 k0s 集群使用默認(rèn)的 Containerd 配置,如果需要自己定義特殊配置,可以在安裝時(shí)通過文件上傳方式將 Containerd 配置文件上傳到 /etc/k0s/containerd.toml 位置,該配置將會(huì)被 k0s 啟動(dòng)的 Containerd 讀取并使用。
六、總結(jié)
k0s 是個(gè)不錯(cuò)的項(xiàng)目,對于二進(jìn)制宿主機(jī)部署 Kubernetes 集群很方便,由于其直接采用 Kubernetes 二進(jìn)制文件啟動(dòng),所以基本沒有功能閹割,而 k0sctl 又為自動(dòng)化安裝提供了良好的擴(kuò)展性,所以值得一試。不過目前來說 k0s 在細(xì)節(jié)部分還有一定瑕疵,比如 konnectivity 服務(wù)在安裝時(shí)無法選擇性關(guān)閉等;k0s 綜合來說是個(gè)不錯(cuò)的工具,也推薦看看源碼,里面很多設(shè)計(jì)很新穎也比較利于了解集群引導(dǎo)過程。
引用鏈接
Airgap install: https://docs.k0sproject.io/v1.21.2+k0s.1/airgap-install/
[2]CNI GitHub 插件下載地址: https://github.com/containernetworking/plugins/releases
原文鏈接:https://mritd.com/2021/07/29/test-the-k0s-cluster/


你可能還喜歡
點(diǎn)擊下方圖片即可閱讀

云原生是一種信仰 ??
關(guān)注公眾號(hào)
后臺(tái)回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!


點(diǎn)擊 "閱讀原文" 獲取更好的閱讀體驗(yàn)!
發(fā)現(xiàn)朋友圈變“安靜”了嗎?


