kubernetes集群搭建


环境介绍

本次搭建的集群使用window11专业版自带的hyper-v管理工具构建6台虚拟机,容器运行时采用containerd,采用1台lb,3台master节点,2台worker节点,其他软件环境信息如下:

k8s: 1.28.3
containerd :1.6
虚拟机:centos 7.9 mini

整体架构与 IP 规划:

主机名 角色 IP 地址 需要装的软件 说明
k8s-master01 master 192.168.1.101 kubeadm、kubelet、kubectl、containerd 控制平面 + etcd
k8s-master02 master 192.168.1.102 kubeadm、kubelet、kubectl、containerd 控制平面 + etcd
k8s-master03 master 192.168.1.103 kubeadm、kubelet、kubectl、containerd 控制平面 + etcd
k8s-worker01 worker 192.168.1.104 kubeadm、kubelet、containerd 工作节点
k8s-worker02 worker 192.168.1.105 kubeadm、kubelet、containerd 工作节点
k8s-lb load balancer 192.168.1.100 keepalived + haproxy api入口

准备工作

设置静态ip(所有机器)

CentOS 7 使用 /etc/sysconfig/network-scripts/ifcfg-<网卡名> 文件配置网络

# 编辑配置文件(假设网卡是 eth0)
vi /etc/sysconfig/network-scripts/ifcfg-eth0

将内容修改为如下

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static          # ← 改为 static(原来是 dhcp)
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0                 # ← 网卡名
UUID=...                  # ← 保留原有 UUID(不要改)
DEVICE=eth0               # ← 网卡名
ONBOOT=yes                # ← 开机自动启用

# === 静态 IP 配置(按你的网络改)===
IPADDR=192.168.1.101      # ← 本机 IP(master01 示例)
NETMASK=255.255.255.0     # 或写 PREFIX=24
GATEWAY=192.168.1.1       # ← 你的网关(Hyper-V 虚拟交换机的网关)
DNS1=8.8.8.8              # ← DNS(可选)
DNS2=114.114.114.114

重启网卡

systemctl enable network
systemctl restart network

yum包管理器配置(所有节点)

备份原有 repo 文件

mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ 2>/dev/null

使用阿里云 CentOS 7 官方源

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

(可选)启用 EPEL 源
# 先安装 epel-release 包(使用阿里云镜像)
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

# 然后替换为阿里云 EPEL 源
sed -i 's|^#baseurl=|baseurl=|g' /etc/yum.repos.d/epel*.repo
sed -i 's|^metalink|#metalink|g' /etc/yum.repos.d/epel*.repo
sed -i 's|//download\.fedoraproject\.org|//mirrors.aliyun.com|g' /etc/yum.repos.d/epel*.repo

