当前位置: 首页 > news >正文

从零到一:基于Rocky Linux 9的K8s高可用集群部署实战(单Master双Node架构)

1. 环境准备与系统配置

在开始部署Kubernetes集群之前,我们需要对三台Rocky Linux 9服务器进行系统级配置。这部分工作看似基础,但往往决定了后续部署的成败。我曾在多个项目中发现,90%的集群初始化问题都源于前期系统配置不当。

首先是最小化安装Rocky Linux 9。选择最小化安装可以避免不必要的软件包占用资源,这也是生产环境的推荐做法。安装完成后,立即执行系统更新:

dnf update -y && reboot

国内用户需要特别注意软件源配置。默认的官方源在国内访问速度较慢,建议替换为阿里云镜像源。这个操作需要在所有节点上执行:

sed -e 's|^mirrorlist=|#mirrorlist=|g' \ -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \ -i.bak /etc/yum.repos.d/rocky*.repo

接下来配置主机名和静态IP。确保三台机器的主机名解析正确,这是Kubernetes节点发现的基础。以master节点为例:

hostnamectl set-hostname k8s-master01 echo "192.168.1.100 k8s-master01 192.168.1.101 k8s-node01 192.168.1.102 k8s-node02" >> /etc/hosts

2. 系统内核与安全配置

Kubernetes对Linux内核有一些特殊要求,我们需要进行针对性优化。首先关闭SELinux和防火墙(生产环境请根据实际情况调整):

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

时间同步对分布式系统至关重要,建议使用chrony配置NTP服务:

dnf install -y chrony sed -i 's/^pool 2.rocky.pool.ntp.org/pool ntp.aliyun.com/' /etc/chrony.conf systemctl enable --now chronyd

内核参数调整是很多人容易忽略的关键步骤。创建/etc/sysctl.d/k8s.conf文件并加入以下内容:

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 vm.swappiness = 0 EOF

加载br_netfilter模块并应用配置:

modprobe br_netfilter sysctl --system

3. 容器运行时安装与配置

Kubernetes 1.24+版本默认不再支持Docker,但通过cri-dockerd组件仍可继续使用。我们先安装Docker CE:

dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo dnf install -y docker-ce docker-ce-cli containerd.io

配置Docker使用systemd作为cgroup驱动,并设置国内镜像加速:

mkdir -p /etc/docker cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://registry.docker-cn.com"] } EOF

启动Docker服务并设置开机自启:

systemctl enable --now docker

接下来安装cri-dockerd,这是让Docker兼容Kubernetes CRI接口的关键组件:

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm

修改cri-dockerd服务配置,使用阿里云镜像仓库:

sed -i 's|ExecStart=/usr/bin/cri-dockerd|ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyun.com/google_containers/pause:3.7|' /usr/lib/systemd/system/cri-docker.service systemctl daemon-reload systemctl enable --now cri-docker.socket

4. Kubernetes组件安装与集群初始化

配置Kubernetes的阿里云yum源:

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

安装kubelet、kubeadm和kubectl:

dnf install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0 --disableexcludes=kubernetes systemctl enable kubelet

在master节点上准备kubeadm初始化配置文件:

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

修改配置文件关键参数:

apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.1.100 bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/cri-dockerd.sock name: k8s-master01 --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration imageRepository: registry.aliyun.com/google_containers kubernetesVersion: v1.28.0 networking: podSubnet: 10.244.0.0/16 apiServer: extraArgs: service-account-issuer: kubernetes.default.svc service-account-signing-key-file: /etc/kubernetes/pki/sa.key controllerManager: extraArgs: bind-address: 0.0.0.0 scheduler: extraArgs: bind-address: 0.0.0.0 --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs

开始初始化集群:

kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log

初始化成功后,按照提示配置kubectl:

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

5. 节点加入与网络插件部署

将worker节点加入集群,使用初始化时生成的join命令:

kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:xxxxxxxx \ --cri-socket unix:///var/run/cri-dockerd.sock

部署Calico网络插件:

curl https://docs.projectcalico.org/manifests/calico.yaml -O kubectl apply -f calico.yaml

验证节点状态和网络插件:

kubectl get nodes kubectl get pods -n kube-system

6. 集群验证与常用配置

测试集群功能是否正常:

kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get svc nginx

配置kubectl命令自动补全:

echo 'source <(kubectl completion bash)' >> ~/.bashrc echo 'alias k=kubectl' >> ~/.bashrc echo 'complete -F __start_kubectl k' >> ~/.bashrc source ~/.bashrc

7. 常见问题排查

