Kubernetes 元件介紹與 minikube 安裝教學


上一篇文章「K8s 架構介紹」介紹了 K8s 基本架構,今天繼續介紹真正使用 K8s 時會接觸到的各種元件,順便在本機環境安裝一下 minikube 來玩玩,有了環境就可以測試 K8s 集群操作囉。

Kubernates Object 介紹

開始使用 K8s 以前,可以先了解一下與原本的 Docker Container 有什不同?由於 K8s 是一種 Container Manager,因此所有能力都是建構於 Docker 之上。我們先來了解一下基本概念:

Pod

Pod 表示一個 Application,這裡一個 Pod 並不是表示一個 Container 喔,由於 Docker 的最佳實踐應該是「一個 Process 一個 Container」,但是實務上,一個應用服務可能由好幾個行程所組成,所以需要 Pod 來包裝這些 Container。以前喜歡透過 supervisord 在同一個 Container 中啟動多個服務,其實這種作法不是很健康。在同一個 Pod 裡面的 Container 使用了同樣的 Namaspace,彼此之間可以共用 Volume, Network, Shared Memory (底層透過 tmpfs 實現),交給 K8s 來管理每一個 Container 是最正確的作法。

Replication Controller

有了 Pod 之後如果需要水平擴充,就可以透過 Replication 機制來完成。在 Cluster 裡頭我們常常會在不同的節點執行多個服務實體,做一樣的事但是分散運算在不同的機器中,可以解決單點故障 (SPOF) 的問題。這個功能主要用來管理與建立 Pod 的副本,可以將副本執行在不同的 Node,達到分散運算的效果。真正的使用者連線到 Service 時,會將連線派送到不同的 Pod 中,好分散流量。

Service

當一個 Pod 被啟動時,可以對外開啟 TCP/UDP Port 提供服務,但是這些 Port 並不會直接映射到 Host 的網路,這時候就需要 Service 這個功能來幫忙,可以想像就是平常啟動 docker 使用的 -p 80:8080 這樣的功能。由於我們在 K8s Cluster 中並不關心 Pod 執行在那一個 Node,所有的資源協調可以由 K8s 自動調度完成 (當然也可以透過 tag 指定),Service 可以正確的將服務對應到正確的 Pod,他自己會知道 Pod 跑在那一個 Node,底層利用了 IP in IP 技術實現 (VXLAN)。除了外部連線以外,Pod 與 Pod 之前的溝通也要透過 Service 才會是最正確的方法。

Deployment

剛剛講到的 Replication Controller 看起來很棒對吧,但是有了 Deployment 就可以讓 Replication 先旁邊休息了。Deployment 擁有最棒的能力就是「灰度升級」功能,當我們的服務封裝在 Pod 中需要升級時,為了避免服務不中斷,我們會採用慢慢升級的方式,而不是把所有 Container 關掉一次更新 (失敗就 GG 惹),這樣的漸進式更新的工作就叫做「灰度升級」。然而 Deployment 就是 K8s 中灰度升級的實踐。

Secrets

Secrets 主要用來存放一些敏感的資料,比如資料庫帳號密碼等等。使用時可以將 Secrets 透過環境變數檔案掛載的方式將資料載入到 Pod 中。目的在切分架構與資料,可以讓佈署設定更容易重複使用,透過掛載不同的 Secrets 就可以切換環境,用起來很方便。

上述其實並沒有介紹所有的 K8S 元件,有一些我們會放到後面才會提到,像是 StatefulSet, PersistentVolume 等等,接下來我們看一下如何建立 K8S 環境。

安裝 K8S minikube 單機板測試環境

要開始玩 K8s 首先需要用來操作的 kubectl 工具與一個 K8s Cluster,Ubuntu 安裝 kubectl 的方式如下:

sudo apt-get install -y kubectl

kubectl 是用來操作 K8s Cluster  CLI Tools,接下來我們在自己的電腦安裝單機板的 minikube,這樣一來就可以測試了。

安裝 minikube

minikube 其實是透過 VirtualBox 啟動一個已經安裝好的 VM,安裝方式如下:

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
sudo cp minikube /usr/local/bin/
rm minikube

安裝好以後透過以下命令啟動 minikube

minikube start

由於 minikube 就是一個 VirtualBox VM,所以 minikube 啟動後我們如果開啟 VirtualBox 應用程式,也可以看到這一個 VM 正在執行中。如下圖:

minikube vm

再來啟動 K8s Dashboard,指令如下:

minikube dashboard

執行後會顯示開啟的 Port,如下:

minikube-dashboard

這個 Dashboard 其實也是一個 Pod,我們可以透過瀏覽器進行連線 (http://192.168.99.100:30000),進來後可以看到整的 K8s 的狀態,也可以直接進 Container 進行做操作,非常好用。

minikube-dashboard-admin

啟動成功以後我們就可以執行 kubectl 命令了,先測試一下 kubectl get all ,順利的話可以看到以下與 Dashboard 一樣的結果:

kubectl-get-all

kubectl 的設定檔在 ~/.kube/config 這個檔案中,裡面會有當我們執行 kubectl 命令時需要連線的 K8S Cluster 位置與認證資訊。

看一下 minikube 建立的綁定的 Interface IP Address

minikube status

minikube-status

如果你不想裝 K8S Cluster 想要直接把玩 K8S,這裡也有一個 線上的 K8S 版本可以進行測試,另外推薦一個很棒的 K8S 教學網站,也是 Kubernetes 官方提供的教資源,在「K8S 線上教學」這裡。

此外預設 K8S 內開啟的 Service 只能使用 30000~32767 Port,如果要開放更廣範圍的 Port,必須在啟動的時候帶入參數,K8S 打開全部的 Port 方法如下:

minikube stop && minikube start --extra-config=apiserver.ServiceNodePortRange=1-65535

如果您的測環境需要從自己建立的 Registry 載入 Image,如果沒有正確的 HTTPS 憑證,啟動的時候就需要透過以下方式加入自訂的 insecure registry:

minikube start --insecure-registry="registry.example.com"

Kubernetes 基本元件介紹與 minikube 安裝就介紹到這裡,下次見...

這是真的廣告

白金贊助

平價童鞋首選