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
    6
    sudo 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
2
3
4
5
6
7
8
9
10
11
12
13
14
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
  • 为了让 Kubernetes 能够检查、转发网络流量,你需要修改 iptables 的配置,启用“br_netfilter”模块:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cat <<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
    2
    sudo swapoff -a
    sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

二、安装 kubeadm

我们要安装 kubeadm,在 Master 节点和 Worker 节点上都要做这一步。kubeadm 可以直接从 Google 自己的软件仓库下载安装,但国内的网络不稳定,很难下载成功,需要改用其他的软件源,这里我选择了国内的某云厂商:

1
2
3
4
5
6
7
8
9
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/repodata/repomd.xml.key
EOF
setenforce 0

更新了软件仓库,我们就可以用 yum install 获取 kubeadm、kubelet 和 kubectl 这三个安装必备工具了。yum 默认会下载最新版本,但我们也可以指定版本号,比如使用“1.31”:

1
2
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

安装完成之后,你可以用 kubeadm version、kubectl version 来验证版本是否正确:

1
2
kubeadm version
kubectl version --client

三、下载 Kubernetes 组件镜像

从国内的镜像网站下载然后再用 docker tag 改名,能够使用 Shell 编程实现自动化:

1
2
3
4
5
6
7
8
9
10
11
12
repo=registry.aliyuncs.com/google_containers

for name in `kubeadm config images list --kubernetes-version v1.31.3`; do

src_name=${name#k8s.gcr.io/}
src_name=${src_name#coredns/}

docker pull $repo/$src_name

docker tag $repo/$src_name $name
docker rmi $repo/$src_name
done

安装 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
2
3
sudo kubeadm init \
--pod-network-cidr=10.10.0.0/16 \
--kubernetes-version=v1.31.3

kubeadm 的安装过程很快就完成了,它还会提示出接下来要做的工作:

1
2
3
mkdir -p $HOME/.kube  
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

意思是要在本地建立一个“.kube”目录,然后拷贝 kubectl 的配置文件,你只要原样拷贝粘贴就行。

另外还有一个很重要的“kubeadm join”提示,其他节点要加入集群必须要用指令里的 token 和 ca 证书,所以这条命令务必拷贝后保存好:

1
2
kubeadm join ip:6443 --token abc.defghi \
--discovery-token-ca-cert-hash sha256:token

安装完成后,你就可以使用 kubectl version、kubectl get node 来检查 Kubernetes 的版本和集群的节点状态了:

1
2
kubectl version
kubectl get node