iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 18
0

前言

昨日了解到 K3s 這個輕量級的 Kubernetes 管理 Contaienr 管理工具後,今日就來手動嘗試部署一個 K3s cluster 吧!

部署 K3s cluster

在部署 Cluster 之前需要先準備的環境如下:
兩台 Host (VM 或主機) , Server VM 的 RAM 至少需要 512 MB,Work Node VM 的 RAM 至少需要 75MB,並且兩台主機都已經安裝好 Docker 了。

1. 首先在 Master 上安裝 K3s Server

切換到 root 使用者,並執行以下的 Command:

IPADDR=$(ip a show enp0s8 | grep "inet " | awk '{print $2}' | cut -d / -f1)
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v0.9.1 INSTALL_K3S_EXEC="--docker --node-ip=${IPADDR} --flannel-iface=enp0s8 --write-kubeconfig-mode 644 --no-deploy=servicelb --no-deploy=traefik" sh -

我們會執行 https://get.k3s.io 這程式裡面的腳本,而帶入的 option 有:

  • INSTALL_K3S_VERSION: 指定安裝 K3s 的版本
  • INSTALL_K3S_EXEC: 指定 k3s server 執行的 option
    • --docker: 選用 Docker 當作 K3s 的 container 引擎。
    • --node-ip=${IPADDR}: 設定 Master Node 的 IP
    • --flannel-iface=enp0s8: 設定 flannel 溝通用的 network interface ,請記得這邊的 enp0s8 改成自己主機的 network interface。
    • --write-kubeconfig-mode 644: 設定 kubeconfig 的權限 mode。
    • --no-deploy=servicelb --no-deploy=traefik: 設定不要部署 packaged 的 components。

這樣 K3s server 就安裝完了。
可以使用 systemctl status k3sjournalctl -u k3s 查看 K3s 的 Service 狀態。

並在進行下一步驟前,執行 echo "export NODE_TOKEN=$(sudo cat /var/lib/rancher/k3s/server/node-token)" 紀錄 Cluster Node 之間認證用的 Token。

2. 安裝 K3s Node

先在 /etc/hosts 加入 master node 與 IP 的對應。

echo "$K3SMASTER_IPADDRESS       $K3SMASTER_HOSTNAME" | sudo tee -a /etc/hosts

接著切換到 root 使用者後,貼上剛剛 Master Node 上取得的認證 token,如下

export NODE_TOKEN=K10571d20534c867fe6ce8d... 

並執行以下的 Command 來安裝 K3s agent

export K3SMASTER_IPADDRESS=...
IPADDR=$(ip a show enp0s8 | grep "inet " | awk '{print $2}' | cut -d / -f1)
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v0.9.1 INSTALL_K3S_EXEC="--docker --node-ip=${IPADDR} --flannel-iface=enp0s8" K3S_URL=https://${K3SMASTER_IPADDRESS}:6443 K3S_TOKEN=${NODE_TOKEN} sh -

在執行 https://get.k3s.io 這程式裡面的腳本中,INSTALL_K3S_EXEC 而外帶入的 option 有:

  • K3S_URL: 是讓 agent 知道他要和哪個 server 連線
  • K3S_TOKEN: 是用來認證用的

這樣 K3s agent 就安裝完了。
可以使用 systemctl status k3s-agent 查看 k3s-agent 的 Service 狀態。

快速安裝法

如果不想要依照以上方法一步一步操作的話,也可以參考 GitHub 上的 k3s-lab repository 來嘗試快速部署起一個 K3s Cluster。本篇也將採用這個方法安裝,這種部署環境需要具備 VirtualBox 以及 Vagrant ,並且主機尚有 1.6G 的 RAM 可以使用。安裝方法如下:

  1. 在 Host 上啟動兩台 VM 並且在 Master 的 VM 中安裝 K3s server。
