本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

建立執行 Kubernetes 的 Raspberry Pi 叢集,安裝 (第二部分)

在比利時 Devoxx 和摩洛哥 Devoxx,Ray Tsang 和我 (Arjen Wassink) 展示了我們在 Quintor 建立的 Raspberry Pi 叢集,該叢集執行 HypriotOS、Docker 和 Kubernetes。雖然我們收到了許多對演講的讚美,但最常見的問題是如何自行建立 Pi 叢集!我們將分兩個部分進行。 第一部分涵蓋了叢集的購物清單,而這第二部分將向您展示如何啟動並執行 Kubernetes...

現在您已完成 Raspberry Pi 叢集的所有設定,是時候在上面執行一些軟體了。如之前的部落格文章中所述,我將本教學課程基於 ARM 處理器的 Hypriot Linux 發行版。主要原因是捆綁了對 Docker 的支援。本教學課程我使用 此版本的 Hypriot,因此如果您在使用其他版本的 Hypriot 時遇到問題,請考慮我使用的版本。

第一步是確保每個 Pi 都執行了 Hypriot,如果尚未執行,請查看他們的入門指南。此外,將叢集交換器連接到網路,以便網際網路可用,並且每個 Pi 都透過 DHCP 指派 IP 位址。因為我們將執行多個 Pi,所以為每個 Pi 提供唯一的hostname是實用的。為了方便起見,我將我的 Pi 重新命名為 rpi-master、rpi-node-1、rpi-node-2 等。請注意,在 Hypriot 上,hostname是透過編輯 /boot/occidentalis.txt 檔案而不是 /etc/hostname 來設定的。您也可以使用 Hypriot 快閃工具設定 hostname。

在 Pi 上執行軟體最重要的事情是 ARM 發行版的可用性。感謝 Brendan BurnsGoogle Cloud Registry 中提供了適用於 ARM 的 Kubernetes 組件。這太棒了。第二個障礙是如何安裝 Kubernetes。有兩種方法:直接在系統上或在 Docker 容器中。雖然容器支援具有實驗性質,但我選擇使用它,因為它可以讓您更輕鬆地安裝 Kubernetes。Kubernetes 需要多個進程 (etcd、flannel、kubectl 等) 在節點上執行,這些進程應按特定順序啟動。為了簡化操作,提供了 systemd 服務,以便以正確的方式啟動必要的進程。此外,systemd 服務確保在節點 (重新) 啟動時啟動 Kubernetes。為了使安裝真正容易,我為 master 節點和 worker 節點建立了一個簡單的安裝腳本。所有內容都可在 GitHub 上取得。現在就開始吧!

安裝 Kubernetes master 節點

首先,我們將在 master 節點上安裝 Kubernetes,稍後再將 worker 節點新增到叢集中。基本上就是取得 git 儲存庫內容並執行安裝腳本。

$ curl -L -o k8s-on-rpi.zip https://github.com/awassink/k8s-on-rpi/archive/master.zip

$ apt-get update

$ apt-get install unzip

$ unzip k8s-on-rpi.zip

$ k8s-on-rpi-master/install-k8s-master.sh

安裝腳本將安裝五個服務

  • docker-bootstrap.service - 是一個單獨的 Docker daemon,用於執行 etcd 和 flannel,因為 flannel 需要在標準 Docker daemon (docker.service) 之前執行,因為網路組態。
  • k8s-etcd.service - 是用於儲存 flannel 和 kubelet 資料的 etcd 服務。
  • k8s-flannel.service - 是 flannel 進程,提供叢集中所有節點的覆蓋網路。
  • docker.service - 是標準 Docker daemon,但以 flannel 作為網路橋接器。它將執行所有 Docker 容器。
  • k8s-master.service - 是提供叢集功能的 Kubernetes master 服務。

此安裝程序的基本詳細資訊也記錄在 Kubernetes 的 入門指南 中。請查看它以更深入了解如何設定多節點 Kubernetes 叢集。

讓我們檢查一切是否正常運作。必須執行兩個 docker daemon 進程。

$ ps -ef|grep docker
root       302     1  0 04:37 ?        00:00:14 /usr/bin/docker daemon -H unix:///var/run/docker-bootstrap.sock -p /var/run/docker-bootstrap.pid --storage-driver=overlay --storage-opt dm.basesize=10G --iptables=false --ip-masq=false --bridge=none --graph=/var/lib/docker-bootstrap

root       722     1 11 04:38 ?        00:16:11 /usr/bin/docker -d -bip=10.0.97.1/24 -mtu=1472 -H fd:// --storage-driver=overlay -D

etcd 和 flannel 容器必須已啟動。

$ docker -H unix:///var/run/docker-bootstrap.sock ps

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES

4855cc1450ff        andrewpsuedonym/flanneld     "flanneld --etcd-endp"   2 hours ago         Up 2 hours                              k8s-flannel

ef410b986cb3        andrewpsuedonym/etcd:2.1.1   "/bin/etcd --addr=127"   2 hours ago         Up 2 hours                              k8s-etcd


The hyperkube kubelet, apiserver, scheduler, controller and proxy must be up.

$ docker ps

CONTAINER ID        IMAGE                                           COMMAND                  CREATED             STATUS              PORTS               NAMES

a17784253dd2        gcr.io/google\_containers/hyperkube-arm:v1.1.2   "/hyperkube controller"   2 hours ago         Up 2 hours                              k8s\_controller-manager.7042038a\_k8s-master-127.0.0.1\_default\_43160049df5e3b1c5ec7bcf23d4b97d0\_2174a7c3

