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

Rocky Linux上二进制部署Kubernetes集群实战指南

1. 为什么选择二进制部署Kubernetes?

在Rocky Linux上部署Kubernetes集群时,大多数人会直接使用kubeadm等工具,但二进制部署才是真正理解Kubernetes组件交互的绝佳方式。我最近在生产环境用二进制方式部署了Kubernetes v1.33集群,整个过程踩了不少坑,也积累了一些实战经验。

二进制部署最大的优势在于可控性。你可以精确控制每个组件的版本、启动参数和部署位置。这对于需要定制化Kubernetes的企业环境特别有用。比如,我们曾经遇到需要修改kube-apiserver的审计策略,二进制部署就能轻松实现,而kubeadm方式则需要折腾半天。

提示:二进制部署适合对Kubernetes有较深理解的中高级用户,如果是初学者建议先用kubeadm熟悉基本概念。

2. 环境准备与系统配置

2.1 Rocky Linux基础配置

我选择Rocky Linux 9作为操作系统,这是RHEL的完美替代品,特别适合企业级部署。以下是必须完成的系统配置:

  1. 网络配置
# 设置静态IP(以ens192为例) nmcli con mod ens192 ipv4.addresses 192.168.1.100/24 nmcli con mod ens192 ipv4.gateway 192.168.1.1 nmcli con mod ens192 ipv4.dns "8.8.8.8 8.8.4.4" nmcli con mod ens192 ipv4.method manual nmcli con up ens192
  1. 主机名与hosts配置
hostnamectl set-hostname k8s-master01 echo "192.168.1.100 k8s-master01" >> /etc/hosts echo "192.168.1.101 k8s-node01" >> /etc/hosts
  1. 关闭防火墙和SELinux(生产环境需谨慎):
systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

2.2 内核参数优化

Kubernetes对Linux内核有特殊要求,必须调整以下参数:

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

注意:如果遇到"bridge-nf-call"报错,需要先加载br_netfilter模块:modprobe br_netfilter

3. 下载和安装Kubernetes组件

3.1 获取二进制文件

从官方GitHub下载v1.33版本的二进制文件:

wget https://dl.k8s.io/v1.33.0/kubernetes-server-linux-amd64.tar.gz tar -zxvf kubernetes-server-linux-amd64.tar.gz cd kubernetes/server/bin

关键组件包括:

  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler
  • kubelet
  • kube-proxy
  • kubectl

3.2 组件部署结构

我推荐以下目录结构:

/opt/kubernetes/ ├── bin/ # 二进制文件 ├── cfg/ # 配置文件 ├── ssl/ # 证书文件 ├── logs/ # 日志文件 └── systemd/ # systemd服务文件

部署命令示例:

mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs,systemd} cp kube-apiserver kube-controller-manager kube-scheduler kubectl /opt/kubernetes/bin/

4. 证书体系搭建

4.1 自签CA证书

使用cfssl工具创建CA证书:

cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF cat > ca-csr.json <<EOF { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "O": "k8s", "OU": "System" } ] } EOF cfssl gencert -initca ca-csr.json | cfssljson -bare ca

4.2 签发API Server证书

创建证书签名请求:

