(https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/)
本文用 kubeadm搭建出一个新的 Kubernetes 集群,一起来看看更真实的云原生环境。
一、什么是kubeadm
Kubernetes 是很多模块构成的,而实现核心功能的组件像 apiserver、etcd、scheduler 等本质上都是可执行文件,所以也可以采用和其他系统差不多的方式,使用 Shell 脚本或者 Ansible 等工具打包发布到服务器上。
不过 Kubernetes 里的这些组件的配置和相互关系实在是太复杂了,用 Shell、Ansible 来部署的难度很高,需要具有相当专业的运维管理知识才能配置、搭建好集群,而且即使这样,搭建的过程也非常麻烦。
为了简化 Kubernetes 的部署工作,让它能够更“接地气”,社区里就出现了一个专门用来在集群中安装 Kubernetes 的工具,名字就叫“kubeadm”,意思就是“Kubernetes 管理员”。
kubeadm,原理和 minikube 类似,也是用容器和镜像来封装 Kubernetes 的各种组件,但它的目标不是单机部署,而是要能够轻松地在集群环境里部署 Kubernetes,并且让这个集群接近甚至达到生产级质量。而在保持这个高水准的同时,kubeadm 还具有了和 minikube 一样的易用性,只要很少的几条命令,如 init、join、upgrade、reset 就能够完成 Kubernetes 集群的管理维护工作,这让它不仅适用于集群管理员,也适用于开发、测试人员。
安装前的准备工作
因为 Kubernetes 对系统有一些特殊要求,我们必须还要在 Master 和 Worker 节点上做一些准备。这些工作的详细信息你都可以在 Kubernetes 的官网上找到,但它们分散在不同的文档里,比较凌乱,所以我把它们整合到了这里,包括改主机名、改 Docker 配置、改网络设置、改交换分区这四步。
- 由于 Kubernetes 使用主机名来区分集群里的节点,所以每个节点的 hostname 必须不能重名。你需要修改“/etc/hostname”这个文件,把它改成容易辨识的名字,比如 Master 节点就叫 master,Worker 节点就叫 worker:
1 | sudo vi /etc/hostname |
安装Docker
1
2
3
4
5
6sudo yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin虽然 Kubernetes 目前支持多种容器运行时,但 Docker 还是最方便最易用的一种,所以我们仍然继续使用 Docker 作为 Kubernetes 的底层支持,使用 yum 安装 Docker Engine
安装完成后需要你再对 Docker 的配置做一点修改,在“/etc/docker/daemon.json”里把 cgroup 的驱动程序改成 systemd ,然后重启 Docker 的守护进程,具体的操作我列在了下面:
1 | cat <<EOF | sudo tee /etc/docker/daemon.json |
- 为了让 Kubernetes 能够检查、转发网络流量,你需要修改 iptables 的配置,启用“br_netfilter”模块:
1
2
3
4
5
6
7
8
9
10
11cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF
sudo sysctl --system - 你需要修改“/etc/fstab”,关闭 Linux 的 swap 分区,提升 Kubernetes 的性能:
1
2sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
二、安装 kubeadm
我们要安装 kubeadm,在 Master 节点和 Worker 节点上都要做这一步。kubeadm 可以直接从 Google 自己的软件仓库下载安装,但国内的网络不稳定,很难下载成功,需要改用其他的软件源,这里我选择了国内的某云厂商:
1 | cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo |
更新了软件仓库,我们就可以用 yum install 获取 kubeadm、kubelet 和 kubectl 这三个安装必备工具了。yum 默认会下载最新版本,但我们也可以指定版本号,比如使用“1.31”:
1 | yum install -y kubelet kubeadm kubectl |
安装完成之后,你可以用 kubeadm version、kubectl version 来验证版本是否正确:
1 | kubeadm version |
三、下载 Kubernetes 组件镜像
从国内的镜像网站下载然后再用 docker tag 改名,能够使用 Shell 编程实现自动化:
1 | repo=registry.aliyuncs.com/google_containers |
安装 Master 节点准备工作都做好了,现在就可以开始正式安装 Kubernetes 了,我们先从 Master 节点开始。
kubeadm 的用法非常简单,只需要一个命令 kubeadm init 就可以把组件在 Master 节点上运行起来,不过它还有很多参数用来调整集群的配置,你可以用 -h 查看。
这里我只说一下我们实验环境用到的 3 个参数:
–pod-network-cidr,设置集群里 Pod 的 IP 地址段。
–apiserver-advertise-address,设置 apiserver 的 IP 地址,对于多网卡服务器来说很重要(比如 VirtualBox\Vmware虚拟机就用了两块网卡),可以指定 apiserver 在哪个网卡上对外提供服务。
–kubernetes-version,指定 Kubernetes 的版本号。
下面的这个安装命令里,我指定了 Pod 的地址段是“10.10.0.0/16”,Kubernetes 的版本号是“1.23.3”:
1 | sudo kubeadm init \ |
kubeadm 的安装过程很快就完成了,它还会提示出接下来要做的工作:
1 | mkdir -p $HOME/.kube |
意思是要在本地建立一个“.kube”目录,然后拷贝 kubectl 的配置文件,你只要原样拷贝粘贴就行。
另外还有一个很重要的“kubeadm join”提示,其他节点要加入集群必须要用指令里的 token 和 ca 证书,所以这条命令务必拷贝后保存好:
1 | kubeadm join ip:6443 --token abc.defghi \ |
安装完成后,你就可以使用 kubectl version、kubectl get node 来检查 Kubernetes 的版本和集群的节点状态了:
1 | kubectl version |