Kubernetes 集群部署

Kubernetes 集群部署

本章介绍如何部署 Kubernetes 集群,包括在线部署和离线部署两种方案,以及单节点和高可用两种架构。

部署方案概览

根据网络环境和集群规模的不同,Kubernetes 提供了多种部署方案:

部署方式分类
├── 在线部署(有互联网连接)
│   ├── 单节点部署(开发/测试)
│   └── 高可用部署(生产环境)
└── 离线部署(内网隔离)
    ├── 单节点部署(开发/测试)
    └── 高可用部署(生产环境)

一、在线部署 vs 离线部署

在线部署

特点

  • ✅ 部署简单快速
  • ✅ 自动下载最新版本
  • ✅ 官方文档支持完善
  • ❌ 依赖网络连接
  • ❌ 国内访问速度较慢

适用场景

  • 有互联网连接的开发环境
  • 云平台环境(AWS、Azure、GCP)
  • 测试和演示环境

详细教程


离线部署

特点

  • ✅ 不依赖外网连接
  • ✅ 部署速度快(无需下载)
  • ✅ 版本可控,稳定性高
  • ✅ 符合安全合规要求
  • ❌ 准备工作复杂
  • ❌ 更新维护相对繁琐

适用场景

  • 内网隔离环境
  • 安全要求高的生产环境
  • 政企单位、军工、金融行业
  • 无法访问互联网的数据中心

详细教程


二、单节点部署 vs 高可用部署

单节点部署

架构

┌─────────────────────────────┐
│      Master + Worker        │
│  ┌─────────────────────┐    │
│  │  Control Plane      │    │
│  │  - API Server       │    │
│  │  - etcd             │    │
│  │  - Scheduler        │    │
│  │  - Controller Mgr   │    │
│  └─────────────────────┘    │
│  ┌─────────────────────┐    │
│  │  Worker Components  │    │
│  │  - kubelet          │    │
│  │  - Pod Runtime      │    │
│  └─────────────────────┘    │
└─────────────────────────────┘

特点

  • 💻 最小配置:2 核 CPU + 4GB 内存
  • 🚀 快速部署:10-15 分钟完成
  • 💰 成本低:单台服务器即可
  • ⚠️ 无高可用:节点故障导致服务中断
  • 🎯 适合场景:学习、开发、测试

部署步骤

# 1. 初始化 Master 节点(允许调度 Pod)
kubeadm init --pod-network-cidr=10.244.0.0/16

# 2. 移除 Master 节点的污点,允许调度工作负载
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

# 3. 安装网络插件
kubectl apply -f calico.yaml

# 4. 验证
kubectl get nodes
kubectl get pods --all-namespaces

资源配置建议

用途 CPU 内存 磁盘
学习环境 2 核 4GB 20GB
开发环境 4 核 8GB 50GB
小型测试 8 核 16GB 100GB

高可用部署(HA)

架构

                    ┌──────────────┐
                    │  负载均衡器   │
                    │  (HAProxy)   │
                    │  VIP: x.x.x.100
                    └──────┬───────┘
                           │
       ┌───────────────────┼───────────────────┐
       │                   │                   │
┌──────▼──────┐    ┌──────▼──────┐    ┌──────▼──────┐
│  Master 1   │    │  Master 2   │    │  Master 3   │
│  ┌────────┐ │    │  ┌────────┐ │    │  ┌────────┐ │
│  │ API    │ │    │  │ API    │ │    │  │ API    │ │
│  │ etcd   │◄├────┤  │ etcd   │◄├────┤  │ etcd   │ │
│  │ Sched  │ │    │  │ Sched  │ │    │  │ Sched  │ │
│  │ Ctrl   │ │    │  │ Ctrl   │ │    │  │ Ctrl   │ │
│  └────────┘ │    │  └────────┘ │    │  └────────┘ │
└─────────────┘    └─────────────┘    └─────────────┘
       │                   │                   │
       └───────────────────┼───────────────────┘
                           │
       ┌───────────────────┼───────────────────┐
       │                   │                   │
┌──────▼──────┐    ┌──────▼──────┐    ┌──────▼──────┐
│  Worker 1   │    │  Worker 2   │    │  Worker 3   │
│  ┌────────┐ │    │  ┌────────┐ │    │  ┌────────┐ │
│  │ kubelet│ │    │  │ kubelet│ │    │  │ kubelet│ │
│  │  Pods  │ │    │  │  Pods  │ │    │  │  Pods  │ │
│  └────────┘ │    │  └────────┘ │    │  └────────┘ │
└─────────────┘    └─────────────┘    └─────────────┘

特点

  • 🛡️ 高可用:任意节点故障不影响服务
  • 📈 可扩展:支持水平扩展
  • 🔄 负载均衡:请求分发到多个 Master
  • 💾 数据冗余:etcd 集群保证数据安全
  • ⚙️ 复杂度高:配置和维护更复杂
  • 💰 成本高:至少需要 6 台服务器

部署步骤

# 1. 初始化第一个 Master
kubeadm init \
  --control-plane-endpoint="192.168.1.100:6443" \
  --upload-certs \
  --pod-network-cidr=10.244.0.0/16

# 2. 加入其他 Master 节点
kubeadm join 192.168.1.100:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash> \
  --control-plane \
  --certificate-key <cert-key>

# 3. 加入 Worker 节点
kubeadm join 192.168.1.100:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

# 4. 安装网络插件
kubectl apply -f calico.yaml

# 5. 验证集群
kubectl get nodes
kubectl get pods --all-namespaces

资源配置建议

节点类型 数量 CPU 内存 磁盘
Master 节点 3 4 核 8GB 100GB SSD
Worker 节点 3+ 8 核 16GB 200GB SSD
负载均衡器 2 2 核 4GB 50GB

