![每天5分钟玩转Kubernetes](https://wfqqreader-1252317822.image.myqcloud.com/cover/754/26793754/b_26793754.jpg)
3.3 用kubeadm创建Cluster
完整的官方文档可以参考https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/。
3.3.1 初始化Master
在Master上执行如下命令:
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-T23_5257.jpg?sign=1739594729-zvsCO2Wkp5tHRkFN37pWmm7mOumcZSIy-0-9df04a821185439743d7168418f3d256)
--apiserver-advertise-address指明用Master的哪个interface与Cluster的其他节点通信。如果Master有多个interface,建议明确指定,如果不指定,kubeadm会自动选择有默认网关的interface。
--pod-network-cidr指定Pod网络的范围。Kubernetes支持多种网络方案,而且不同网络方案对--pod-network-cidr有自己的要求,这里设置为10.244.0.0/16是因为我们将使用flannel网络方案,必须设置成这个CIDR。在后面的实践中我们会切换到其他网络方案,比如Canal。
初始化过程如图3-2所示。
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-P24_1037.jpg?sign=1739594729-kMaKdI6tPmT7ZXeifRsxENMQzRx9t0i7-0-bedfcbf77bc3e9c2d8b8de473b22fb45)
图3-2
(1)kubeadm执行初始化前的检查。
(2)生成token和证书。
(3)生成KubeConfig文件,kubelet需要用这个文件与Master通信。
(4)安装Master组件,会从Google的Registry下载组件的Docker镜像。这一步可能会花一些时间,主要取决于网络质量。
(5)安装附加组件kube-proxy和kube-dns。
(6)Kubernetes Master初始化成功。
(7)提示如何配置kubectl,后面会实践。
(8)提示如何安装Pod网络,后面会实践。
(9)提示如何注册其他节点到Cluster,后面会实践。
3.3.2 配置kubectl
kubectl是管理Kubernetes Cluster的命令行工具,前面我们已经在所有的节点安装了kubectl。Master初始化完成后需要做一些配置工作,然后kubectl就能使用了。
依照kubeadm init输出的第7步提示,推荐用Linux普通用户执行kubectl(root会有一些问题)。
我们为用户ubuntu配置kubectl:
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-T25_5424.jpg?sign=1739594729-O6VWskrIdZxSLRpLqA6C80rTcX2pjUpZ-0-d2393a263abf87be3b12cd1d528b1aed)
为了使用更便捷,启用kubectl命令的自动补全功能:
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-T25_5425.jpg?sign=1739594729-UcH4SU2kjJzxjq052dB8rBcSTjKLyOyi-0-049ea32b327ba420312a720329df218a)
这样,用户ubuntu就可以使用kubectl了。
3.3.3 安装Pod网络
要让Kubernetes Cluster能够工作,必须安装Pod网络,否则Pod之间无法通信。
Kubernetes支持多种网络方案,这里我们先使用flannel,后面还会讨论Canal。
执行如下命令部署flannel,如图3-3所示。
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-T25_5426.jpg?sign=1739594729-E7qETpeVARx05oXl5YwoJcZKAyv8tUp0-0-f3bcb8bfb2035ef832126f75d592b57a)
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-P25_1100.jpg?sign=1739594729-Kj8th6PZUL7SiqvoRmVxLMvyGdtMKAxq-0-e0ba2e571bf3140ae71de915d584ea43)
图3-3
3.3.4 添加k8s-node1和k8s-node2
在k8s-node1和k8s-node2上分别执行如下命令,将其注册到Cluster中:
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-T25_5427.jpg?sign=1739594729-yv8cAMmD8CnWkUai8Z6EsYc0cOgykfVO-0-d44c897258eb232f5f7200a3e15e84ef)
这里的--token来自前面kubeadm init输出的第9步提示,如果当时没有记录下来,可以通过kubeadm token list查看,如图3-4所示。
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-P26_1122.jpg?sign=1739594729-nuiSNBr3SawHN9kOAUNM2h4i0rgr4yKs-0-be859ceb6d6e09c051065f2fc82b8463)
图3-4
kubeadm join执行如图3-5所示。
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-P26_1126.jpg?sign=1739594729-jkKew4lgSxMyySqQZv4sXYIqfeFkYW4s-0-9ad8031cc4afce3e653b2ecca7359ccb)
图3-5
根据提示,我们可以通过kubectl get nodes查看节点的状态,如图3-6所示。
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-P26_1130.jpg?sign=1739594729-ns0KCZHcYggeSWC2nmUMSvahMl5KgiM1-0-aa4bce56f85e591262a156f7df3c2925)
图3-6
目前所有节点都是NotReady,这是因为每个节点都需要启动若干组件,这些组件都是在Pod中运行,需要首先从Google下载镜像。我们可以通过如下命令查看Pod的状态,如图3-7所示。
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-T26_5428.jpg?sign=1739594729-t1if7KYU8NxPqtNGuX6QJP0ZMljbMFtS-0-e6a7ade4305c0a7b27e6d34634374284)
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-P26_1146.jpg?sign=1739594729-DaSloNeMsrLA5EBIWODN1Ky0ROUOLccB-0-7e7536d6f678e2a830e6a3cd78b14218)
图3-7
Pending、ContainerCreating、ImagePullBackOff都表明Pod没有就绪,Running才是就绪状态。我们可以通过kubectl describe pod <Pod Name>查看Pod的具体情况,比如:
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-T27_5429.jpg?sign=1739594729-LahcZUA00DHPQ6b7LTudPvbi9oBv55CZ-0-6648c44c4d80d9b07636da8179ae082e)
结果如图3-8所示。
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-P27_1166.jpg?sign=1739594729-Lh1uGRp11pjYzTU9BndC9JOvK0ObybIf-0-0a56eea9794801611ea173e1dd70cb12)
图3-8
为了节省篇幅,这里只截取命令输出的最后部分,可以看到在下载image时失败,如果网络质量不好,这种情况是很常见的。我们可以耐心等待,因为Kubernetes会重试,我们也可以自己手动执行docker pull去下载这个镜像。
等待一段时间,image成功下载后,所有Pod都会处于Running状态,如图3-9所示。
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-P27_1170.jpg?sign=1739594729-WdUCEjS9uFxCQPMIYs4oZ6W9MknIy7Lk-0-6883c88a5ca315e24fce0ab347564c2c)
图3-9
这时,所有的节点都已经准备好了,Kubernetes Cluster创建成功,如图3-10所示。
![](https://epubservercos.yuewen.com/F29C0A/15253388304118606/epubprivate/OEBPS/Images/Figure-P27_1174.jpg?sign=1739594729-KKPhExBBCKBxZsknM2zOHGfRoQzve1Tv-0-a15f4a2a9b6a6ad88010d2ec7060d91e)
图3-10