$ sh deploy-vagrant.sh
  1. 在第一步驟完成後,會得到類似 export NODE_TOKEN=K10571d20534c867fe6ce8d... 的字串,將這字串複製後,透過 vageant ssh node1 進入 node 的 VM 並且執行以下的指令:
$ sudo su -
$ cd /home/vagrant/
$ export NODE_TOKEN=K10571d20534c867fe6ce8d... // 是複製的字串
$ sh install-k3s-node.sh ${NODE_TOKEN}

這樣就完成以上部署 K3s Cluster 了。接下來我們來驗證 K3s Cluster 是否正常吧!

功能驗證

首先先進入 Master Node,你可以透過 k3s 指令看到它有支援的 commands,如下,因此我們可以直接使用 kubectl, crictl, ctr:
而因為我們使用 Docker 為我們的 container 引擎,所以本篇只用 kubectl 來和大家一起驗證。

$ k3s -h
NAME:
   k3s - Kubernetes, but small and simple

USAGE:
   k3s [global options] command [command options] [arguments...]

VERSION:
   v0.9.1 (755bd1c6)

COMMANDS:
   server   Run management server
   agent    Run node agent
   kubectl  Run kubectl
   crictl   Run crictl
   ctr      Run ctr
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --debug        Turn on debug logs
   --help, -h     show help
   --version, -v  print the version

我們可以透過 kubectl 來查看 Cluster node 資訊與 component 的狀態。

$ kubectl get no -o wide
NAME     STATUS   ROLES    AGE   VERSION         INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
master   Ready    master   97m   v1.15.4-k3s.1   192.168.0.200   <none>        Ubuntu 18.04.3 LTS   4.15.0-64-generic   containerd://1.2.8-k3s.1
node1    Ready    worker   93m   v1.15.4-k3s.1   192.168.0.201   <none>        Ubuntu 18.04.3 LTS   4.15.0-64-generic   containerd://1.2.8-k3s.1

$ kubectl get componentstatus
NAME                 STATUS    MESSAGE   ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok

也可以用 kubectl 來跑一個 deployment 來啟動一個 nginx ,如以下 Lab。

$ kubectl run mynginx --image=nginx --replicas=1 --port=80
deployment.apps/mynginx created
$ kubectl expose deployment mynginx --port 80
service/mynginx exposed

$ kubectl get deploy,po,svc -o wide -l run=mynginx
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES   SELECTOR
deployment.extensions/mynginx   1/1     1            1           115s   mynginx      nginx    run=mynginx

NAME                           READY   STATUS    RESTARTS   AGE    IP          NODE    NOMINATED NODE   READINESS GATES
pod/mynginx-568f57494d-nsc8r   1/1     Running   0          115s   10.42.1.2   node1   <none>           <none>

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/mynginx   ClusterIP   10.43.220.117   <none>        80/TCP    27s   run=mynginx

$ curl 10.43.220.117
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

如上,其實使用方式和 Kubernetes 使用原本資源方法是一樣的,所以要更換 install 的工具,其實並不是太困難。

移除安裝

在 K3s Server 端執行

systemctl stop k3s && /usr/local/bin/k3s-uninstall.sh

;在 k3s agent 端執行

systemctl stop k3s-agent && /usr/local/bin/k3s-agent-uninstall.sh

結語

今天嘗試手動安裝 K3s ,除了安裝方式和 Kubernetes 方法安裝不一樣之外,使用方式竟然是意外的雷同,很多相容的地方,相信在在之後 Edge 與雲端的整合上會是很良好的。很樂見這樣的一種主流,也可以驗證為何會宣稱 "Kubernetes is getting very boring"了。

Reference


上一篇
[Day17] Kubernetes 邊緣運算 - 淺談 K3s Part1
下一篇
[Day19] 淺談 Kubernetes 自定義資源(Custom Resource)與自定義控制器(Custom Controller)
系列文
其實我真的沒想過要利用研替剩餘的 30 天分享那些年 On-premise Container & Kubernetes 經驗30

尚未有邦友留言

立即登入留言