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数据包转发
为什么要配置这些参数?
网桥流量过滤:Kubernetes使用网桥网络,需要让网桥流量经过iptables规则
服务转发:Kubernetes的Service依赖iptables/ipvs进行负载均衡
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.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

6.2 worker上执行加入命令
kubeadm join 192.168.56.106:6443 --token 04yamd.akcyubp6ft9fxl6l --discovery-token-ca-cert-hash sha256:c2d6c887f397fae77c170ae1ef1fccddceff8116247cf494bb81c836beb51a5d

7. 验证集群状态
7.1 查看Node状态

7.2 查看pod状态

7.3 测试集群
至此,k8s单master集群已经安装完成,接下来通过部署一个nginx服务测试下集群是否可用
kubectl create deployment nginx --image=nginx
# 等待一段时间查看pod状态
kubectl get pod -o wide

pod状态为Running表示nginx已经部署完成。想要访问nginx服务还需要暴露外部访问端口
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort # 输出 service/nginx exposed # 查看暴露的端口 kubectl get svc

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

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

浙公网安备 33010602011771号