本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
建立執行 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 Burns,Google 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 和我一樣偶爾拔掉一些插頭 :-)