在阿里云上搭建双节点 kubeadm 集群
本文章将带您在阿里云上搭建双节点 kubeadm 集群,此后假设您对容器技术及 Kubernetes(俗称 K8s)有基本的认知,例如完成 K8s 官网上的 Kubernetes Basics 教程或 edX 上的 LFS158x: Introduction to Kubernetes 课程。
此外,本教程假设您已经注册阿里云账号并开通 ECS 服务;当然,您可以尝试本地部署 kubeadm 集群或使用其他公有云,但具体程序可能因此有别,中途遇到的问题也可能不同;新手建议严格根据教程操作。
为何搭建 kubeadm 集群?
针对生产环境,很多公有云提供方便、快捷的托管 K8s 服务如阿里云的 ACK;针对 K8s 初学者及个人用户则有本地免配置快速部署的 Minikube、kind。既然如此,为何要花时间与精力亲自部署 kubeadm 集群?
以下是您需要亲自部署 kubeadm 集群的一些可能的情况:
- 您的业务需求需要透过高度定制的 K8s 集群实现,一般公有云托管 K8s 服务无法满足;
- kubeadm 是一个厂商中立的工具,使用它搭建集群能避免供应商锁定;
- 您在备考 云原生计算基金会 (CNCF) 的 CKA 认证,搭建、维护 kubeadm 集群是每个 CKA 认证工程师必有的技能
实操环境
本教程采用 2 个阿里云 ECS 实例,规格 g7.large
(2 vCPU、8G 内存),运行 Alibaba Cloud Linux 3.2104 LTS,使用 SSH 密钥登录 ecs-user
账号,采用 sudo
提权,其中 1 个实例 k8s-master0
将作为主节点、1 个实例 k8s-worker0
将成为工作节点。
为了方便着想,两个实例建议放在同一个 VPC 及安全组下,安全组只需对外开放 SSH (22/tcp) 端口。
配置主节点
事前配置
在主节点上安装 kubeadm 等 K8s 组件前先做一些配置,这样搭建集群时会更顺利一些,减少中途遇到的问题。
首先把 /opt/cni/bin
、/usr/local/sbin
、/usr/local/bin
三个路径加到当前用户的 PATH
中,一会儿组件的可执行文档将放到这些目录下:
echo "export PATH=\"/opt/cni/bin:/usr/local/sbin:/usr/local/bin:\$PATH\"" >> "$HOME/.bashrc" && \
source "$HOME/.bashrc"
然后用 sudo visudo
命令编辑 sudoers 配置文档,把这一行:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
改为:
Defaults secure_path = /opt/cni/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
接着把主节点 k8s-master0
的 VPC IP 地址导出到环境变量 K8S_CONTROL_PLANE
中,并把该 IP 地址与 k8s-control-plane
关联,把这个关联写到 /etc/hosts
中,其用处是使以后把控制平面升级为高可用架构铺路:
# 把 x.x.x.x 换成您 k8s-master0 主节点的 VPC IP 地址
export K8S_CONTROL_PLANE="x.x.x.x"
echo "$K8S_CONTROL_PLANE k8s-control-plane" | sudo tee -a /etc/hosts
接着安装 iproute-tc
软件包,解决 kubeadm
的一个警告:
sudo dnf install --refresh -y iproute-tc
然后加载 br_netfilter
内核模块并确保开机时自动加载,并启用 net.bridge.bridge-nf-call-iptables
、net.ipv4.ip_forward
两个内核参数,不然创建集群时会失败:
sudo modprobe br_netfilter
echo br_netfilter | sudo tee /etc/modules-load.d/kubernetes.conf
cat << EOF | sudo tee -a /etc/sysctl.conf
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
EOF
sudo sysctl -p
最后重启 k8s-master0
主节点:
sudo systemctl reboot
安装与启用 K8s 组件
我们将按顺序安装以下组件:
容器运行时 (CRI) | K8s 版本 | 容器网络 (CNI) |
---|---|---|
containerd 1.7.1 | 1.26.5 | Calico |
容器运行时 (CRI) 是指 kubelet 创建容器时依赖的运行时,较常见的有 Docker(透过 cri-dockerd
兼容)、containerd、CRI-O,其中 containerd 的配置最为直接、简单,而 Docker 由于历史原因并不遵循 CRI 界面,所以自 K8s 上游 1.24 版本去掉 Dockershim 兼容层后需要额外安装配置 cri-dockerd
兼容层。
K8s 版本则使用 1.26.5,这个版本至今(2023-05-27)是 n - 1
小版本(n
指最新版本),不直接使用最新版本是为了以后方便实操演练 kubeadm 集群升级。
容器网络 (CNI) 则指 K8s 集群中 Pod 与 Pod 之间用以相互沟通的网络环境,需要至少实现以下的沟通渠道:
- 容器间的沟通
- Pod 间的沟通
- Pod 与 Service 的沟通
- 外部与 Service 的沟通
常见的 CNI 包括但不限于 Flannel、Calico,两者中 Flannel 相对简单,但 Calico 支持更多功能如网络策略。
以下教程取自于 K8s 官网的 Installing kubeadm [1] 教程及相关页面。
安装 containerd
安装 K8s 组件前需要做的第一件事是安装 CRI,这里我们采用 containerd [2] 。
首先参考 containerd GitHub 仓库的 Getting started 教程 [3] 安装 containerd、runc 及 CNI 插件。
这里采用 1.7.1 版本,把相关压缩包下载并解压到 /usr/local
下:
wget https://github.com/containerd/containerd/releases/download/v1.7.1/containerd-1.7.1-linux-amd64.tar.gz
sudo