1. 集群规划
| 操作系统 | IP地址 | 部署内容 |
|---|---|---|
| centos7.9 | 192.168.110.216 | 控制节点、docker、cri-dockerd |
| centos7.9 | 192.168.110.217 | 工作节点、docker、cri-dockerd |
| centos7.9 | 192.168.110.218 | 工作节点、docker、cri-dockerd |
Kubernetes 版本为 v1.28.1,cri 使用 docker,cni 使用 calico 。
2. 基本环境配置
- 修改主机名
hostnamectl set-hostname prod-k8s-master
hostnamectl set-hostname prod-k8s-node1
hostnamectl set-hostname prod-k8s-node2
- 修改hosts文件
cat >> /etc/hosts << EOF
192.168.110.216 prod-k8s-master
192.168.110.217 prod-k8s-node1
192.168.110.218 prod-k8s-node2
EOF
- 关闭防火墙和selinux
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
- 关闭swap分区
# 临时关闭
swapoff -a
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
- 开启bridge网桥过滤功能
bridge(桥接) 是 Linux 系统中的一种虚拟网络设备,它充当一个虚拟的交换机,为集群内的容器提供网络通信功能,容器就可以通过这个 bridge 与其他容器或外部网络通信了。
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 参数解释
net.bridge.bridge-nf-call-ip6tables = 1 //对网桥上的IPv6数据包通过iptables处理
net.bridge.bridge-nf-call-iptables = 1 //对网桥上的IPv4数据包通过iptables处理
net.ipv4.ip_forward = 1 //开启IPv4路由转发,来实现集群中的容器与外部网络的通信
# 由于开启bridge功能,需要加载br_netfilter模块来允许在bridge设备上的数据包经过iptables防火墙处理
modprobe br_netfilter && lsmod | grep br_netfilter
# ...会输出以下内容
br_netfilter 22256 0
bridge 151336 1 br_netfilter
# 参数解释:
modprobe //命令可以加载内核模块
br_netfilter //模块模块允许在bridge设备上的数据包经过iptables防火墙处理
# 加载配置文件,使上述配置生效
sysctl -p /etc/sysctl.d/k8s.conf
- 修改yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
-
配置ipvs功能
在k8s中Service有两种代理模式,一种是基于iptables的,一种是基于ipvs,两者对比ipvs负载均衡算法更加的灵活,且带有健康检查的功能,如果想要使用ipvs模式,需要手动载入ipvs模块。ipset和ipvsadm是两个与网络管理和负载均衡相关的软件包,在k8s代理模式中,提供多种负载均衡算法,如轮询(Round Robin)、最小连接(Least Connection)和加权最小连接(Weighted Least Connection)等;
# 安装服务
yum install ipset ipvsadm -y
# 将需要加载的ipvs相关模块写入到文件中
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 模块介绍
ip_vs //提供负载均衡的模块,支持多种负载均衡算法,如轮询、最小连接、加权最小连接等
ip_vs_rr //轮询算法的模块(默认算法)
ip_vs_wrr //加权轮询算法的模块,根据后端服务器的权重值转发请求
ip_vs_sh //哈希算法的模块,同一客户端的请求始终被分发到相同的后端服务器,保证会话一致性
nf_conntrack //链接跟踪的模块,用于跟踪一个连接的状态,例如 TCP 握手、数据传输和连接关闭等
# 执行文件来加载模块
chmod 755 /etc/sysconfig/modules/ipvs.modules
/etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack
- 设置时间同步
yum install ntp -y
systemctl start ntpd
systemctl enable ntpd
ntpq -p
date
- 环境检查
hostname;cat /etc/hosts;systemctl status firewalld;sestatus;cat /etc/fstab;cat /etc/sysctl.d/k8s.conf;date
- 重启服务器
reboot
3. 安装docker和cri-dockerd
- 安装docker
yum install -y yum-utils
# 使用阿里云的yum源
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce.x86_64 --showduplicates | sort -r
yum install -y docker-ce-24.0.5
systemctl start docker
systemctl enable docker
- 安装 cri-dockerd
通过 rpm 包进行安装,下载完成后,上传到需要安装的服务器上进行安装
mkdir -p /home/software
cd /home/software
rpm -ivh cri-dockerd-0.3.7.20231027185657.170103f2-0.el7.x86_64.rpm
systemctl start cri-docker
systemctl enable cri-docker
- 配置系统服务
vi /usr/lib/systemd/system/cri-docker.service
# 修改如下
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
# 重启cri-dockerd服务
systemctl daemon-reload && systemctl restart cri-docker
- 配置镜像源
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": ["192.168.110.189", "0.0.0.0"],
"registry-mirrors": ["https://unlfdsm2.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
# 参数解释
exec-opts //启用cgroup控制组,用于限制进程的资源使用量,如CPU、内存
insecure-registries //登录私服配置,允许本地开启http访问
registry-mirrors //使用阿里云的镜像地址
log-driver、log-opts //日志策略
#重启docker服务
systemctl daemon-reload && systemctl restart docker
4. 安装kubeadm、kubelet、kubectl
# 配置镜像源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 查看可以安装的集群版本
yum list kubelet --showduplicates | sort -r
# 安装指定版本的服务
yum install -y kubelet-1.28.1 kubeadm-1.28.1 kubectl-1.28.1
# 启用Cgroup控制组,用于限制进程的资源使用量,如CPU、内存等
cat > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
# 设置kubelet为开机自启动即可,集群初始化后自动启动
systemctl enable kubelet
5. 集群master节点初始化
- 配置初始化命令
kubeadm init \
--apiserver-advertise-address=192.168.110.216 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.1 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket /var/run/cri-dockerd.sock
# 参数解释
--apiserver-advertise-address=192.168.110.216 //指定 API 服务器将向集群中的其他成员通告的 IP 地址。
--image-repository registry.aliyuncs.com/google_containers //使用指定的镜像仓库,这里使用的是阿里云上托管的官方 Google 容器镜像。
--kubernetes-version v1.28.1 //设置要安装的 Kubernetes 版本。
--service-cidr=10.96.0.0/12 //定义 Kubernetes 服务的 IP 范围。
--pod-network-cidr=10.244.0.0/16 //定义 Pod 网络的 IP 范围。
--cri-socket /var/run/cri-dockerd.sock //指定 CRI(容器运行时接口)的套接字文件位置,这里使用的是 `cri-dockerd`。
提示:如果哪个节点出现问题,可以使用下列命令重置当前节点
kubeadm reset
- 初始化成功后,按照提示执行下边命令
export KUBECONFIG=/etc/kubernetes/admin.conf
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
6. 集群node节点加入集群
- 使用初始化成功后打印出的命令,将node节点加入集群
kubeadm join 192.168.110.216:6443 --cri-socket /var/run/cri-dockerd.sock --token 9kgyyh.c3iex0zppq5aaf1x --discovery-token-ca-cert-hash sha256:1cdddbbc8407894ab17c65734da3c7ee154afc3be2066cd11f94e8cd49623a2d
# 注意加入 --cri-soket
--cri-socket /var/run/cri-dockerd.sock
- 执行成功后,在master 节点执行以下命令进行查看
kubectl get nodes
说明:当前状态为
NotReady,需要为集群安装网络插件
7. 安装calico网络插件
- 下载calico文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml
- 创建calico网络
kubectl apply -f calico.yaml
- 查看calico的Pod状态是否为Running
kubectl get pod -n kube-system
- 验证集群可用性
kubectl get nodes
说明:状态都为Ready,说明网络连接成功,集群部署完成