3台centos上部署k8s集群

版本兼容问题
基于CentOS 7.9的默认内核版本3.10,在不升级内核的前提下,推荐安装Kubernetes 1.23.x版本

CentOS 7.9默认内核版本为3.10.0-1160.el7.x86_64,这个版本对Kubernetes的兼容性存在以下限制:

  • Kubernetes 1.24+:要求内核≥4.19,主要用于支持eBPF、eXclusive ARP等新特性

  • Kubernetes 1.26+:建议内核≥5.10,优化io_uring性能

  • Kubernetes 1.27+:可能因依赖更新的内核特性(如eBPF)不再完全支持CentOS 7

 

安装注意事项

容器运行时选择

对于Kubernetes 1.23.x版本,推荐使用Docker作为容器运行时:

  • Docker版本:19.03+(推荐20.10.x)

  • 配置cgroup驱动为systemd

网络插件兼容性

  • Flannel:v0.14.0+版本与Kubernetes 1.23.x完全兼容

  • Calico:v3.20+版本支持Kubernetes 1.23.x

系统配置要求

确保满足以下基本配置:

  • 至少2核CPU,2GB内存

  • 禁用Swap分区

  • 关闭防火墙和SELinux

  • 配置内核参数(br_netfilter、ip_forward等

 

Kubernetes 1.24是一个重要的版本分水岭,它移除了对Docker作为默认容器运行时的内置支持,正式移除Dockershim,默认使用containerd

 

以下步骤部署k8s 1.24.17,仅供学习,不考虑版本兼容性

 

1. 环境准备(所有节点)

1.1配置主机名和host解# 在主节点上执sudo hostnamectl set-hostname k8s-master

# 在节点1上执行
sudo hostnamectl set-hostname k8s-node1
# 在节点2上执行
sudo hostnamectl set-hostname k8s-node2

# 编辑所有节点的 /etc/hosts 文件,添加如下内容(请替换为你的实际IP)
echo "192.168.1.10 k8s-master
192.168.1.11 k8s-node1
192.168.1.12 k8s-node2" | sudo tee -a /etc/hosts

# 时间同步
sudo yum install ntpdate -y
sudo ntpdate ntp.aliyun.com
sudo timtedatectl set-timezone Asia/Shanghai

date # 查看时间
timtedatectl #查时区

# 配置免密登录(可选,方便传文件)
ssh-keygen -t rsa
ssh-copy-id master
ssh-copy-id node1
ssh-copy-id node2

 

1.2 关swap、防火墙和selinux

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

swapoff -a
sed -i '/swap/ s/^/#/' /etc/fstab

 

1.3 配置内核模块与参数

# 1. 加载内核模块
sudo modprobe br_netfilter
sudo modprobe overlay

# 2. 确保模块开机自动加载 (否则重启后需再次加载模块)
echo 'br_netfilter' | sudo tee -a /etc/modules-load.d/k8s.conf
echo 'overlay' | sudo tee -a /etc/modules-load.d/k8s.conf

# 3. 创建并应用内核参数配置(先加载内核模块)
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

# 4. 重新加载系统配置
sudo sysctl --system

各参数作用:

  • net.bridge.bridge-nf-call-iptables = 1:让网桥网络流量经过iptables

  • net.bridge.bridge-nf-call-ip6tables = 1:让网桥网络流量经过ip6tables

  • net.ipv4.ip_forward = 1:启用IPv4数据包转发

 

为什么要配置这些参数?

  1. 网桥流量过滤:Kubernetes使用网桥网络,需要让网桥流量经过iptables规则

  2. 服务转发:Kubernetes的Service依赖iptables/ipvs进行负载均衡

  3. Pod网络:Pod之间的通信需要IP转发功能

 

1.4 安装依赖包

yum install -y socat conntrack ebtables ipset
# 先配置yum源
mkdir
/etc/yun.repos.d.bak mv /etc/yum.repos.d/* /etc/yum.repos.d.bak/ curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.rep yum clean all yum makecache yum update -y yum provides */netstat #已知缺少命令,查找安装包

 

 

2. 安装CRI(所有节点)

2.1 安装containerd

# 首先添加包含containerd的镜像源
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装containerd
yum install -y containerd.io

 

2.2 配置并启动containerd

# 生成默认配置文件
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

# 修改配
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"#g' /etc/containerd/config.toml
# 添加镜像加速
cat >> /etc/containerd/config.toml << EOF
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.mirrors.ustc.edu.cn"]
EOF
# 启动服务 systemctl daemon
-reload systemctl enable containerd systemctl start containerd # 验证 systemctl status containerd containerd --v ctr version
crictl info #验证镜像加速器配置,crictl命令需手动安装(步骤如下)

 

# 下载,需要十几分钟
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.30.0/crictl-v1.30.0-linux-amd64.tar.gz

# 解压
tar zxvf crictl-v1.30.0-linux-amd64.tar.gz -C /usr/local/bin

# 配置 crictl
# 需要配置 crictl以告知它如何与容器运行时(如 containerd 或 CRI-O)通信
# 创建配置文件 /etc/crictl.yaml,内容如下4行
cat > /etc/crictl.yaml << EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false 
EOF

#验证
crictl --v
crictl pods    # 列出pod或image,可能没有资源但不报错
crictl images

 

 

3. 安装k8s组件(所有节点)

3.1 配置kubernetes源

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
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

 

3.2 安装指定版本

# 禁止yum更新Kubernetes包,并安装指定版本
sudo yum install -y kubelet-1.24.17-0 kubeadm-1.24.17-0 kubectl-1.24.17-0 --disableexcludes=kubernetes
# 设置kubelet开机自启(暂不启动,需在kubeadm init后启动)
sudo systemctl enable --now kubelet

 

 

4. 初始化master节点(仅master节点)

4.1创建初始化配置文件

kubeadm config print init-defaults > kubeadm-init.yaml

 

4.2 修改配置文件 

# vim kubeadm-init.yaml ,修改以下4行
advertiseAddress: 192.168.56.106  # master节点IP
kubernetesVersion: v1.24.17
imageRepository: registry.aliyuncs.com/google_containers
name: master   # master节点名称
criSocket: unix:///var/run/containerd/containerd.sock # 1.24使用containerd
# criSocket: /var/run/dockershim.sock # 1.23使用Docker

 

4.3 初始化集群

kubeadm init --config=kubeadm-init.yaml --upload-certs --ignore-preflight-errors=NumCPU
# master默认CPU核数不小于2,生产环境不推荐使用--ignore参数
# --upload-certs 和--ignore 参数可不加

# 拷贝kubeadm init命令,用于加入work节点

 

4.4 配置kubectl

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

 

 

5. 安装网络插件(仅master节点)

5.1 选择calico

  5.1.1 下载calico v3.22(推荐用于k8s v1.23.6)

# 方法1:从官方归档下载
wget https://docs.projectcalico.org/archive/v3.22/manifests/calico.yaml

# 方法2:从 GitHub 下载(如果官方链接失败)
wget https://raw.githubusercontent.com/projectcalico/calico/v3.22.6/manifests/calico.yaml

# 方法3:使用国内镜像(如果上述都失败)
wget https://github.com/projectcalico/calico/releases/download/v3.22.6/calico.yaml

  5.1.2 验证下载的YAML文件

# 检查文件是否下载完整
ls -la calico.yaml

# 验证 YAML 语法
kubectl apply --dry-run=client -f calico.ya

  5.1.3 配置Pod CIDR (重要!)

# 检查当前集群的 Pod 网段
grep -i cluster-cidr /etc/kubernetes/manifests/kube-controller-manager.yaml

# 编辑 calico.yaml,确保 CIDR 匹配
# 查找并修改 CALICO_IPV4POOL_CIDR
    - name: CALICO_IPV4POOL_CIDR
      value: "192.168.0.0/16"

# flannel 使用 10.244.0.0/16
# calico   使用 192.168.0.0/16

  5.1.4 安装calico

# 应用 Calico 配置
kubectl apply -f calico.yaml

# 等待组件启动
sleep 30

  5.1.5 验证calico组件状态

# 检查 calico-node Pods
kubectl get pods -n kube-system -l k8s-app=calico-node -w

# 检查 calico-kube-controllers
kubectl get pods -n kube-system -l k8s-app=calico-kube-controllers

# 检查节点状态
kubectl get nodes
强烈建议先安装cni,再加入worker节点
否则calico-kube-controller的状态可能异常,如下图
calico-err-1

calico-err-2

 

 

关键配置修改(非常重要)

在应用配置文件之前,务必根据你的集群环境修改calico.yaml中的以下参数,这是安装成功的关键

  • 设置Pod网段(CIDR):确保CALICO_IPV4POOL_CIDR的值与你集群的Pod网段一致。对于kubeadm部署的集群,默认网段通常是10.244.0.0/16。你可以在/etc/kubernetes/manifests/kube-controller-manager.yaml中查看--cluster-cidr参数来确认

  • 指定IP检测方法:配置IP_AUTODETECTION_METHOD,让Calico能够正确识别节点的IP地址。根据你的节点网络接口名称进行设置,例如interface=eth.*interface=ens.*

 

5.2 选择flannel

# 安装flannel
# 下载原始配置文件(有时下载失败,需要多试几次)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 替换镜像地址 sed -i 's#10.244.0.0/16#192.168.0.0/16#g' kube-flannel.yml # 需与grep -i cluster-cidr /etc/kubernetes/manifests/kube-controller-manager.yaml中的网段一致 # 安装 flannel kubectl apply -f kube-flannel.yml #拉取镜像flannel:v0.27.4较慢,可能需要30min # 验证 kubectl get node kubectl get pod -n kube-flannel  

 

 

6. 添加worker节点(仅worker节点)

6.1 获取加入命令

# master节点上执行
kubeadm token create --print-join-command

image

 6.2 worker上执行加入命令

kubeadm join 192.168.56.106:6443 --token 04yamd.akcyubp6ft9fxl6l --discovery-token-ca-cert-hash sha256:c2d6c887f397fae77c170ae1ef1fccddceff8116247cf494bb81c836beb51a5d

image

 

7. 验证集群状态

7.1 查看Node状态

image

7.2 查看pod状态

image

7.3 测试集群

至此,k8s单master集群已经安装完成,接下来通过部署一个nginx服务测试下集群是否可用

kubectl create deployment nginx --image=nginx
# 等待一段时间查看pod状态
kubectl get pod -o wide

image

pod状态为Running表示nginx已经部署完成。想要访问nginx服务还需要暴露外部访问端口

kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
# 输出
service/nginx exposed

# 查看暴露的端口
kubectl get svc

image

 

svc是k8s里面的一种服务,用于pod访问。port是svc的端口,target-port是容器的端口

image

 

posted on 2025-11-26 16:44  Karlkiller  阅读(0)  评论(0)    收藏  举报

导航