利用 Minikube 快速建立測試用 Kubernetes 叢集

Posted by Kyle Bai on 2019-01-22

本文將說明如何透過 Minikube 建立多節點 Kubernetes 叢集。一般來說 Minikube 僅提供單節點功能,即透過虛擬機建立僅有一個具備 Master/Node 節點的 Kubernetes 叢集,但由時候需要測試多節點功能,因此自己改了一下 Minikube 來支援最新版本(v1.13.2)的多節點部署,且 CNI Plugin 採用 Calico,以方便測試 Network Policy 功能。

事前準備

開始部署叢集前需先確保以下條件已達成:

如果上面連結掛了,可以透過以下方式安裝:

$ git clone https://github.com/kairen/minikube.git -b multi-node $GOPATH/src/k8s.io/minikube
$ cd $GOPATH/src/k8s.io/minikube
$ make
  • 在測試機器下載 Virtual Box 來提供給 Minikube 建立虛擬機。
  • IMPORTANT: 測試機器記得開啟 VT-x or AMD-v virtualization.
  • 雖然建議用 VBox,但是討厭 Oracle 的人可以改用其他虛擬化工具(ex: KVM, xhyve),理論上可以動。
  • 下載所屬作業系統的 kubeclt
  • 目前已測試過 Ubuntu 16.04 Desktop、Mac OS X 與 Windows 10 作業系統。
  • Windows 使用者建議用 git bash 來操作。

建立叢集

本節將說明如何建立 Master 與 Node 節點,並將這些節點組成一個叢集。

在開始前確認之前是否已經裝過 Minikube,若有的話,就把上面下載二進制檔放任意方便你執行的位置,或者直接取代之前的,然後再開始前請先刪除 Home 目錄的.minikube資料夾:

$ rm -rf $HOME/.minikube

Master 節點

首先透過 Minikube 執行以下指令來啟動 Master 節點,並透過 kubectl 檢查:

$ minikube --profile k8s-m1 start --network-plugin=cni
...
Everything looks great. Please enjoy minikube!

$ kubectl -n kube-system get po -o wide
NAME                             READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
calico-node-8cbc6                2/2     Running   0          6m29s   192.168.99.100   k8s-m1   <none>           <none>
coredns-86c58d9df4-4nzlx         1/1     Running   0          6m32s   10.244.0.3       k8s-m1   <none>           <none>
coredns-86c58d9df4-9879v         1/1     Running   0          6m32s   10.244.0.2       k8s-m1   <none>           <none>
etcd-k8s-m1                      1/1     Running   0          5m58s   192.168.99.100   k8s-m1   <none>           <none>
kube-addon-manager-k8s-m1        1/1     Running   0          5m47s   192.168.99.100   k8s-m1   <none>           <none>
kube-apiserver-k8s-m1            1/1     Running   0          5m43s   192.168.99.100   k8s-m1   <none>           <none>
kube-controller-manager-k8s-m1   1/1     Running   0          5m47s   192.168.99.100   k8s-m1   <none>           <none>
kube-proxy-qnq25                 1/1     Running   0          6m32s   192.168.99.100   k8s-m1   <none>           <none>
kube-scheduler-k8s-m1            1/1     Running   0          5m59s   192.168.99.100   k8s-m1   <none>           <none>
storage-provisioner              1/1     Running   0          6m30s   192.168.99.100   k8s-m1   <none>           <none>
  • --vm-driver 可以選擇使用其他 VM driver 來啟動虛擬機,如 xhyve、hyperv、hyperkit 與 kvm2 等等。

完成後,確認 k8s-m1 節點處於 Ready 狀態:

$ kubectl get no
NAME     STATUS   ROLES    AGE    VERSION
k8s-m1   Ready    master   2m8s   v1.13.2

Node 節點

確認 Master 完成後,這邊接著透過 Minikube 開啟新的節點來加入:

$ minikube --profile k8s-n1 start --network-plugin=cni --node
...
Stopping extra container runtimes...

# 接著取得 Master IP 與 Token
$ minikube --profile k8s-m1 ssh "ifconfig eth1"
$ minikube --profile k8s-m1 ssh "sudo kubeadm token list"

# 執行以下指令進入 k8s-n1
$ minikube --profile k8s-n1 ssh

# 這邊為進入 k8s-n1 VM 內執行的指令
$ sudo su -
$ TOKEN=7rzqkm.1goumlnntalpxvw0
$ MASTER_IP=192.168.99.100
$ kubeadm join --token ${TOKEN} ${MASTER_IP}:8443 \
    --discovery-token-unsafe-skip-ca-verification \
    --ignore-preflight-errors=Swap \
    --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests

# 看到以下結果後,即可以在 k8s-m1 context 來操作。
...
Run 'kubectl get nodes' on the master to see this node join the cluster.
  • 另外上面的 IP 有可能會不同,請確認 Master 節點 IP。
  • 其他節點以此類推。

完成後,透過 kubectl 檢查 Node 是否有加入叢集:

$ kubectl config use-context k8s-m1
Switched to context "k8s-m1".

$ kubectl get no
NAME     STATUS   ROLES    AGE     VERSION
k8s-m1   Ready    master   3m44s   v1.13.2
k8s-n1   Ready    <none>   80s     v1.13.2

$ kubectl get csr
NAME                                                   AGE    REQUESTOR                 CONDITION
node-csr-Ut1k5mLXpXVsyZwjn2z2-fpie9HHyTkMU7wnrjDnD3E   118s   system:bootstrap:3qeeeu   Approved,Issued

$ kubectl -n kube-system get po -o wide
NAME                             READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
calico-node-qxkw5                2/2     Running   0          86s     192.168.99.101   k8s-n1   <none>           <none>
calico-node-srhlk                2/2     Running   0          3m24s   192.168.99.100   k8s-m1   <none>           <none>
coredns-86c58d9df4-826nz         1/1     Running   0          3m27s   10.244.0.3       k8s-m1   <none>           <none>
coredns-86c58d9df4-9z7mr         1/1     Running   0          3m27s   10.244.0.2       k8s-m1   <none>           <none>
etcd-k8s-m1                      1/1     Running   0          2m40s   192.168.99.100   k8s-m1   <none>           <none>
kube-addon-manager-k8s-m1        1/1     Running   0          3m48s   192.168.99.100   k8s-m1   <none>           <none>
kube-addon-manager-k8s-n1        1/1     Running   0          86s     192.168.99.101   k8s-n1   <none>           <none>
kube-apiserver-k8s-m1            1/1     Running   0          2m36s   192.168.99.100   k8s-m1   <none>           <none>
kube-controller-manager-k8s-m1   1/1     Running   0          2m50s   192.168.99.100   k8s-m1   <none>           <none>
kube-proxy-768w8                 1/1     Running   0          86s     192.168.99.101   k8s-n1   <none>           <none>
kube-proxy-b7ndj                 1/1     Running   0          3m27s   192.168.99.100   k8s-m1   <none>           <none>
kube-scheduler-k8s-m1            1/1     Running   0          2m46s   192.168.99.100   k8s-m1   <none>           <none>
storage-provisioner              1/1     Running   0          3m17s   192.168.99.100   k8s-m1   <none>           <none>

這樣一個 Kubernetes 叢集就完成了,速度快一點不到 10 分鐘就可以建立好了。

刪除虛擬機與檔案

最後若想清除環境的話,直接刪除虛擬機即可:

$ minikube --profile <node_name> delete

而檔案只要刪除 Home 目錄的.minikube資料夾,以及minikube執行檔即可。