天天看點

k3d+k3s+kubecm 本地快速搭建與管理叢集

前言

k3s 是由 Rancher Labs 于2019年年初推出的一款輕量級 Kubernetes 發行版,滿足在邊緣計算環境中運作在 x86、ARM64 和 ARMv7 處理器上的小型、易于管理的 Kubernetes 叢集日益增長的需求。

k3s 除了在邊緣計算領域的應用外,在研發側的表現也十分出色。我們可以快速在本地拉起一個輕量級的 k8s 叢集,而 k3d 則是 k3s 社群建立的一個小工具,可以在一個 docker 程序中運作整個 k3s 叢集,相比直接使用 k3s 運作在本地,更好管理和部署。

在日常工作中,時長要在本地叢集和多個遠端叢集之間切換來完成運維工作,這時使用

kubecm

快速将 k3s 叢集的 kubeconfig 與現有叢集的 kubeconfig 合并,并可快速切換叢集,開發運維兩不誤。

安裝 k3d

k3d 提供了多種安裝方式,十分友善。

使用腳本安裝

直接使用

wget

curl

安裝

wget -q -O - https://raw.githubusercontent.com/rancher/k3d/master/install.sh | bash
# 或
curl -s https://raw.githubusercontent.com/rancher/k3d/master/install.sh | bash           

安裝指定版本

wget -q -O - https://raw.githubusercontent.com/rancher/k3d/master/install.sh | TAG=v1.3.4 bash
# 或
curl -s https://raw.githubusercontent.com/rancher/k3d/master/install.sh | TAG=v1.3.4 bash           

使用 Homebrew 安裝

MacOS 或安裝了 Homebrew 的 Linux 可以使用 brew 安裝:

brew install k3d           

其他

還可以直接前往

release 頁面

下載下傳二進制可執行檔案,或者直接使用

go install github.com/rancher/k3d

安裝。

建立 k3s 叢集

建立 k3s 叢集也十分簡單,一行指令就可拉起,速度非常快。

$ k3d create -n k3s-local
INFO[0000] Created cluster network with ID facae4a046b169721805f93ec21ba1acb65b9efb8cf35866529178cb0fba75a9
INFO[0000] Created docker volume  k3d-k3s-local-images
INFO[0000] Creating cluster [k3s-local]
INFO[0000] Creating server using docker.io/rancher/k3s:v1.0.1...
INFO[0000] SUCCESS: created cluster [k3s-local]
INFO[0000] You can now use the cluster with:

export KUBECONFIG="$(k3d get-kubeconfig --name='k3s-local')"
kubectl cluster-info           

但是一般情況下,如果沒有梯子的話,k3s 叢集雖然拉起來很快,但因為拉不到鏡像,叢集元件都無法正常拉起。

$ export KUBECONFIG="$(k3d get-kubeconfig --name='k3s-local')"
$ kubectl get pod -n kube-system
NAME                                      READY   STATUS              RESTARTS   AGE
helm-install-traefik-8wxmr                0/1     ContainerCreating   0          3m30s
metrics-server-6d684c7b5-j4sc7            0/1     ContainerCreating   0          3m30s
coredns-d798c9dd-j6lpw                    0/1     ContainerCreating   0          3m30s
local-path-provisioner-58fb86bdfd-wv7sw   0/1     ContainerCreating   0          3m30s
$ kubectl describe pod coredns-d798c9dd-j6lpw -n kube-system
...
Events:
  Type     Reason                  Age                 From                           Message
  ----     ------                  ----                ----                           -------
  Normal   Scheduled               <unknown>           default-scheduler              Successfully assigned kube-system/coredns-d798c9dd-j6lpw to k3d-k3s-local-server
  Warning  FailedCreatePodSandBox  7s (x7 over 4m30s)  kubelet, k3d-k3s-local-server  Failed create pod sandbox: rpc error: code = Unknown desc = failed to get sandbox image "k8s.gcr.io/pause:3.1": failed to pull image "k8s.gcr.io/pause:3.1": failed to pull and unpack image "k8s.gcr.io/pause:3.1": failed to resolve reference "k8s.gcr.io/pause:3.1": failed to do request: Head https://k8s.gcr.io/v2/pause/manifests/3.1: dial tcp 64.233.189.82:443: i/o timeout           

