二进制部署单机k8s
前言
之前在单机测试k8s的kind最近故障了,虚拟机运行个几分钟后就宕机了,不知道是根因是什么,而且kind部署k8s不太好做一些个性化配置,干脆用二进制方式重新搭一个单机k8s。
因为是用来开发测试的,所以control-plane就不做高可用了,etcd+apiserver+controller-manager+scheduler都只有一个实例。
环境信息:
- 主机:Debian 12.7,4核CPU、4GB内存、30GB存储(只是部署一个k8s的话,2C2G的配置也足够)
- 容器运行时:containerd v1.7.22
- etcd: v3.4.34
- kubernetes:v1.30.5
- cni: calico v3.25.0
本文中的大部分配置文件已上传到 gitee - k8s-note ,目录为"安装k8s/二进制单机部署k8s-v1.30.5",如有需要可直接clone repo.
准备
本节命令大部分都要root权限,如果执行命令时提示权限不足,可自行切换root用户或使用sudo。
调整主机参数
- 修改主机名。kubernetes要求每个节点的hostname不一样
hostnamectl set-hostname k8s-node1
- 修改
/etc/hosts文件。如果内网有自建DNS可忽略
192.168.0.31 k8s-node1
- 安装时间同步服务。如果有多台主机,要注意主机之间的时间要同步。内网如果有时间同步服务器,可以修改chrony的配置来指向内网时间同步服务器
sudo apt install -y chrony
sudo systemctl start chrony
- 关闭swap。默认情况下,k8s没法在使用swap的主机上运行。这里用的临时关闭命令,固化配置需要修改
/etc/fstab文件,将swap相关配置行删除或注释。
sudo swapoff -a
- 装载内核模块。这步没做的话,下一步配置系统参数会报错。
# 1. 添加配置
cat <<EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
# 2. 立即装载
modprobe overlay
modprobe br_netfilter
# 3. 检查装载。如果没有输出结果则说明没有装载成功。
lsmod | grep br_netfilter
- 配置系统参数。主要是
net.bridge.bridge-nf-call-ip6tables、net.bridge.bridge-nf-call-iptables和net.ipv4.ip_forward这三个参数,其 它参数可按情况自行修改。
# 1. 添加配置文件
cat << EOF > /etc/sysctl.d/k8s-sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
user.max_user_namespaces=28633
vm.swappiness = 0
EOF
# 2. 配置生效
sysctl -p /etc/sysctl.d/k8s-sysctl.conf
- 启用ipvs。编写systemd配置文件,实现开机自动装载到内核。能安装ipvs的话就尽量使用ipvs,有助于提高集群的负载均衡性能。具体参见:https://kubernetes.io/zh-cn/blog/2018/07/09/ipvs-based-in-cluster-load-balancing-deep-dive/
# 1. 安装依赖
apt install -y ipset ipvsadm
# 2. 立即装载
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
# 3. 固化到配置文件
cat << EOF > /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
# 4. 检查是否已装载
lsmod |grep ip_vs
安装containerd
k8s在1.24版本之后不再直接支持docker作为容器运行时,所以本文使用使用containerd。二进制安装包可从GitHub - containerd下载,注意要下载cri-containerd-cni版本的
- 解压到根目录。压缩包里面的文件是按照根目录结构组织的,所以要直接解压到根目录。
tar xf cri-containerd-cni-1.7.22-linux-amd64.tar.gz -C /
- 创建配置文件目录并生成默认的配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
- 编辑配置文件
/etc/containerd/config.toml,修改以下内容
# 对于使用systemd作为init system的linux发行版,官方建议用systemd作为容器cgroup driver
# false改成true
SystemdCgroup = true
# pause镜像的地址改为自己在阿里云上传的镜像地址。如果是内网环境,可改为内网registry的地址
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/rainux/pause:3.9"
- 启动containerd
systemctl start containerd
systemctl enable containerd
- 执行命令测试下containerd是否正常。没报错一般就是正常的
crictl images
生成ca证书
后面的k8s和etcd集群都会用到ca证书。如果组织能提供统一的CA认证中心,则直接使用组织颁发的CA证书即可。如果没有统一的CA认证中心,则可以通过颁发自签名的CA证书来完成安全配置。这里自行生成一个ca证书。
# 生成私钥文件ca.key
openssl genrsa -out ca.key 2048
# 根据私钥文件生成根证书文件ca.crt
# /CN为master的主机名或IP地址
# days为证书的有效期
openssl req -x509 -new -nodes -key ca.key -subj "/CN=k8s-node1" -days 36500 -out ca.crt
# 拷贝ca证书到/etc/kubernetes/pki
mkdir -p /etc/kubernetes/pki
cp ca.crt ca.key /etc/kubernetes/pki/