kubeadm 安装单 master 节点 k8s 集群

293 阅读6分钟

1. 集群规划

操作系统IP地址部署内容
centos7.9192.168.110.216控制节点、docker、cri-dockerd
centos7.9192.168.110.217工作节点、docker、cri-dockerd
centos7.9192.168.110.218工作节点、docker、cri-dockerd

Kubernetes 版本为 v1.28.1,cri 使用 docker,cni 使用 calico 。

2. 基本环境配置

  1. 修改主机名
hostnamectl set-hostname prod-k8s-master
hostnamectl set-hostname prod-k8s-node1
hostnamectl set-hostname prod-k8s-node2
  1. 修改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
  1. 关闭防火墙和selinux
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
  1. 关闭swap分区
# 临时关闭 
swapoff -a

# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
  1. 开启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
  1. 修改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
  1. 配置ipvs功能
    在k8s中Service有两种代理模式,一种是基于iptables的,一种是基于ipvs,两者对比ipvs负载均衡算法更加的灵活,且带有健康检查的功能,如果想要使用ipvs模式,需要手动载入ipvs模块。

    ipsetipvsadm 是两个与网络管理和负载均衡相关的软件包,在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
  1. 设置时间同步
yum install ntp -y

systemctl start ntpd
systemctl enable ntpd

ntpq -p

date
  1. 环境检查
hostname;cat /etc/hosts;systemctl status firewalld;sestatus;cat /etc/fstab;cat /etc/sysctl.d/k8s.conf;date
  1. 重启服务器
reboot

3. 安装docker和cri-dockerd

  1. 安装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
  1. 安装 cri-dockerd
    通过 rpm 包进行安装,下载完成后,上传到需要安装的服务器上进行安装

下载地址:github.com/Mirantis/cr…

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
  1. 配置系统服务
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
  1. 配置镜像源
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节点初始化

  1. 配置初始化命令
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

  1. 初始化成功后,按照提示执行下边命令
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节点加入集群

  1. 使用初始化成功后打印出的命令,将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
  1. 执行成功后,在master 节点执行以下命令进行查看
kubectl get nodes

说明:当前状态为NotReady,需要为集群安装网络插件

7. 安装calico网络插件

  1. 下载calico文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml 
  1. 创建calico网络
kubectl apply -f calico.yaml
  1. 查看calico的Pod状态是否为Running
kubectl get pod -n kube-system
  1. 验证集群可用性
kubectl get nodes

说明:状态都为Ready,说明网络连接成功,集群部署完成