遇到节点NotReady状态时,可按以下步骤排查:

  1. 检查kubelet服务状态:systemctl status kubelet
  2. 查看kubelet日志:journalctl -xeu kubelet
  3. 确认网络插件pod是否正常运行:kubectl get pods -n kube-system
  4. 检查节点资源是否充足:free -hdf -h

镜像拉取失败时,可以手动从国内源拉取:

docker pull registry.aliyun.com/google_containers/pause:3.7 docker tag registry.aliyun.com/google_containers/pause:3.7 registry.k8s.io/pause:3.7

8. 生产环境优化建议

对于生产环境,还需要考虑以下优化措施:

  1. 配置集群自动扩缩容(CA)
  2. 设置资源配额和限制(ResourceQuota)
  3. 部署监控系统(Prometheus + Grafana)
  4. 配置日志收集(EFK或Loki)
  5. 启用RBAC权限控制
  6. 定期备份etcd数据

内核参数进一步优化:

cat >> /etc/sysctl.d/k8s.conf <<EOF fs.file-max=1000000 net.ipv4.tcp_max_tw_buckets=6000 net.ipv4.tcp_syncookies=1 EOF

9. 维护与升级策略

日常维护建议:

  1. 定期检查节点磁盘空间
  2. 监控关键组件(kubelet、etcd等)的健康状态
  3. 及时更新安全补丁

升级Kubernetes版本的标准流程:

  1. 升级kubeadm:dnf upgrade -y kubeadm-1.28.0
  2. 升级master节点:kubeadm upgrade apply v1.28.0
  3. 升级kubelet和kubectl:dnf upgrade -y kubelet-1.28.0 kubectl-1.28.0
  4. 重启kubelet:systemctl restart kubelet
  5. 升级worker节点(逐个进行)

记得每次升级前先备份重要数据,并在测试环境验证升级过程。我在实际运维中发现,保持小版本间的及时升级(如1.27.x到1.28.x)比跨大版本升级更平稳。

http://www.jsqmd.com/news/572976/

相关文章:

  • Flink源码阅读:双流操作
  • 深入理解 SQL 中的 DATEDIFF 函数
  • SDXL-Turbo参数详解:1步推理设置、CFG scale调优与英文提示词规范
  • OpenAirInterface项目解析 04 SSB实现
  • Step3-VL-10B-Base模型Python安装与环境变量配置详解
  • 用噪音打破听觉恐怖谷:RTE 开发者社区发布 RealNoise™ TTS:全球首个原生合成动态声场的语音大模型
  • 突破限制的完整方案:开源工具免费解锁Cursor Pro功能实战指南
  • 别再乱选ASCII/HEX了!野火串口调试助手发送接收区配置详解(附实战案例)
  • 实战演练:基于快马平台快速构建开yun架构的物联网监控系统
  • PlugY:暗黑破坏神2单机玩家的开源功能扩展工具
  • STM32智能门锁进阶:RC522 RFID模块SPI通讯与卡号鉴权实战
  • 如何在macOS和Linux上快速解除iOS 15-16设备的iCloud激活锁
  • 3步实现跨平台日历同步:从需求到落地
  • AI辅助技能提升:用快马生成智能代码审查工具,让AI成为你的编程导师
  • 支持400米深井测量与短信报警:地下水位监测站技术解析
  • S2-Pro模型推理服务高可用部署:基于Docker与Kubernetes的架构
  • 文章标题:基于三菱PLC的门禁系统设计与实施
  • 声纹识别的概念
  • OpenTelemetry Java Agent实战:5分钟为Spring Boot应用添加监控埋点
  • VS Code + Git + 阿里云效Codeup:三件套搞定团队协作,从配置到避坑一条龙
  • 提升NLP开发效率:基于快马平台快速生成定制化transformer文本分类项目
  • 千问3.5-2B部署实操手册:supervisor服务管理命令+端口监听+日志定位全解析
  • EcoVadis评估辅导选购指南:5大标准选对可持续发展伙伴 - 奋飞咨询ecovadis
  • LLD 自动发现场景 → 对应使用哪种探测方式(SNMP/HTTP/Agent)最优
  • AFSim仿真系统中的7大坐标系统详解:从世界坐标到天线坐标的完整指南
  • N_m3u8DL-CLI-SimpleG:M3U8视频下载终极指南,三步搞定在线视频
  • 探秘2026食品厂无尘车间:高效生产与卫生保障并存,净化车间/洁净车间/净化工程/无尘车间,无尘车间实力厂家怎么选购 - 品牌推荐师
  • 实战进阶:基于快马生成的代码,打造个人专属的Markdown笔记应用
  • 在Windows上解锁B站新体验:BiliBili-UWP客户端3分钟快速上手指南
  • 激光熔覆仿真:Ansys Workbench下的单层单道熔覆温度场仿真及误差率控制