Kubeasz 部署 K8s 生产方案

简介: Kubeasz 部署 K8s 生产方案

Kubeasz 部署 K8s 生产方案(存储:Longhorn)


一、环境规划

1.1 节点规划

角色 主机名 IP(示例) 配置 数量
Master k8s-master-01 192.168.1.11 4C8G 50G SSD 1
Master k8s-master-02 192.168.1.12 4C8G 50G SSD 1
Master k8s-master-03 192.168.1.13 4C8G 50G SSD 1
Worker k8s-worker-01 192.168.1.21 8C16G 100G SSD 1
Worker k8s-worker-02 192.168.1.22 8C16G 100G SSD 1
Worker k8s-worker-03 192.168.1.23 8C16G 100G SSD 1
LB (VIP) - 192.168.1.10 - 1

生产建议:Master 至少 3 节点保证高可用;Worker 根据业务负载规划;Longhorn 推荐每个 Worker 挂载一块独立数据盘(如 /dev/vdb),避免与系统盘争用 IO。

1.2 系统要求

项目 要求
OS Ubuntu 20.04/22.04 或 CentOS 7.9/8(推荐 Ubuntu 22.04)
Kernel ≥ 4.18(Longhorn 需要 iSCSI 支持,推荐 5.x)
网络 全节点互通,关闭 Swap
磁盘 Longhorn 节点需额外数据盘,格式化为 ext4/xfs
时间 所有节点 NTP 同步

二、部署前准备

2.1 基础环境初始化(所有节点)

# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# 关闭 Swap
swapoff -a
sed -i '/swap/d' /etc/fstab

# 关闭 SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 加载内核模块(Longhorn 依赖)
cat >> /etc/modules-load.d/longhorn.conf <<EOF
iscsi_tcp
dm_crypt
overlay
br_netfilter
EOF

# 加载内核模块
modprobe iscsi_tcp
modprobe dm_crypt
modprobe overlay
modprobe br_netfilter

# 内核参数优化
cat >> /etc/sysctl.d/99-k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
net.ipv4.conf.all.forwarding        = 1
vm.max_map_count                    = 262144
fs.file-max                         = 1000000
fs.inotify.max_user_instances       = 8192
fs.inotify.max_user_watches         = 524288
EOF

sysctl --system

# 安装必要工具
apt update && apt install -y curl wget socat conntrack ipvsadm ipset jq

2.2 iSCSI 客户端安装(Longhorn 必需,所有 Worker 节点)

# Ubuntu
apt install -y open-iscsi nfs-common

# 启动 iscsid
systemctl enable iscsid
systemctl start iscsid

三、Kubeasz 部署 K8s

3.1 安装 Kubeasz

# 在部署机(可选独立部署机或 master-01)
export RELEASE=v3.6.5  # 检查最新版本: https://github.com/easz/kubeasz/releases

# 下载 kubeasz
curl -L https://github.com/easz/kubeasz/releases/download/${RELEASE}/ezdown -o /usr/local/bin/ezdown
chmod +x /usr/local/bin/ezdown

# 初始化目录
ezdown -D

# 下载离线镜像(可选,加速部署)
ezdown -X v1.28.2

3.2 配置集群

# 创建集群配置
cd /etc/kubeasz
ezctl new k8s-prod

3.3 编辑集群配置文件

hosts 文件 (/etc/kubeasz/clusters/k8s-prod/hosts):

# 部署节点
[deploy]
192.168.1.11

# etcd 节点(生产建议独立部署或使用 master 节点)
[etcd]
192.168.1.11
192.168.1.12
192.168.1.13

# master 节点
[master]
192.168.1.11
192.168.1.12
192.168.1.13

# worker 节点
[node]
192.168.1.21
192.168.1.22
192.168.1.23

# 负载均衡(VIP)
[ex_lb]
192.168.1.10

# 配置变量
[all:vars]
# k8s 版本
CLUSTER_NAME="k8s-prod"
CONTAINER_RUNTIME="containerd"
K8S_VER="v1.28.2"

# 网络插件(推荐 calico)
CLUSTER_NETWORK="calico"
NETWORK_CALICO="calico-v3.26"

# Service CIDR
SERVICE_CIDR="10.68.0.0/16"
POOLID_IPV4="172.20.0.0/16"

# API Server VIP
MASTER_IP="192.168.1.10"
LB_DOMAIN="lb.k8s.local"

# 认证
CA_EXPIRY="87600h"
CERT_EXPIRY="8760h"

# 审计日志
AUDIT_ENABLED=true

config.yml (/etc/kubeasz/clusters/k8s-prod/config.yml):

# 关键配置项
# 容器运行时
container_runtime:
  type: containerd
  version: "1.7.8"

# etcd 配置
etcd:
  data_dir: "/var/lib/etcd"
  snapshot_count: 10000
  heartbeat_interval: 250
  election_timeout: 5000

