使用 Minikube 来部署本地 kubernetes 多节点集群

Posted by ShenHengheng on 2019-02-18

一般来讲,使用minikube的目的主要用于作为本地单机测试集群,也只能构建单节点的kubernetes集群,本文章参看凯仁兄的方法使得minikube能够借助vitual box软件来实现多节点的部署,其中包括Master/Worker节点的部署与安装,下面主要针对kubernetes的最新版本kubernetes 1.13.2, 网络插件为Calico,主要为了测试Network Policy的功能。

img

系统准备

下面一定要确保以下的步骤都已经执行,所有要安装的软件包已经安转。

第一步肯定是准备minikube的执行文件,下面我列出了不同平台的二进制文件的下载地址:

误操作: 为了能够使 minikube 能够启动多节点的集群,一定使用上面给出的二进制执行文件链接。

提示:

如果你要使用 官方给的 minikube 的二进制文件来启动集群,此时如果你要使用网络插件Calico,请手动输入下面的命令即可生效。

$ kubectl apply -f https://docs.projectcalico.org/v2.4/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

第二步,需要将Virtual Box下载下来,然后提供给minikube来创建虚拟机。

IMPORTANT: 测试机器一定要开启 VT-x or AMD-v virtualization.

虽然建议使用 VBox,但是也可以其他的虚拟化解决方案,比如使用 KVM, xhyve等虚拟机管理软件。

第三步,下载测试机器操作系统适配的 kubeclt

启动集群

本节主要介绍如何使用minikube来建立集群,并且相应的创建master节点和worker节点。

开始之前,确认本测试机器是否已经安装过Minikube,如果有的话,就把上面下载二进制文件放置在任意方便的位置,或者直接替代之前的然后在启动集群之前,删除Home文件夹下的.minikube文件夹。

$ rm -rf $HOME/.minikube

Master 节点

首先通过 Minikube 执行以下指令来启动 Master节点,并通过 kubectl 检查:

$ minikube --profile k8s-m1 start --network-plugin=cni --docker-env HTTP_PROXY=http://192.168.99.1:12333 --docker-env HTTPS_PROXY=http://192.168.99.1:12333 --docker-env NO_PROXY=127.0.0.1/24
?  minikube v0.34.1 on darwin (amd64)
?  Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...
?  "k8s-m1" IP address is 192.168.99.102
?  Configuring Docker as the container runtime ...
    ▪ env HTTP_PROXY=http://192.168.99.1:12333
    ▪ env HTTPS_PROXY=http://192.168.99.1:12333
    ▪ env NO_PROXY=127.0.0.1/24
✨  Preparing Kubernetes environment ...
?  Pulling images required by Kubernetes v1.13.3 ...
?  Launching Kubernetes v1.13.3 using kubeadm ... 
?  Configuring cluster permissions ...
?  Verifying component health .....
?  kubectl is now configured to use "k8s-m1"
?  Done! Thank you for using minikube!

--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节点,通过minikube执行下面指令来启动Node节点。

$ 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.

1). 上面的 IP 有可能不同,请手动确认 Master 节点 IP。

2). 如果上面的TOKEN失效,请使用下面的指令生成一个,或者生成TOKEN时指定tt值为-1

$ minikube --profile k8s-m1 ssh "sudo kubeadm token create"

接下来,我们可以通过 kuubectl 客户端检查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          2m46s   192.168.99.100   k8s-m1   <none>

这样一个 Kubernetes 集群就完成了,速度快一点不到 10 分钟就可以建立好了。

删除虚拟机

清除环境一条指令即可:

$ minikube --profile <node_name> delete