本文將於賽後同步刊登於筆者部落格
有興趣學習更多 Kubernetes/DevOps/Linux 相關的資源的讀者,歡迎前往閱讀
更多相關科技的技術分享,歡迎追蹤 矽谷牛的耕田筆記https://www.facebook.com/technologynoteniu)
上篇文章中,我們探討了本地開發對於 Kubernetes 的需求,一般來說不一定會需要 Kubernetes,使用 Docker 或是 Docker-compose 就可以滿足大部分人開發的需求。假設真的有 Kubernetes 的需求,也列出了四個常見的部署方式以及各自的基本介紹
本篇則會從中擷取 KIND 以及 K3D 帶來基本的操作範例
上篇文章中有提到 K3D 是由 Rancher 所維護且開發的技術,其目的是將 Rancher 維護的輕量級 Kubernetes 版本 k3s
以 Docker 的形式建立起來,透過 Docker Container 的創建就可以輕鬆的建立多個 Kubernetes 節點
更多詳細介紹請參閱官方Repo
安裝過程非常簡單,一行指令就可以
sudo curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash
$ k3d
Usage:
k3d [flags]
k3d [command]
Available Commands:
cluster Manage cluster(s)
completion Generate completion scripts for [bash, zsh, powershell | psh]
help Help about any command
image Handle container images.
kubeconfig Manage kubeconfig(s)
node Manage node(s)
version Show k3d and default k3s version
Flags:
-h, --help help for k3d
--verbose Enable verbose output (debug logging)
--version Show k3d and default k3s version
Use "k3d [command] --help" for more information about a command.
整個指令非常簡單,比較常見會使用的就是 cluster, kubeconfig 以及 node
創建上也是非常簡單,輸入 k3d cluster
可以看到一些跟 cluster 相關的指令,實際上使用的時候都要描述你希望的 cluster 名稱,這邊我就不輸入,一律採用預設值 k3s-default
$ k3d cluster
Manage cluster(s)
Usage:
k3d cluster [flags]
k3d cluster [command]
Available Commands:
create Create a new cluster
delete Delete cluster(s).
list List cluster(s)
start Start existing k3d cluster(s)
stop Stop existing k3d cluster(s)
Flags:
-h, --help help for cluster
Global Flags:
--verbose Enable verbose output (debug logging)
Use "k3d cluster [command] --help" for more information about a command
我們可以透過 k3d cluster create
來創建一個 k3s 的叢集,預設情況下是一個節點,我們可以透過 -s
的方式來指定要有多少個 node.
$ k3d cluster create -s 3
INFO[0000] Created network 'k3d-k3s-default'
INFO[0000] Created volume 'k3d-k3s-default-images' INFO[0000] Creating initializing server node
INFO[0000] Creating node 'k3d-k3s-default-server-0'
INFO[0009] Creating node 'k3d-k3s-default-server-1'
INFO[0010] Creating node 'k3d-k3s-default-server-2'
INFO[0011] Creating LoadBalancer 'k3d-k3s-default-serverlb'
INFO[0018] Cluster 'k3s-default' created successfully!
INFO[0018] You can now use it like this:
kubectl cluster-info
創建完畢後,我們馬上透過 docker
指令來觀察,可以觀察到的確有 docker container 被創立起來,不過數量卻是比 server 還要多一個,主要是用來當作 load-balancer 使用
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5903d159c73 rancher/k3d-proxy:v3.0.1 "/bin/sh -c nginx-pr…" 42 minutes ago Up 42 minutes 80/tcp, 0.0.0.0:44429->6443/tcp k3d-k3s-default-serverlb
aaa0cd077a51 rancher/k3s:v1.18.6-k3s1 "/bin/k3s server --t…" 42 minutes ago Up 42 minutes k3d-k3s-default-server-2
636968375fd2 rancher/k3s:v1.18.6-k3s1 "/bin/k3s server --t…" 42 minutes ago Up 42 minutes k3d-k3s-default-server-1
5bfb8b1c64bb rancher/k3s:v1.18.6-k3s1 "/bin/k3s server --c…" 43 minutes ago Up 43 minutes k3d-k3s-default-server-0
為了存取 Kubernetes,我們都會需要準備一份 KUBECONFIG
裡面描述 API Server 的位置,以及使用到的 Username 等資訊,這部分 k3d
也有提供相關的指令來處理 KUBECONFIG
$ k3d kubeconfig
Manage kubeconfig(s)
Usage:
k3d kubeconfig [flags]
k3d kubeconfig [command]
Available Commands:
get Print kubeconfig(s) from cluster(s).
merge Write/Merge kubeconfig(s) from cluster(s) into new or existing kubeconfig/file.
Flags:
-h, --help help for kubeconfig
Global Flags:
--verbose Enable verbose output (debug logging)
Use "k3d kubeconfig [command] --help" for more information about a command.
為了簡單測試,我們可以直接使用 k3d kubeconfig merge
讓他產生一個全新的檔案
$ k3d kubeconfig merge
/home/ubuntu/.k3d/kubeconfig-k3s-default.yaml
$ KUBECONFIG=~/.k3d/kubeconfig-k3s-default.yaml kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3d-k3s-default-server-2 Ready master 50m v1.18.6+k3s1
k3d-k3s-default-server-1 Ready master 50m v1.18.6+k3s1
k3d-k3s-default-server-0 Ready master 50m v1.18.6+k3s1
創建完畢後透過 KUBECONFIG 這個環境變數指向該檔案,就可以利用 kubectl 指令來操作創建起來的 k3s 叢集
如果今天想要動態新增節點,也可以透過 k3d node create
指令來操作
$ k3d node create --role server hwchiu-test
$ k3d node list
NAME ROLE CLUSTER STATUS
k3d-hwchiu-test-0 server k3s-default running
k3d-k3s-default-server-0 server k3s-default running
k3d-k3s-default-server-1 server k3s-default running
k3d-k3s-default-server-2 server k3s-default running
k3d-k3s-default-serverlb loadbalancer k3s-default running
$ KUBECONFIG=~/.k3d/kubeconfig-k3s-default.yaml kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3d-k3s-default-server-0 Ready master 51m v1.18.6+k3s1
k3d-k3s-default-server-2 Ready master 51m v1.18.6+k3s1
k3d-k3s-default-server-1 Ready master 51m v1.18.6+k3s1
k3d-hwchiu-test-0 Ready master 9s v1.18.6+k3s1
整個使用上的介紹就到這邊,基本上不會太困難,而且指令簡單,想要快速架起多節點的 Kubernetes,可以嘗試使用看看這套軟體
接下來我們來看另外一套也是基於 Docker 為基礎的多節點建置工具 KIND, 相對於 K3D, KIND 是完整版本的 Kubernetes,由 Kubernetes 社群維護,使用上也是非常簡單,詳細的介紹可以參閱 官方Repo
安裝過程非常簡單,也是一些 script 的行為就可以處理完畢,跟 k3d
一樣,所有的操作過程都是在本地的 binary 完成的
curl -Lo ./kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.7.0/kind-$(uname)-amd64"
chmod a+x ./kind
sudo mv ./kind /usr/local/bin/kind
$ kind
kind creates and manages local Kubernetes clusters using Docker container 'nodes'
Usage:
kind [command]
Available Commands:
build Build one of [base-image, node-image]
completion Output shell completion code for the specified shell (bash or zsh)
create Creates one of [cluster]
delete Deletes one of [cluster]
export Exports one of [kubeconfig, logs]
get Gets one of [clusters, nodes, kubeconfig]
help Help about any command
load Loads images into nodes
version Prints the kind CLI version
Flags:
-h, --help help for kind
--loglevel string DEPRECATED: see -v instead
-q, --quiet silence all stderr output
-v, --verbosity int32 info log verbosity
--version version for kind
Use "kind [command] --help" for more information about a command.
測試上最常用到的指令就是 create
, delete
以及 load
,這兩者可以幫忙創建與刪除 kubernetes cluster, 後者則可以將一些 container image 送到 docker container 中,這樣你的 kubernetes cluster 如果要抓取 image 就可以直接從本地抓取。
接下來我們要用 kind create cluster
來創建一個基於 docker 的 Kubernetes 叢集,預設情況下只會創建出一個單一節點,如果想要創建更多節點,我們要透過 config 的方式告知 KIND 我們需要的拓墣形狀
因此事先準備好下列檔案 kind.yaml
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane
- role: worker
- role: worker
裡面描述我們需要三個 node, 其中一個代表 control-plane, 另外兩個則是單純的 worker, 然後將該 config 傳入 KIND 一起使用
$ kind create cluster --config kind.yaml
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.17.0) ?
✓ Preparing nodes ? ? ?
✓ Writing configuration ?
✓ Starting control-plane ?️
✓ Installing CNI ?
✓ Installing StorageClass ?
✓ Joining worker nodes ?
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community ?
創建完畢後,直接使用 docker ps
來觀察結果
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
97d7d804ea75 kindest/node:v1.17.0 "/usr/local/bin/entr…" 4 minutes ago Up 4 minutes kind-worker2
9085118d47b3 kindest/node:v1.17.0 "/usr/local/bin/entr…" 4 minutes ago Up 4 minutes 127.0.0.1:32768->6443/tcp kind-control-plane
b9eedb6d5f38 kindest/node:v1.17.0 "/usr/local/bin/entr…" 4 minutes ago Up 4 minutes kind-worker
可以觀察到的確有相對應數量的 docker container 被叫起來,不同於 k3d
, kind
並不會幫忙準備額外的 load-balancer,所以數量就是我們指定的數量
不同於 k3d
, kind
本身創建完畢後就會直接把相關的 KUBECONFIG 給寫入到 $home/.kube/config
裡面,因此使用者可以直接使用預設的位置來進行使用
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready master 13m v1.17.0
kind-worker Ready <none> 12m v1.17.0
kind-worker2 Ready <none> 12m v1.17.0
KIND 本身並沒有辦法動態增加節點,這個是使用上的限制,不過我認為這個功能不會影響太多,畢竟作為一個本地測試的節點,有任何問題就砍掉重建就好,花費的時間也不會太長。