# kubelet 配置
kubelet:
  max_pods: 200
  pod_infra_container_image: "registry.k8s.io/pause:3.9"
  kube_reserved:
    cpu: "500m"
    memory: "512Mi"
  system_reserved:
    cpu: "500m"
    memory: "512Mi"
  eviction_hard:
    memory.available: "200Mi"
    nodefs.available: "10%"
    imagefs.available: "15%"

# 开启审计
audit:
  enabled: true
  log_path: "/var/log/kubernetes/audit.log"
  max_age: 30
  max_backups: 10
  max_size: 100

3.4 执行部署

# 一键部署(推荐分步执行以便排错)
cd /etc/kubeasz

# 步骤1:初始化环境
ezctl setup k8s-prod 01.prepare

# 步骤2:部署 etcd
ezctl setup k8s-prod 02.etcd

# 步骤3:部署容器运行时
ezctl setup k8s-prod 03.containerd

# 步骤4:部署 master 组件
ezctl setup k8s-prod 04.kube-master

# 步骤5:部署网络插件
ezctl setup k8s-prod 05.kube-node

# 步骤6:部署 worker 节点
ezctl setup k8s-prod 06.network

# 步骤7:部署核心服务
ezctl setup k8s-prod 07.cluster-addon

# 步骤8:部署负载均衡
ezctl setup k8s-prod 08.lb

# 步骤9:部署存储(Longhorn,见第四节)
# 手动执行

3.5 验证集群

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

四、Longhorn 存储部署

4.1 准备数据盘(所有 Worker 节点)

# 查看数据盘(假设 /dev/vdb 为 Longhorn 专用数据盘)
lsblk

# 格式化数据盘
mkfs.ext4 -F /dev/vdb

# 挂载到 Longhorn 数据目录
mkdir -p /data/longhorn
mount /dev/vdb /data/longhorn

# 写入 fstab 持久化
echo '/dev/vdb /data/longhorn ext4 defaults 0 2' >> /etc/fstab

4.2 安装 Longhorn

# 创建命名空间
kubectl create namespace longhorn-system

# 方式一:使用 Helm 安装(推荐)
helm repo add longhorn https://charts.longhorn.io
helm repo update

helm install longhorn longhorn/longhorn \
  --namespace longhorn-system \
  --version 1.5.3 \
  --set defaultSettings.defaultDataPath=/data/longhorn \
  --set defaultSettings.storageOverProvisioningPercentage=200 \
  --set defaultSettings.storageMinimalAvailablePercentage=10 \
  --set defaultSettings.replicaAutoBalance=best-effort \
  --set defaultSettings.backupTarget="" \
  --set persistence.defaultClass=true \
  --set persistence.defaultClassReplicaCount=3 \
  --set longhornManager.resources.requests.cpu=100m \
  --set longhornManager.resources.requests.memory=128Mi \
  --set longhornDriver.resources.requests.cpu=100m \
  --set longhornDriver.resources.requests.memory=128Mi

4.3 Longhorn 生产优化配置

部署完成后,在 Longhorn UI 或 CRD 中调整以下设置:

# longhorn-setting.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: longhorn-default-setting
  namespace: longhorn-system
data:
  default-setting.yaml: |
    # 默认副本数
    default-replica-count: 3
    # 默认数据路径
    default-data-path: /data/longhorn
    # 存储超配比例(200%)
    storage-over-provisioning-percentage: 200
    # 最小可用空间比例(低于10%停止调度)
    storage-minimal-available-percentage: 10
    # 副本自动均衡
    replica-auto-balance: best-effort
    # 节点排水策略
    node-drain-policy: block-if-contains-last-replica
    # 自动删除 PVC 时删除卷
    deleting-confirmation-flag: true
    # 快照数量限制
    snapshot-count-max: 250
    # 备份目标(生产建议配置 NFS/S3)
    # backup-target: nfs://192.168.1.100:/backup/longhorn
    # 自动 salvage
    auto-salvage: true
    # 自动删除无效副本
    auto-delete-when-volume-is-purged: true
    # 调度策略
    replica-soft-anti-affinity: false
    replica-zone-soft-anti-affinity: true
    # 引擎并发
    concurrent-automatic-engine-upgrade-per-node-limit: 3

4.4 创建 StorageClass

# longhorn-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: longhorn
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: driver.longhorn.io
allowVolumeExpansion: true
reclaimPolicy: Retain          # 生产建议 Retain,防止误删
volumeBindingMode: Immediate
parameters:
  numberOfReplicas: "3"
  staleReplicaTimeout: "30"
  fromBackup: ""
  fsType: "ext4"
  dataLocality: "disabled"
  # 数据本地性优化(可选,同节点优先)
  # dataLocality: "best-effort"
  unmapMarkSnapChainRemoved: "ignored"
---
# 高性能场景 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: longhorn-fast
provisioner: driver.longhorn.io
allowVolumeExpansion: true
reclaimPolicy: Retain
volumeBindingMode: Immediate
parameters:
  numberOfReplicas: "2"
  staleReplicaTimeout: "30"
  fsType: "ext4"
  dataLocality: "best-effort"
kubectl apply -f longhorn-storageclass.yaml

4.5 配置备份目标(NFS 示例)

