一. 环境说明
名称 | IP | 系统 | 配置 |
---|---|---|---|
主控节点 | 192.168.136.11 | Rocky9.2 | 2核4G |
工作节点1 | 192.168.136.12 | Rocky9.2 | 2核4G |
工作节点2 | 192.168.136.13 | Rocky9.2 | 2核4G |
二. 系统先决条件配置(所有节点)
2.1 关闭防火墙
防火墙可能会导致重复的防火墙规则和破坏kube-proxy,并且Kubernetes 必须启用以下这些必要的端口后才能使 Kubernetes 的各组件相互通信,索性这里直接关闭了。
# 停止防火墙
systemctl stop firewalld
# 禁用防火墙开机自启
systemctl disable firewalld
2.2 关闭SELinux
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,在进程层面管控文件系统资源的访问的一种安全机制,进程只能访问那些在他的任务中所需要文件。
那为什么要关闭这个很好的功能呢?
SELinux安全机制较复杂,可能会与k8s本身的流量机制冲突,因为k8s本身会在netfilter里设置流量规则.
而且有些时候容器需要访问宿主机器去实现一些功能,比如pod 的网络需要方位宿主文件进行实现。
# 临时关闭SELinux
setenforce 0
# 修改/etc/selinux/config配置文件,将SELINUX设置为disabled
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
2.3 关闭Swap分区
Swap是一种特殊的分区或文件,可以用作内存扩展,当系统内存不足时,将一部分数据从物理内存中移动到Swap分区中,以释放出更多的内存空间。当需要访问被换出的数据时,系统会将其重新从Swap分区加载到物理内存。
那为什么要关闭这个功能呢?
1.在计算集群中,我们通常希望OOM的时候直接杀掉进程,向运维或者作业提交者报错提示,并且执行故障转移,把进程在其他节点上重启起来。而不是用swap续命,导致节点hang住,集群性能大幅下降,并且还得不到报错提示。
2.Swap会导致docker的运行不正常,性能下降,是个bug,但是后来关闭swap就解决了,就变成了通用方案。
3. Kubernetes 云原生的实现目的是将运行实例紧密包装到尽可能接近 100% 。所有的部署、运行环境应该与 CPU 以及内存限定在一个可控的空间内。所以如果调度程序发送一个 Pod 到某一台节点机器,它不应该使用 Swap。如果使用Swap,则其实node的pod使用内存总和可能超过了node的内存,这样其实就达不到资源的严格限制和管理的目的。
#临时关闭swap分区,当前会话生效
swapoff -a
# 永久关闭swap分区,修改/etc/fstab文件,注释掉有swap的这一行
sed -ri 's/.*swap.*/#&/' /etc/fstab
2.4 设置主机名
三台机器分别执行
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-work1
hostnamectl set-hostname k8s-work2
2.5 配置hosts文件
cat >> /etc/hosts << EOF
192.168.136.11 k8s-master
192.168.136.12 k8s-work1
192.168.136.13 k8s-work2
EOF
2.6 确保每个节点MAC地址和 product_uuid 的唯一性
你可以使用命令 ip link
或 ifconfig -a
来获取网络接口的 MAC 地址
可以使用 sudo cat /sys/class/dmi/id/product_uuid
命令对 product_uuid 校验
一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。
2.7 转发 IPv4 并让 iptables 看到桥接流量
对于插件开发人员以及时常会构建并部署 Kubernetes 的用户而言, 插件可能也需要特定的配置来支持 kube-proxy。 iptables 代理依赖于 iptables,插件可能需要确保 iptables 能够监控容器的网络通信。 例如,如果插件将容器连接到 Linux 网桥,插件必须将 net/bridge/bridge-nf-call-iptables sysctl
参数设置为 1,以确保 iptables 代理正常工作。 如果插件不使用 Linux 网桥,而是使用类似于 Open vSwitch 或者其它一些机制, 它应该确保为代理对容器通信执行正确的路由。
默认情况下,如果未指定 kubelet 网络插件,则使用 noop 插件, 该插件设置 net/bridge/bridge-nf-call-iptables=1
,以确保简单的配置 (如带网桥的 Docker)与 iptables 代理正常工作。
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
通过运行以下指令确认 br_netfilter 和 overlay 模块被加载
lsmod | grep br_netfilter
lsmod | grep overlay
通过运行以下指令确认 net.bridge.bridge-nf-call-iptables
、net.bridge.bridge-nf-call-ip6tables
和 net.ipv4.ip_forward
系统变量在你的 sysctl 配置中被设置为 1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
2.8 同步时间
如果各机器上时间都没有问题,也没有偏差,则可以跳过该步骤。
# 安装ntp工具
yum install -y ntp
#设置时区
timedatectl set-timezone 'Asia/Shanghai'
# 同步时间
ntpdate ntp1.aliyun.com
三. 安装Docker(所有节点)
3.1 安装yum-utils包,并设置docker存储库
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3.2 安装最新版本的Docker Engine和 containerd
sudo yum install docker-ce docker-ce-cli containerd.io
3.3 启动Docker
sudo systemctl start docker
四. 安装cri-dockerd(所有节点)
Kubernetes 的早期版本仅适用于特定的容器运行时:Docker Engine。 后来,Kubernetes 增加了对使用其他容器运行时的支持。为了实现编排器和许多不同的容器运行时之间交互操作创建了CRI
标准。 Docker Engine 没有实现(CRI)接口,所以Kubernetes 项目创建了特殊代码dockershim来帮助过渡,Dockershim
代码一直是一个临时解决方案(因此得名:shim)。 Kubernetes自v1.24移除了对Dockershim
的支持,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合。为此,Mirantis和Docker联合创建了cri-dockerd
项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker 。
https://github.com/Mirantis/cri-dockerd/releases
#下载对应版本的cri-dockerd rpm包,注意版本和linux版本,也可以自行下载上传至所有主机
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.2/cri-dockerd-0.3.2-3.el8.x86_64.rpm
#安装
rpm -ivh cri-dockerd-0.3.2-3.el8.x86_64.rpm
#重新加载systemctl
systemctl daemon-reload
#启动cri-docker
systemctl start cri-docker.service
#设置cri-docker开机自启
systemctl enable cri-docker.service
Rokcy系统可能出现libcgroup依赖的问题,解决办法如下
wget https://mirror.tuna.tsinghua.edu.cn/centos/7/os/x86_64/Packages/libcgroup-0.41-21.el7.x86_64.rpm
rpm -ivh libcgroup-0.41-21.el7.x86_64.rpm
五. 安装Kubeadm Kubectl Kubelet (所有节点)
Kubeadm 是一个快捷搭建kubernetes(k8s)的安装工具,它提供了kubeadm init
以及 kubeadm join
这两个命令来快速创建kubernetes集群。kubeadm 通过执行必要的操作来启动和运行最小可用集群。 按照设计,它只关注启动引导,而非配置机器。
Kubectl 是 Kubernetes 命令行工具 , 让你可以对 Kubernetes 集群运行命令。 你可以使用 kubectl 来部署应用、监测和管理集群资源以及查看日志。
Kubelet 是 kubernetes 工作节点上的一个代理组件,运行在每个节点上。
设置yum源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装 kubeadm、kubelet、kubectl
sudo yum install -y kubelet kubeadm kubectl
kubeadm将使用kubelet服务以容器方式部署kubernetes的主要服务 所以先启动kubelet服务
systemctl start kubelet
systemctl enable kubelet