離線安裝

如果沒有梯子的話,就隻能選擇使用離線安裝。

下載下傳離線鏡像

前往

下載下傳指定版本的鏡像,這裡我們下載下傳最新的

v1.17.2+k3s1

鏡像。

k3d+k3s+kubecm 本地快速搭建與管理叢集

下載下傳到

~/airgap

目錄中,并進行解壓,将解壓後的目錄重命名為

1.17.2

運作離線鏡像

這裡再次運作 k3d,部署 k3s 叢集。這裡要注意的是,挂載離線鏡像的話,必須使用

-i

flag 來指定鏡像版本,這裡我們使用的是

版本,而鏡像的 tag 則是

v1.17.2-k3s1

,如果不确定 tag,可以去

DockerHub

上檢視。

$ k3d create -n k3s-local -i rancher/k3s:v1.17.2-k3s1  -v $(pwd)/airgap/v1.17.2/:/var/lib/rancher/k3s/agent/images/
INFO[0000] Created cluster network with ID 10b3fca995fcb491ae1fe1c901672bf6f0a0fd6f51785ba8403947d2773ebd43
INFO[0000] Created docker volume  k3d-k3s-local-images
INFO[0000] Creating cluster [k3s-local]
INFO[0000] Creating server using docker.io/rancher/k3s:v1.17.2-k3s1...
INFO[0000] SUCCESS: created cluster [k3s-local]
INFO[0000] You can now use the cluster with:

export KUBECONFIG="$(k3d get-kubeconfig --name='k3s-local')"
kubectl cluster-info           

檢視 k3s 叢集元件啟動狀态:

$ export KUBECONFIG="$(k3d get-kubeconfig --name='k3s-local')"
$ kubectl get pod -A -w
NAMESPACE     NAME                                      READY   STATUS              RESTARTS   AGE
kube-system   local-path-provisioner-58fb86bdfd-7jzbw   0/1     ContainerCreating   0          6m35s
kube-system   coredns-d798c9dd-jhmds                    1/1     Running             0          6m35s
kube-system   metrics-server-6d684c7b5-4x2cd            1/1     Running             0          6m35s
kube-system   traefik-6787cddb4b-9v7r4                  0/1     ContainerCreating   0          16s
kube-system   svclb-traefik-fzrqj                       0/2     ContainerCreating   0          15s
kube-system   helm-install-traefik-h8k2j                0/1     Completed           0          6m35s
kube-system   svclb-traefik-fzrqj                       2/2     Running             0          21s           

使用 kubecm

在 k3s 叢集啟動成功後,使用

kubecm

,将 k3s 的 kubeconfig 與現有 kubeconfig 合并。

kubecm add -f $(k3d get-kubeconfig --name='k3s-local') -n k3s -c           

切換叢集,選擇 k3s。

$ kubecm s
Use the arrow keys to navigate: ↓ ↑ → ←  and / toggles search
Select Kube Context
  😼 k3s(*)
    prod-tg
    test
↓   banma

--------- Info ----------
Name:           k3s
Cluster:        cluster-485d6mhcfm
User:           user-485d6mhcfm           

現在就可以在本地使用 k3s 叢集進行開發工作,而有運維工作的時候,使用

kubecm switch

快速切換叢集。

結語

k3d+k3s+kubecm 本地快速搭建與管理叢集

k3s 同時支援 x86_64、ARM64 和 ARMv7 架構,它可以十分靈活地跨任何邊緣基礎架構工作。不提 k3s 在邊緣計算領域的應用,與之前使用的

minikube

相比,k3s 裁剪掉了許多用不到的功能,并且安裝更簡單,啟動更快,空間占用也更小。相信 k3s 在開發側的作用也會越來越大,使雲原生應用的開發更加的便利。