a0fb6a169094        gcr.io/google\_containers/hyperkube-arm:v1.1.2   "/hyperkube scheduler"   2 hours ago         Up 2 hours                              k8s\_scheduler.d905fc61\_k8s-master-127.0.0.1\_default\_43160049df5e3b1c5ec7bcf23d4b97d0\_511945f8

d93a94a66d33        gcr.io/google\_containers/hyperkube-arm:v1.1.2   "/hyperkube apiserver"   2 hours ago         Up 2 hours                              k8s\_apiserver.f4ad1bfa\_k8s-master-127.0.0.1\_default\_43160049df5e3b1c5ec7bcf23d4b97d0\_b5b4936d

db034473b334        gcr.io/google\_containers/hyperkube-arm:v1.1.2   "/hyperkube kubelet -"   2 hours ago         Up 2 hours                              k8s-master

f017f405ff4b        gcr.io/google\_containers/hyperkube-arm:v1.1.2   "/hyperkube proxy --m"   2 hours ago         Up 2 hours                              k8s-master-proxy

在叢集上部署第一個 pod 和服務

當看起來不錯時,我們可以使用 kubectl 存取 Kubernetes 叢集的 master 節點。適用於 ARM 的 Kubectl 可以從 googleapis 儲存空間下載。kubectl get nodes 顯示哪些叢集節點已註冊及其狀態。master 節點名為 127.0.0.1。

$ curl -fsSL -o /usr/bin/kubectl https://dl.k8s.io/release/v1.1.2/bin/linux/arm/kubectl

$ kubectl get nodes

NAME              LABELS                                   STATUS    AGE

127.0.0.1         kubernetes.io/hostname=127.0.0.1         Ready      1h


An easy way to test the cluster is by running a busybox docker image for ARM. kubectl run can be used to run the image as a container in a pod. kubectl get pods shows the pods that are registered with its status.

$ kubectl run busybox --image=hypriot/rpi-busybox-httpd

$ kubectl get pods -o wide

NAME                   READY     STATUS    RESTARTS   AGE       NODE

busybox-fry54          1/1       Running   1          1h        127.0.0.1

k8s-master-127.0.0.1   3/3       Running   6          1h        127.0.0.1

現在 pod 正在執行,但應用程式通常無法存取。這可以透過建立服務來實現。叢集 IP 位址是服務在叢集內可用的 IP 位址。使用 master 節點的 IP 位址作為外部 IP,服務將在叢集外部可用(例如,在我的情況下為 http://192.168.192.161)。

$ kubectl expose rc busybox --port=90 --target-port=80 --external-ip=\<ip-address-master-node\>

$ kubectl get svc

NAME         CLUSTER\_IP   EXTERNAL\_IP       PORT(S)   SELECTOR      AGE

busybox      10.0.0.87    192.168.192.161   90/TCP    run=busybox   1h

kubernetes   10.0.0.1     \<none\>            443/TCP   \<none\>        2h

$ curl http://10.0.0.87:90/
\<html\>

\<head\>\<title\>Pi armed with Docker by Hypriot\</title\>

  \<body style="width: 100%; background-color: black;"\>

    \<div id="main" style="margin: 100px auto 0 auto; width: 800px;"\>

      \<img src="pi\_armed\_with\_docker.jpg" alt="pi armed with docker" style="width: 800px"\>

    \</div\>

  \</body\>

\</html\>

安裝 Kubernetes worker 節點

下一步是在每個 worker 節點上安裝 Kubernetes 並將其新增到叢集中。這基本上也歸結為取得 git 儲存庫內容並執行安裝腳本。不過在此安裝中,需要預先複製 k8s.conf 檔案並進行編輯以包含 master 節點的 IP 位址。

$ curl -L -o k8s-on-rpi.zip https://github.com/awassink/k8s-on-rpi/archive/master.zip

$ apt-get update

$ apt-get install unzip

$ unzip k8s-on-rpi.zip

$ mkdir /etc/kubernetes

$ cp k8s-on-rpi-master/rootfs/etc/kubernetes/k8s.conf /etc/kubernetes/k8s.conf

變更 /etc/kubernetes/k8s.conf 中的 IP 位址以符合 master 節點

$ k8s-on-rpi-master/install-k8s-worker.sh

安裝腳本將安裝四個服務。這些服務與 master 節點上的服務非常相似,但不同之處在於沒有 etcd 服務執行,並且 kubelet 服務配置為 worker 節點。

一旦 worker 節點上的所有服務都已啟動並執行,我們就可以在 master 節點上檢查該節點是否已新增到叢集中。

$ kubectl get nodes

NAME              LABELS                                   STATUS    AGE

127.0.0.1         kubernetes.io/hostname=127.0.0.1         Ready     2h

192.168.192.160   kubernetes.io/hostname=192.168.192.160   Ready     1h

$ kubectl scale --replicas=2 rc/busybox

$ kubectl get pods -o wide

NAME                   READY     STATUS    RESTARTS   AGE       NODE

busybox-fry54          1/1       Running   1          1h        127.0.0.1

busybox-j2slu          1/1       Running   0          1h        192.168.192.160

k8s-master-127.0.0.1   3/3       Running   6          2h        127.0.0.1

享受您的 Kubernetes 叢集!

恭喜!您現在已執行 Kubernetes Raspberry Pi 叢集,可以開始玩 Kubernetes 並開始學習。查看 Kubernetes 使用者指南 以了解您可以做什麼。並且別忘了像 Ray 和我一樣偶爾拔掉一些插頭 :-)