centos搭建k8s 1.28集群
CentOS 搭建 K8s 1.28 集群:从零入门到可运行
在云计算和微服务时代,Kubernetes(K8s)已成为容器编排的工业标准。本文将以 CentOS 7 系统为基础,详细阐述如何搭建一个基于 K8s 1.28 版本的多节点集群。我们将深入剖析关键组件原理,并提供可运行的代码示例,帮助读者从零开始构建一个稳定、可扩展的 K8s 环境。—## 环境准备与核心原理在开始搭建前,先了解 K8s 集群的核心架构。K8s 采用主从节点模式,**控制平面(Master)**负责集群管理(API Server、调度器、控制器管理器),**工作节点(Worker)**运行容器化应用。1.28 版本引入了更稳定的 CRI(容器运行时接口)集成,推荐使用 containerd 作为容器运行时。### 系统要求- 操作系统:CentOS 7.9+(内核 3.10.0-1160.el7.x86_64 以上)- 硬件:至少 2 台虚拟机(1 Master + 1 Worker),每台 2 核 CPU、4GB 内存、20GB 磁盘- 网络:节点间互通,关闭防火墙或开放必要端口### 关键原理:kubeadm 初始化流程kubeadm 是官方推荐的集群初始化工具。其核心流程如下:1. 检查系统环境(内核模块、swap 关闭、端口可用性)2. 拉取控制平面组件镜像(如 kube-apiserver、kube-controller-manager)3. 生成证书和 kubeconfig 文件4. 启动静态 Pod 形式的控制平面组件5. 生成加入令牌以供工作节点加入—## 基础环境配置(所有节点)所有节点(Master 和 Worker)需执行相同的基础配置。以下代码块展示了关键步骤。### 代码示例 1:关闭 swap 并配置内核参数bash#!/bin/bash# 文件名:setup_base.sh# 功能:关闭 swap、加载内核模块、设置 sysctl 参数# 1. 临时关闭 swap(立即生效)swapoff -a# 永久关闭 swap(重启后生效):注释 /etc/fstab 中的 swap 行sed -i '/swap/s/^/#/' /etc/fstab# 2. 加载必要的内核模块cat <<EOF | tee /etc/modules-load.d/k8s.confoverlaybr_netfilterEOFmodprobe overlaymodprobe br_netfilter# 3. 设置 sysctl 参数(使 iptables 能正确桥接流量)cat <<EOF | tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward = 1EOFsysctl --system# 4. 验证内核模块已加载lsmod | grep -E "overlay|br_netfilter"原理说明: - swapoff:K8s 调度器依赖节点内存状态,swap 会导致调度决策不准确,因此必须关闭。 - br_netfilter:允许 iptables 处理桥接流量,这是 K8s 网络插件(如 Calico)正常运行的前提。 - net.ipv4.ip_forward:启用 IP 转发,使 Pod 之间的流量能跨节点路由。### 代码示例 2:安装 containerd 和 kubeletbash#!/bin/bash# 文件名:install_components.sh# 功能:安装 containerd 容器运行时、kubeadm、kubelet、kubectl# 1. 安装 containerdyum install -y yum-utilsyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyum install -y containerd.io# 生成默认配置并启用 systemd cgroup 驱动containerd config default > /etc/containerd/config.tomlsed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.tomlsystemctl restart containerdsystemctl enable containerd# 2. 添加 K8s 官方仓库并安装cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/enabled=1gpgcheck=1gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.keyEOFyum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2 --disableexcludes=kubernetessystemctl enable kubelet# 3. 验证安装kubeadm versioncontainerd --version原理说明: - containerd 与 systemd cgroup:K8s 1.24+ 默认使用 containerd 作为 CRI。配置 SystemdCgroup = true 使容器与宿主机使用同一 cgroup 驱动,避免资源统计不一致。 - kubelet 延迟启动:kubelet 需要等待集群初始化完成后才能正常运行,因此只启用而不立即启动。—## 初始化 Master 节点在 Master 节点上执行 kubeadm init,此命令会启动控制平面组件并生成加入令牌。### 代码示例 3:kubeadm 初始化集群bash#!/bin/bash# 文件名:init_master.sh# 功能:初始化 K8s 1.28 控制平面,并配置 kubectl# 1. 拉取所需镜像(可选,加速初始化)kubeadm config images pull --kubernetes-version=v1.28.2# 2. 初始化集群(指定 Pod 网络 CIDR 和 API Server 地址)# 注意:将 --apiserver-advertise-address 替换为 Master 节点实际 IPkubeadm init \ --apiserver-advertise-address=192.168.1.10 \ --pod-network-cidr=10.244.0.0/16 \ --kubernetes-version=v1.28.2# 3. 配置 kubectl(普通用户执行)mkdir -p $HOME/.kubecp /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config# 4. 安装网络插件(使用 Flannel 作为示例)kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml# 5. 查看节点状态(等待 Ready)kubectl get nodes原理说明: - Pod 网络 CIDR:10.244.0.0/16 是 Flannel 的默认子网,其他插件(如 Calico)可能使用不同 CIDR。此 CIDR 定义了集群中所有 Pod 的 IP 范围。 - kubeadm init 输出:初始化完成后会输出一个 kubeadm join 命令,其中包含令牌和证书哈希,用于 Worker 节点加入。请保存该输出。### 验证 Master 节点执行以下命令检查控制平面组件是否正常运行:bash# 查看所有 Pod 状态(应在 kube-system 命名空间)kubectl get pods -n kube-system -o wide# 输出示例(所有组件应为 Running):# coredns-5d78c9869d-xxxxx 1/1 Running# kube-apiserver-master 1/1 Running# kube-controller-manager... 1/1 Running# kube-scheduler-master 1/1 Running—## 加入 Worker 节点在 Worker 节点上执行 Master 初始化时生成的 kubeadm join 命令。如果令牌已过期,可在 Master 上重新生成。### 代码示例 4:Worker 节点加入bash#!/bin/bash# 文件名:join_worker.sh# 功能:将当前节点作为 Worker 加入集群# 使用 kubeadm init 输出中的命令(以下为示例,实际需替换)kubeadm join 192.168.1.10:6443 \ --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# 如果令牌过期,在 Master 上重新生成并执行:# kubeadm token create --print-join-command原理说明: - token 机制:令牌是临时凭证,默认有效期为 24 小时。--discovery-token-ca-cert-hash 用于验证 Master 证书,防止中间人攻击。 - 加入流程:Worker 节点会与 API Server 建立 TLS 连接,获取集群配置,并启动 kubelet 注册自身。之后控制平面会调度 Pod 到该节点。—## 集群验证与测试在 Master 节点上运行以下命令验证集群状态:bash# 查看所有节点(Master 和 Worker)kubectl get nodes -o wide# 输出示例:# NAME STATUS ROLES AGE VERSION INTERNAL-IP# master Ready control-plane 10m v1.28.2 192.168.1.10# worker Ready <none> 5m v1.28.2 192.168.1.11# 创建测试 Deploymentkubectl create deployment nginx --image=nginx:alpine --replicas=2kubectl expose deployment nginx --port=80 --type=NodePort# 查看服务访问端口kubectl get svc nginx# 使用任意节点 IP + NodePort 访问:curl http://192.168.1.11:3xxxx—## 常见问题与排错若集群无法正常初始化,请检查以下常见问题:1. 端口被占用:K8s 控制平面使用 6443、10250 等端口,确保未被其他服务占用。2. cgroup 驱动不一致:kubelet 与 containerd 的 cgroup 驱动需一致(均为 systemd)。3. 网络插件冲突:如果 Pod 网络 CIDR 与宿主机网络冲突,会导致 Pod 无法通信。4. 防火墙未关闭:systemctl stop firewalld && systemctl disable firewalld。—## 总结本文详细演示了在 CentOS 7 上搭建 K8s 1.28 集群的完整流程,从基础环境配置到 Worker 节点加入,并提供了可运行的代码示例。核心要点包括:1. 系统级优化:关闭 swap、加载内核模块是 K8s 运行的基础。2. 容器运行时选择:containerd 作为轻量级 CRI 更适合生产环境。3. kubeadm 的便捷性:通过一条命令即可初始化控制平面,大幅降低部署门槛。4. 网络插件的重要性:选择适合自己的 CNI(如 Flannel、Calico)是集群通信的关键。K8s 1.28 在稳定性与性能上进一步优化,尤其是对 containerd 的深度支持。建议在生产环境中结合监控工具(如 Prometheus)和日志系统(如 EFK)完善集群运维。通过本文的指导,读者应能快速建立一个可运行的 K8s 集群,为后续的容器化应用部署打下坚实基础。
更多推荐
所有评论(0)