使用 kubeadm 1.24.3
搭建 k8s
集群
# 环境准备
Centos8
三台.
1 | k8s-master-01 192.168.0.10 |
注意,这三台机器不要做任何配置,尤其不要安装 docker
, 因为从 k8s
1.20.x
开始, kubernetes
弃用了 dockershim
, 在 1.20.4
正式移除了 dockershim
.
Docker support in the kubelet is now deprecated and will be removed in a future release. The kubelet uses a module called “dockershim” which implements CRI support for Docker and it has seen maintenance issues in the Kubernetes community.
原文地址: kubernetes 1.20 变更日志
但是 kubernetes
是支持符合为 Kubernetes
创建的容器运行接口 Container Runtime Interface (CRI)
的运行时。 Docker
构建的镜像,将在你的集群的所有运行时中继续工作,一如既往。
# 设置系统主机名以及 host 文件的相互解析
1 | hostnamectl set-hostname k8s-master-01 |
# 安装依赖包
1 | yum install -y conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git |
# 关闭防火墙
1 | systemctl stop firewalld && systemctl disable firewalld |
# 关闭 SELinux
1 | swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab |
# 调整内核参数
1 | cat > kubernetes.conf <<EOF |
# 调整系统时区
1 | # 设置系统时区为 中国/上海 |
# 关闭系统不需要服务
1 | systemctl stop postfix && systemctl disable postfix |
# 设置 rsyslogd 和 systemd journald
1 | mkdir /var/log/journal # 持久化保存日志的目录 |
# 安装 containerd
# 创建 /etc/modules-load.d/containerd.conf
配置文件:
1 | cat << EOF > /etc/modules-load.d/containerd.conf |
执行下面的命令,使其生效
1 | modprobe overlay |
创建 /etc/sysctl.d/99-kubernetes-cri.conf
配置文件:
1 | cat << EOF > /etc/sysctl.d/99-kubernetes-cri.conf |
执行以下命令使配置生效:
1 | sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf |
# 关闭 swap
Kubernetes 1.8 开始要求关闭系统的 Swap,如果不关闭,默认配置下 kubelet 将无法启动。 关闭系统的 Swap 方法如下:
1 | swapoff -a |
修改 /etc/fstab
文件,注释掉 SWAP
的自动挂载,使用 free -m
确认 swap
已经关闭。
swappiness
参数调整,修改 /etc/sysctl.d/99-kubernetes-cri.conf
添加下面一行:
1 | vm.swappiness=0 |
执行 sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
使修改生效。
# 安装 containerd
在各个服务器节点上安装容器运行时 Containerd
。
下载 Containerd
的二进制包:
1 | wget https://github.com/containerd/containerd/releases/download/v1.6.4/cri-containerd-cni-1.6.4-linux-amd64.tar.gz |
生成 containerd
的配置文件
1 | mkdir -p /etc/containerd |
修改前面生成的配置文件 /etc/containerd/config.toml
1 | [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] |
再修改 /etc/containerd/config.toml 中的
1 | [plugins."io.containerd.grpc.v1.cri"] |
配置 containerd
开机启动,并启动 containerd
1 | systemctl enable containerd --now |
使用 crictl
测试一下,确保可以打印出版本信息并且没有错误信息输出:
1 | crictl version |
如下输出:
1 | Version: 0.1.0 |
# 配置服务器支持开启 ipvs
执行下面的脚本
1 | cat > /etc/sysconfig/modules/ipvs.modules <<EOF |
上面脚本创建了的 /etc/sysconfig/modules/ipvs.modules
文件,保证在节点重启后能自动加载所需模块。 使用 lsmod | grep -e ip_vs -e nf_conntrack
命令查看是否已经正确加载所需的内核模块。
接下来,就可以使用 kubeadm
部署 k8s
集群了。
# 安装 k8s 集群
安装 k8s
集群有很多种方式,这里使用 kubeadm
安装
# 安装 kubeadm
1 | cat <<EOF > /etc/yum.repos.d/kubernetes.repo |
# 配置 kubeadm
配置文件
配置 kubeadm
的配置文件. touch kubeadm-config.yaml
1 | apiVersion: kubeadm.k8s.io/v1beta3 |
这里定制了 imageRepository
为阿里云的 registry
,避免因 gcr 被墙,无法直接拉取镜像。 criSocket
设置了容器运行时为 containerd
。 同时设置 kubelet
的 cgroupDriver
为 systemd
,设置 kube-proxy
代理模式为 ipvs
。
可以通过 kubeadm config print init-defaults --component-configs KubeletConfiguration
可以打印集群初始化默认的使用的配置.
在开始初始化集群之前可以使用 kubeadm config images pull --config kubeadm-config.yaml
预先在各个服务器节点上拉取所 k8s
需要的容器镜像。
# 初始化 k8s
master
节点
在 master
节点上执行 kubeadm init --config kubeadm-config.yaml
,
看到最后有打印: Your Kubernetes control-plane has initialized successfully!
就说明执行成功了。
然后还有提示:
1 | To start using your cluster, you need to run the following as a regular user: |
所以,我们按照提示执行。
1 | mkdir -p $HOME/.kube |
然后再 两台 node
节点上执行 如下命令来加入到集群中。
1 | kubeadm join 192.168.0.10:6443 --token e0nvot.l8sgzcgl07d5baq6 \ |
查看一下集群状态,确认个组件都处于 healthy
状态,是否有错误:
1 | kubectl get cs |
集群初始化如果遇到问题,可以使用 kubeadm reset 命令进行清理.
这样 k8s
集群就部署完成了。
# 最后
希望和你一起遇见更好的自己