K8s(2)安装,集群

Kubernetes v1.32 集群部署详解(含命令 + 原理 + 图表)


一、部署架构总览

本次部署为 1 Master + 2 Worker​ 的标准测试集群,适用于生产环境前的验证。

1️⃣ 节点规划表

角色 主机名 IP 核心组件
Control Plane k8s-master01 192.168.222.141 apiserver / etcd / scheduler / controller-manager
Worker k8s-node1 192.168.222.142 kubelet / kube-proxy / Pod
Worker k8s-node2 192.168.222.143 kubelet / kube-proxy / Pod

2️⃣ 集群逻辑架构图

复制代码

纯文本

纯文本

复制代码
┌──────────────────────────────────┐
│         k8s-master01             │
│ ┌────────────┐  ┌────────────┐  │
│ │ apiserver  │◄─┤ controller │  │
│ └─────▲──────┘  └─────┬──────┘  │
│       │               │         │
│ ┌─────┴──────┐  ┌─────▼──────┐  │
│ │   etcd     │  │ scheduler  │  │
│ └────────────┘  └────────────┘  │
└───────────────┬─────────────────┘
                │ 6443
     ┌──────────┴──────────┐
     │                     │
┌────▼─────┐        ┌──────▼─────┐
│ k8s-node1│        │ k8s-node2  │
│ kubelet  │        │ kubelet    │
│ kube-proxy│        │ kube-proxy │
│ Calico   │        │ Calico     │
└──────────┘        └────────────┘

📌 知识点

  • apiserver 是唯一入口

  • etcd 存储所有集群状态

  • kubelet 是"节点管家"

  • CNI 解决 Pod 网络


二、系统层准备(所有节点)

1️⃣ 主机名与静态解析

复制代码

bash

bash

复制代码
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
复制代码

bash

bash

复制代码
cat >> /etc/hosts << EOF
192.168.222.141 k8s-master01
192.168.222.142 k8s-node1
192.168.222.143 k8s-node2
EOF

📌 原理

K8s 不使用 IP 识别节点,而是使用 hostname。


2️⃣ 关闭 Swap(强约束)

复制代码

bash

bash

复制代码
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
原因
K8s 设计 假设内存可预测
Swap 会导致 OOM 行为异常
后果 kubelet 拒绝启动

3️⃣ 时间同步(分布式系统基础)

复制代码

bash

bash

复制代码
yum install -y chrony
systemctl enable --now chronyd
chronyc sources -v

📌 时间不一致的后果

  • etcd 选主失败

  • TLS 证书校验失败

  • 调度时间漂移


三、内核参数与模块(网络核心)

1️⃣ 内核模块对照表

模块 作用
br_netfilter 桥接流量进入 iptables
ip_vs IPVS 负载均衡
ip_vs_rr / wrr / sh 调度算法
nf_conntrack 连接跟踪
复制代码

bash

bash

复制代码
modprobe br_netfilter
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack

2️⃣ sysctl 参数(K8s 网络必需)

复制代码

bash

bash

复制代码
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
fs.file-max = 52706963
net.netfilter.nf_conntrack_max = 2310720
EOF

sysctl --system

📌 作用

  • Service NAT

  • Pod 跨节点通信

  • CNI 插件依赖


四、资源限制(防雪崩)

复制代码

bash

bash

复制代码
cat >> /etc/security/limits.conf << EOF
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
EOF
复制代码

bash

bash

复制代码
sed -i 's/^#DefaultLimitNOFILE=.*/DefaultLimitNOFILE=655360/' /etc/systemd/system.conf
systemctl daemon-reload

📌 原因

  • 单节点可运行数百 Pod

  • 文件句柄不足 → kubelet 崩溃


五、容器运行时(Docker + cri-dockerd)

1️⃣ 架构关系图

复制代码

纯文本

纯文本

复制代码
kubelet
   │
   ▼
CRI (cri-dockerd)
   │
   ▼
Docker
   │
   ▼
Container

2️⃣ Docker 配置

复制代码

bash

bash

复制代码
cat > /etc/docker/daemon.json << EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://p3kgr6db.mirror.aliyuncs.com"
  ]
}
EOF

systemctl enable --now docker

📌 关键点

  • cgroup driver 必须与 kubelet 一致

3️⃣ 安装 cri-dockerd

复制代码

bash

bash

复制代码
yum install -y libcgroup
rpm -ivh cri-dockerd-0.3.16-3.fc35.x86_64.rpm
systemctl enable --now cri-docker.socket cri-docker

六、K8s 组件安装

复制代码

bash

bash

复制代码
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
EOF
复制代码

bash

bash

复制代码
yum install -y kubelet kubeadm kubectl kubernetes-cni
systemctl enable kubelet

七、Master 初始化(核心)

复制代码

bash

bash

复制代码
kubeadm init \
  --apiserver-advertise-address=192.168.222.141 \
  --image-repository=registry.aliyuncs.com/google_containers \
  --kubernetes-version=v1.32.13 \
  --pod-network-cidr=10.244.0.0/16 \
  --cri-socket=unix:///var/run/cri-dockerd.sock

初始化后配置

复制代码

bash

bash

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

📌 kubeadm 做了什么?

  1. 生成 CA

  2. 启动 etcd

  3. 启动 apiserver

  4. 生成 kubeconfig


八、Worker 加入集群

复制代码

bash

bash

复制代码
kubeadm join 192.168.222.141:6443 \
  --token xxxxxx \
  --discovery-token-ca-cert-hash sha256:xxxxxx \
  --cri-socket unix:///var/run/cri-dockerd.sock

九、Calico 网络插件

复制代码

bash

bash

复制代码
docker load -i /opt/calico_3.28.1_image.tar
kubectl apply -f calico.yaml

最终状态表

组件 状态
Node Ready
CoreDNS Running
Calico Running
kube-proxy Running
相关推荐
nuo5342021 小时前
基础 6 —— Docker 容器数据卷
docker·容器
Sinclair2 小时前
安企CMS的安装-Docker 部署
运维·docker·容器
汪汪大队u3 小时前
【无标题】
运维·docker·kubernetes·prometheus
慧一居士7 小时前
KubePi 功能和使用场景全面介绍
容器
BaiduPHP7 小时前
docker异常断电,出现docker服务,启动失败
docker·容器·eureka
ai_coder_ai8 小时前
编写自动化脚本,在自己后端服务中使用云原生Baas服务进行编码和解码相关操作
数据库·云原生·自动化
云烟成雨TD8 小时前
Kubernetes 系列【20】服务:EndpointSlice 端点分片
云原生·容器·kubernetes
寒冰碧海10 小时前
大模型部署从0到1(三):单机多卡 vLLM 部署Qwen3.6实战|Docker Compose 一键启动
docker·容器·vllm
潘正翔21 小时前
docker核心概念
linux·运维·服务器·docker·容器·centos·运维开发