使用kubeadm安装k8s集群
2024-02-26 15:13:18

下文是在能够正常访问 google 的网络下完成部署,如果你的网络不方便连通外网,可能需要提前下载镜像或者在执行 kubeadm init 时指定镜像仓库地址等方式来下载镜像。

前言

前不久花钱买了 CKA 和 CKS 的考试,打算今年把这两个证考了,所以又开始在家里折腾起集群来了。之前写过一篇用 kind 来部署 k8s 集群的,使用 kind 确实非常方便,一行命令就启动了,但是那种方式部署的集群,整个集群实际上在一个容器之中,个人认为比较适用的场景是用来跑测试之类的。当然,kubeadm 部署也非常简单,也是几条命令就可以自动化部署完成了。

准备

在部署集群的过程中,记得一定要看官网文档,网络上有很多的博客都写了要怎么安装,怎么部署,但是有很多已经是过时的,k8s 的更新非常快,大多数情况下可能按照以前的方式都可以执行成功,但是偶尔遇到一个问题可能就会卡半天。基于前面所提到的,下文中的安装方式都尽量以链接的方式指向官网文档。

需要在部署之前安装的程序:kubectl、kubeadm、kubelet

参考安装 kubeadm ,先在机器上安装容器运行时,以及上面提到的三个程序。
其中:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

部署 k8s

使用 kubeadm init --args 即可一键部署集群,init 指令可以添加多个参数,需要查看各个参数的含义以及使用方式,可以查血 kubeadm init

由于只是个人部署的测试集群,我这里只添加一个参数: --pod-network-cidr ,用于指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

自定义 pod 网络的目的是为了避免于主机中现有的网络发生冲突,如果不指定,那么默认的 CIDR 为 192.168.0.0/16

耐心等待一段时间,终端中会给出安装成功的提示,并且会给出指引,复制 kubeconfig 文件到当前用户目录下等等。最后还有一点,单节点部署时,当前节点是控制平面节点,默认不会参与 pod 调度,因此还需要移除当前节点上的 taints。

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

1.25版本只需要执行前一条就足够,更旧版本的 k8s 可能还需要多执行下面这条指令
kubectl taint nodes --all node-role.kubernetes.io/master-

安装 calico 网络

如果前面的流程顺利,此时执行 kubectl get nodes 可以看到有一个控制平面节点已经处于 Ready 状态。同时还可以使用 kubectl get pods -ALL 查看所有的 pod 都已经处于 running 状态。

要使得集群中的 pod 能够正常工作通信,还需要安装一个网络插件,这里我选择的是 calico ,选它的原因是为了后面能够更好的和 istio 搭配来使用。

安装 calico 只需要两条指令,通过 operator 来完成整个的安装。这里的版本号为 v3.25,在复制之前,建议先去 [Quickstart for Calico on Kubernetes] 看一下,v3.25 有可能已经过时,安装的方式也可能有改变。

1
2
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml

总结

安装 k8s 时,需要多查阅一下官方文档,如果在看中文文档时觉得有问题,最好切换问英文文档再仔细对比下,因为 k8s 官网的中文文档更新是要落后于英文的。安装完成后,需要安装一个 pod 网络插件,选择 calico 的原因是在后面使用 istio 的时候更加方便。