# 在 NFS 服务器上
# mkdir -p /backup/longhorn && chmod 777 /backup/longhorn

# Longhorn UI 中设置:
# Settings > General > Backup Target
# nfs://192.168.1.100:/backup/longhorn

五、验证与测试

5.1 验证 Longhorn

# 检查 Longhorn 组件
kubectl get pods -n longhorn-system

# 检查节点磁盘状态
kubectl get nodes -o json | jq '.items[].metadata.name'

# 访问 Longhorn UI(通过 kubectl proxy 或 Ingress)
kubectl port-forward -n longhorn-system svc/longhorn-frontend 8080:80
# 浏览器访问 http://localhost:8080

5.2 创建 PVC 测试

# test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-longhorn-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test
      image: busybox
      command: ["sh", "-c", "echo 'Longhorn works!' > /data/test.txt && sleep 3600"]
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: test-longhorn-pvc
kubectl apply -f test-pvc.yaml
kubectl get pvc test-longhorn-pvc
kubectl exec test-pod -- cat /data/test.txt

六、生产加固建议

维度 措施
监控 部署 Prometheus + Grafana,导入 Longhorn Dashboard(ID: 17628)
告警 配置磁盘使用率 >80% 告警,副本异常告警
备份 设置定时 Backup CRD,关键数据每日备份到 NFS/S3
日志 收集 Longhorn Manager 日志到 ELK/Loki
安全 Longhorn UI 配置 Ingress + Basic Auth/TLS
升级 制定 Longhorn 滚动升级流程,升级前做好备份
灾备 跨可用区部署 Worker,利用 Longhorn Zone Anti-Affinity
资源隔离 为 Longhorn 组件设置 requests/limits,避免资源争抢

监控示例(Prometheus 告警规则)

# longhorn-alert-rules.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: longhorn-alerts
  namespace: longhorn-system
spec:
  groups:
    - name: longhorn.rules
      rules:
        - alert: LonghornNodeDiskUsageHigh
          expr: longhorn_node_storage_usage_bytes / longhorn_node_storage_capacity_bytes > 0.8
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Longhorn 节点磁盘使用率超过 80%"
        - alert: LonghornVolumeDegraded
          expr: longhorn_volume_robustness != "healthy"
          for: 5m
          labels:
            severity: critical
          annotations:
            summary: "Longhorn 卷状态异常: {
   { $labels.name }}"
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
Kubernetes Ubuntu 网络协议
|
21天前
|
存储 开发框架 人工智能
阿里云刚发布的 AgentLoop 是什么?
AgentLoop 帮助企业把 Agent 从能用提升到好用。
|
2月前
|
人工智能 安全 Cloud Native
Higress 新发布:AI Gateway 能力增强,Gateway API 及其推理扩展持续打磨
增强 AI 网关能力,持续打磨 Gateway API 及其推理扩展。
610 133
|
30天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2026 年 6 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
1月前
|
运维 自然语言处理 监控
把运维能力装进 Qoder,一句话就能定位根因
每个研发都踩过这个坑:遇到线上故障时,定位根因要跨五个平台,学数套查询语法,故障排查半小时起步。当STAROps长在Qoder里,在对话框里用自然语言提问:跨域诊断、多轮追问、生成修复代码、自动提 MR,全程不出 Qoder。三步上手,3 分钟看见效果。
261 11
|
20天前
|
存储 运维 安全
制造企业为什么需要档案管理系统?5个管理难题一次讲清
制造业数字化转型中,多数企业重点发力生产、设备智能化,却忽视了档案管理这一核心基础。制造企业的产品图纸、工艺文件、质检报告、设备台账、合规资质等档案,贯穿研发、生产、质检、售后、设备运维全流程,是企业生产经营的核心数据资产。但多数中小制造企业仍沿用纸质存档、本地散存、人工管档的传统模式,看似节约成本,却暗藏效率低、易出错、风险高、数据浪费等诸多问题。企业频发的生产返工、售后纠纷、审计处罚、设备停机等问题,大多源于档案管理混乱。本文梳理制造企业五大核心档案难题,清晰解读档案管理系统的实用价值。
|
20天前
|
人工智能 JSON 监控
GEO技术原理与实践:从结构化数据到AI引用率的工程化方案
本文深度解析GEO(生成式引擎优化)技术原理与落地实践,涵盖结构化数据标记(FAQ/HowTo/Article Schema)、语义相关性优化(向量检索、同义覆盖、三层内容结构)、可信度工程(E-E-A-T评分、Author/Citation Schema)及效果监测体系,助力内容被AI搜索高频引用。(239字)
|
20天前
|
Kubernetes 并行计算 算法框架/工具
|
20天前
|
人工智能 缓存 安全
AI Agent 凭证治理实践:从长期 API Key 到临时授权
AI Agent 不再只是生成文本,它会读取数据、调用工具、触发流程。本文从工程视角讨论为什么不应把长期 API Key 直接交给 Agent,并给出临时凭证、策略绑定、运行时拦截和审计归因的治理思路。
155 2
|
21天前
|
Shell 开发工具