高可用关键组件

  1. 负载均衡器(HAProxy + Keepalived)

    • 提供 VIP(虚拟 IP)
    • 健康检查和故障转移
    • 请求分发到多个 Master
  2. etcd 集群(3 或 5 节点)

    • 数据一致性(Raft 协议)
    • 自动故障恢复
    • 建议独立部署
  3. 多 Master 节点(3 或 5 节点)

    • API Server 负载均衡
    • Scheduler 和 Controller Manager 主备切换
    • 证书共享

三、部署方案对比

完整对比表

对比项 在线单节点 在线高可用 离线单节点 离线高可用
部署难度 ⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐
部署时间 15 分钟 1-2 小时 30 分钟 2-4 小时
服务器数量 1 台 6+ 台 1 台 6+ 台
最小成本 ¥500/月 ¥5000/月 一次性 一次性
可用性 单点故障 99.9%+ 单点故障 99.9%+
网络依赖 需要 需要 不需要 不需要
维护难度 ⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐
适用场景 学习/开发 生产环境 内网开发 内网生产

选择建议

选择决策树:

1. 是否有互联网连接?
   ├─ 有 → 考虑在线部署
   └─ 无 → 必须离线部署

2. 是生产环境吗?
   ├─ 是 → 推荐高可用部署
   └─ 否 → 单节点即可

3. 预算充足吗?
   ├─ 充足 → 高可用部署
   └─ 有限 → 单节点部署

4. 对可用性要求?
   ├─ 高(99.9%+) → 必须高可用
   └─ 一般 → 单节点可接受

推荐配置

场景 推荐方案
🎓 个人学习 在线单节点
💻 团队开发 在线单节点(或 Minikube)
🧪 测试环境 在线单节点
🏢 小型生产 在线高可用(3 Master + 3 Worker)
🏭 大型生产 在线高可用(5 Master + N Worker)
🔒 内网开发 离线单节点
🏛️ 政企生产 离线高可用(5 Master + N Worker)

四、部署前准备

硬件要求

最低配置(学习环境)

  • CPU:2 核
  • 内存:4GB
  • 磁盘:20GB
  • 网络:1Gbps

推荐配置(生产环境)

  • Master:4 核 / 8GB / 100GB SSD
  • Worker:8 核 / 16GB / 200GB SSD
  • 网络:10Gbps

软件要求

  • 操作系统:Ubuntu 22.04 / CentOS 8+ / RHEL 8+
  • 内核版本:>= 4.19
  • 容器运行时:containerd 1.7+ / CRI-O 1.30+
  • 网络插件:Calico / Flannel / Cilium

网络规划

集群网络规划:
  Pod 网络: 10.244.0.0/16
  Service 网络: 10.96.0.0/12
  节点网络: 192.168.1.0/24
  
端口规划:
  API Server: 6443
  etcd: 2379-2380
  kubelet: 10250
  NodePort: 30000-32767

五、快速开始

在线单节点部署(10 分钟)

# 1. 安装 kubeadm、kubelet、kubectl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl

# 2. 初始化集群
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# 3. 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 4. 移除 Master 污点(单节点)
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

# 5. 安装网络插件
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml

# 6. 验证
kubectl get nodes
kubectl get pods -A

👉 详细步骤: 在线单节点部署


离线单节点部署(30 分钟)

# 1. 准备离线包(在联网环境)
# 下载二进制、镜像、配置文件并打包

# 2. 传输离线包到目标服务器
scp k8s-offline-v1.30.0.tar.gz root@server:/root/

# 3. 解压并执行部署脚本
tar -xzf k8s-offline-v1.30.0.tar.gz
cd k8s-offline
sudo ./scripts/deploy-offline.sh

# 4. 选择节点角色: master
# 5. 输入 IP 地址
# 6. 等待部署完成

👉 详细步骤: 离线单节点部署


六、下一步

完成集群部署后,建议进行以下操作:

1. 安装必要组件

# Metrics Server(资源监控)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# Ingress Controller(外部访问)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

# Dashboard(图形界面)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

2. 部署第一个应用

# 创建 Deployment
kubectl create deployment nginx --image=nginx --replicas=3

# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服务
kubectl get svc nginx

3. 学习后续章节


七、常见问题

Q1: 单节点集群适合生产环境吗?

A: 不推荐。单节点没有高可用保障,节点故障会导致整个集群不可用。仅适合开发、测试或学习环境。

Q2: 高可用集群至少需要几个节点?

A: 最少需要 6 个节点:

  • 3 个 Master 节点(或 5 个更好)
  • 3 个 Worker 节点(可按需增加)

Q3: 在线部署和离线部署可以混合使用吗?

A: 可以。例如初始部署使用在线方式,后续升级使用离线包。但建议统一使用一种方式以简化维护。

Q4: 如何从单节点迁移到高可用?

A: 需要重新部署高可用集群,然后迁移应用。无法直接将单节点升级为高可用架构。

Q5: Master 节点数量必须是奇数吗?

A: 强烈建议使用奇数(3、5、7),这是 etcd Raft 协议的最佳实践,能更好地处理脑裂问题。


小结

本章介绍了 Kubernetes 集群部署的方案选择:

在线 vs 离线:根据网络环境选择
单节点 vs 高可用:根据场景和预算选择
部署对比:完整的方案对比和选择建议
快速开始:10 分钟单节点部署
详细教程:在线和离线部署完整指南

选择建议

  • 🎓 学习/开发 → 在线单节点
  • 🧪 测试环境 → 在线单节点
  • 🏢 生产环境 → 在线高可用
  • 🔒 内网生产 → 离线高可用

下一步

  1. 选择适合的部署方案
  2. 参考详细教程完成部署
  3. 学习 Kubernetes 核心概念