配置 Kubernetes 官方源(使用阿里云镜像

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=1
repo_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

设置主机名(分别在每台机器上执行)

# master01
hostnamectl set-hostname k8s-master01

# master02
hostnamectl set-hostname k8s-master02

# master03
hostnamectl set-hostname k8s-master03

# worker01
hostnamectl set-hostname k8s-worker01

# worker02
hostnamectl set-hostname k8s-worker02

# lb
hostnamectl set-hostname k8s-lb

配置 hosts(所有节点)

cat >> /etc/hosts <<EOF
192.168.1.101 k8s-master01
192.168.1.102 k8s-master02
192.168.1.103 k8s-master03
192.168.1.104 k8s-worker01
192.168.1.105 k8s-worker02
192.168.1.100 k8s-lb
EOF

关闭防火墙 & SELinux(所有节点执行)

systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

关闭 swap & 加载内核模块 & 调优

#关闭交换分区
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

#内核模块
cat > /etc/modules-load.d/k8s.conf <<EOF
br_netfilter
EOF

modprobe br_netfilter

cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl --system

搭建集群

安装容器运行时 containerd (所有master和worker节点)

安装 containerd

# 1. 安装 containerd,指定版本
# 查看可用版本(CentOS)
yum list containerd.io --showduplicates | grep -E '1\.6|1\.7|1\.8'

yum install -y containerd.io-1.6.5
#yum install -y containerd.io

# 2. 生成默认配置
containerd config default > /etc/containerd/config.toml

# 3. 启用 systemd cgroup 驱动(必须与 kubelet 一致!)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 4. 启动
systemctl enable --now containerd

# 5. 安装 crictl(CRI 调试工具)
VERSION="v1.28.0"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
rm -f crictl-$VERSION-linux-amd64.tar.gz

编辑容器运行时的配置文件,配置镜像加速器(国外镜像无法访问)

#编辑/etc/containerd/config.toml  添加docker和k8s镜像加速
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://docker.1ms.run", "https://hub.rat.dev", "https://dockerproxy.net"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
          endpoint = ["https://k8s.m.daocloud.io"]

#修改指定pause版本,k8s 1.28需要pause:3.9
 [plugins."io.containerd.grpc.v1.cri"]
   sandbox_image = "registry.k8s.io/pause:3.9"

重启containerd

systemctl restart containerd

安装k8s工具(所有master和worker节点)

#worker节点只需装kubelet kubeadm
yum install -y kubelet-1.28.3 kubeadm-1.28.3 kubectl-1.28.3
systemctl enable --now kubelet

安装 load balancer 机器(lb节点)

# 安装 EPEL 源
yum install -y epel-release

# 安装 keepalived 和 haproxy
yum install -y keepalived haproxy

# 允许绑定非本地 IP(必须!)
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
sysctl -p

配置负载均衡,即HAProxy(如果lb考虑集群,多台机器配置相同)

cat > /etc/haproxy/haproxy.cfg <<EOF
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                    tcp
    log                     global
    option                  tcplog
    option                  dontlognull
    timeout connect         10s
    timeout client          300s
    timeout server          300s
    timeout check           5s
    maxconn                 3000

# Kubernetes API Server 前端
frontend k8s-api-frontend
    bind *:6443
    mode tcp
    option tcplog
    default_backend k8s-api-backend

# 后端 Kubernetes Master 节点
backend k8s-api-backend
    mode tcp
    balance roundrobin
    server master1 192.168.1.101:6443 check
    server master2 192.168.1.102:6443 check
    server master3 192.168.1.103:6443 check

# 可选:HAProxy 监控页面(HTTP)
listen stats
    bind *:8888
    mode http
    stats enable
    stats uri /stats
    stats auth admin:123456  # 用户名:密码
    stats refresh 5s
EOF

配置虚拟ip,即Keepalived(如果lb考虑集群,主备配置不同)

cat > /etc/keepalived/keepalived.conf <<EOF
global_defs {
    router_id LVS_DEVEL
}

vrrp_script chk_haproxy {
    script "killall -0 haproxy"   # 检查 haproxy 是否运行
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0                # ← 替换为你的网卡名(如 ens33)
    virtual_router_id 51
    priority 100                  # 主节点优先级更高
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100/24          # ← 这是你的 VIP
    }
    track_script {
        chk_haproxy
    }
}
EOF

配置完启动

systemctl enable --now haproxy

初始化集群

任意master节点执行

kubeadm init   --control-plane-endpoint "192.168.1.100:6443"   --upload-certs   --pod-network-cidr=10.244.0.0/16   --kubernetes-version=v1.28.2   --v=5

等待一段时间,初始化完毕后面会有提示,提示安装 CNI 网络插件,以及其他master节点加入集群的join命令,和worker节点加入集群的join命令

    # 安装 Flannel 网络插件(只需要在主节点,后续加入的节点自动部署 CNI 所需的组件)
    kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

其他master节点加入集群

  kubeadm join 192.168.1.100:6443 --token q9b0qo.ygjjzx5jutamvq61 \
        --discovery-token-ca-cert-hash sha256:863747ea6190254f09715103d25bcce5da3161e022fa6d033f9185a3be0b079b \
        --control-plane --certificate-key 63f890b556d78a9d31f11bf662d5f2f50e2f9e6a5920c344f0bac575dabc7e1c

其他worker节点加入集群

kubeadm join 192.168.1.100:6443 --token q9b0qo.ygjjzx5jutamvq61 \
        --discovery-token-ca-cert-hash sha256:863747ea6190254f09715103d25bcce5da3161e022fa6d033f9185a3be0b079b

验证

kubectl get nodes

所有节点状态为ready表示安装完毕!


文章作者: Needle
转载声明:本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Needle !
赏
  目录
  评论