cat > server-csr.json <<EOF { "CN": "kubernetes", "hosts": [ "127.0.0.1", "192.168.1.100", "10.96.0.1", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "O": "k8s", "OU": "System" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server

5. 核心组件配置与启动

5.1 kube-apiserver配置

创建配置文件/opt/kubernetes/cfg/kube-apiserver.conf

cat > /opt/kubernetes/cfg/kube-apiserver.conf <<EOF KUBE_APISERVER_OPTS="--logtostderr=false \\ --v=2 \\ --log-dir=/opt/kubernetes/logs \\ --etcd-servers=https://192.168.1.100:2379 \\ --bind-address=192.168.1.100 \\ --secure-port=6443 \\ --advertise-address=192.168.1.100 \\ --allow-privileged=true \\ --service-cluster-ip-range=10.96.0.0/12 \\ --enable-admission-plugins=NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\ --authorization-mode=RBAC,Node \\ --enable-bootstrap-token-auth=true \\ --token-auth-file=/opt/kubernetes/cfg/token.csv \\ --service-node-port-range=30000-32767 \\ --tls-cert-file=/opt/kubernetes/ssl/server.pem \\ --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \\ --client-ca-file=/opt/kubernetes/ssl/ca.pem \\ --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\ --service-account-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\ --service-account-issuer=https://kubernetes.default.svc.cluster.local \\ --etcd-cafile=/opt/etcd/ssl/ca.pem \\ --etcd-certfile=/opt/etcd/ssl/server.pem \\ --etcd-keyfile=/opt/etcd/ssl/server-key.pem" EOF

创建systemd服务文件:

cat > /usr/lib/systemd/system/kube-apiserver.service <<EOF [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver.conf ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS Restart=on-failure [Install] WantedBy=multi-user.target EOF

启动服务:

systemctl daemon-reload systemctl enable kube-apiserver systemctl start kube-apiserver

5.2 kube-controller-manager配置

创建配置文件/opt/kubernetes/cfg/kube-controller-manager.conf

cat > /opt/kubernetes/cfg/kube-controller-manager.conf <<EOF KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\ --v=2 \\ --log-dir=/opt/kubernetes/logs \\ --leader-elect=true \\ --master=127.0.0.1:8080 \\ --bind-address=127.0.0.1 \\ --allocate-node-cidrs=true \\ --cluster-cidr=10.244.0.0/16 \\ --service-cluster-ip-range=10.96.0.0/12 \\ --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\ --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\ --root-ca-file=/opt/kubernetes/ssl/ca.pem \\ --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\ --controllers=*,bootstrapsigner,tokencleaner" EOF

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

6.1 部署kubelet

worker节点需要单独部署kubelet,配置文件示例:

cat > /opt/kubernetes/cfg/kubelet.conf <<EOF KUBELET_OPTS="--logtostderr=false \\ --v=2 \\ --log-dir=/opt/kubernetes/logs \\ --hostname-override=k8s-node01 \\ --network-plugin=cni \\ --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\ --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\ --config=/opt/kubernetes/cfg/kubelet-config.yml \\ --cert-dir=/opt/kubernetes/ssl \\ --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7" EOF

6.2 部署Flannel网络

下载并配置Flannel:

wget https://github.com/flannel-io/flannel/releases/download/v0.22.0/flanneld-amd64 mv flanneld-amd64 /opt/kubernetes/bin/flanneld chmod +x /opt/kubernetes/bin/flanneld

创建Flannel配置文件:

cat > /opt/kubernetes/cfg/flanneld.conf <<EOF FLANNEL_OPTIONS="--etcd-endpoints=https://192.168.1.100:2379 \\ --etcd-cafile=/opt/etcd/ssl/ca.pem \\ --etcd-certfile=/opt/etcd/ssl/server.pem \\ --etcd-keyfile=/opt/etcd/ssl/server-key.pem" EOF

7. 验证与排错

7.1 集群状态检查

使用kubectl检查集群状态:

kubectl get cs kubectl get nodes kubectl get pods -n kube-system

7.2 常见问题排查

  1. API Server无法启动

    • 检查端口6443是否被占用:netstat -tlnp | grep 6443
    • 查看日志:journalctl -u kube-apiserver -f
  2. Node节点NotReady

    • 检查kubelet日志:journalctl -u kubelet -f
    • 确认网络插件是否正常运行
  3. 证书过期问题

    • 检查证书有效期:openssl x509 -in /opt/kubernetes/ssl/server.pem -noout -dates
    • 更新证书后需要重启所有相关服务

经验分享:在二进制部署过程中,90%的问题都与证书配置有关。建议使用统一的证书管理工具,并做好证书过期监控。

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

相关文章:

  • CSS 高级动效与生成艺术实战案例:先量出瓶颈,再动资源配置
  • 如果传过去的地址是指针一级指针是值传递,二级指针是地址传递
  • Rust 所有权与生命周期从入门到实战:先划清数据、调用与失败边界
  • Agent Governance Toolkit安全论坛:与同行交流AI代理治理经验
  • 2026年工业冰水机供应厂家甄选分析:螺杆式、风冷式与水冷式高效节能方案 - 卓企推荐
  • MySQL 解析器定制与执行计划深度分析:先限制次数、预算与取消信号
  • 【物理AI】数字孪生全栈国产化:中国市场判断与决策分析
  • MySQL 9.6外键管理优化与性能提升详解
  • 如何高效学习Android开源框架?Android Open Framework Analysis项目快速上手指南
  • PostgreSQL表膨胀问题深度解析与优化方案
  • 深入Cwerg IR:探索编译器前端与后端的完美接口设计
  • #威海龙门导轨磨床品牌厂商优选威海沣润智能装备有限公司(威海营销部) - 品牌优推
  • Rust 异步编程与 Tokio 运行时:先限制次数、预算与取消信号
  • 技术实战中代价最高的错误:数据库事务、缓存与分布式系统避坑指南
  • Java 常用语法极简通关(一):Java 程序的基本骨架——main 方法、类、包与变量声明
  • 深度剖析 JVM 垃圾回收算法:从三大经典模型到 Region 分区与 ZGC 零停顿实战
  • 武汉华中企业往复式提升机选型攻略 优质设备挑选技巧 - 生活动态圈
  • 官方权威授权!广州合优网络获评 2023 年度网易外贸通全国代理商
  • 终极REPENTOGON安装与使用指南:为《以撒的结合:悔改+》带来革命性模组体验 [特殊字符]
  • Docker安装与配置全指南:从环境检查到性能优化
  • 基于大模型优化垂直轴风力发电系统已融合人工智能AI软件平台
  • 气温中位数获取指南
  • 终极指南:如何快速掌握KMS-Tools-Portable便携激活工具
  • Hadoop+Spark构建股票预测系统的核心技术解析
  • gotgbot实战案例:构建功能完备的Telegram支付机器人
  • 组件库自动化管理:从依赖梳理开始拆核心链路
  • 响应式布局与跨端 UI 一致性方案:上线前补齐校验、观测与回退
  • 如何用Photon光影包彻底改变你的Minecraft视觉体验
  • 细胞房里的“黄金45分钟”,有多少试剂死在路上?
  • WMPFDebugger深度解析:Windows微信小程序逆向调试技术实战指南