如何在Ubuntu 20.04上配置并调优Kubernetes集群,确保在多租户环境下的高可用性与资源分配?

在企业级生产环境中,尤其是面向多业务线或多租户的场景下,高可用性、资源隔离与合理调度是 Kubernetes 成败的关键。A5数据将结合真实项目实践,详细介绍如何在 Ubuntu 20.04 LTS(内核 5.x) 上搭建并调优 Kubernetes 集群,聚焦 多租户隔离、资源控制、高可用 三大核心目标。文章包含完整产品参数表、硬件配置方案、实现步骤、关键配置示例以及评估对比表。


一、方案概要

本文方案基于以下组件和版本测试验证:

名称 建议版本/规格 说明
操作系统 Ubuntu 20.04 LTS 生产级长期支持版本
Kubernetes v1.27.x 社区稳定版
Container Runtime containerd v1.6.x Kubernetes 官方推荐
CNI Calico v3.24 / Cilium v1.14 网络隔离/策略支持
LB HAProxy / MetalLB 用于 Control Plane 与 LoadBalancer Service
etcd 内嵌 kubeadm 管理 etcd 高可用 etcd 多副本
Monitoring Prometheus + Grafana 多租户监控视图
Logging EFK (Elasticsearch, Fluentd, Kibana) 集群日志聚合

二、香港服务器www.a5idc.com硬件环境建议

在多租户高负载环境下,节点需要更高的 CPU/内存和网络带宽支持。以下是参考配置:

节点角色 CPU 内存 磁盘 网络 数量
Control Plane 8 核 16 GB 500 GB NVMe 10 Gbps 3
Worker 节点 16 核 64 GB 1 TB NVMe 10 Gbps N(≥3)
Monitoring 节点 4 核 16 GB 500 GB SSD 1--10 Gbps 2

备注:

  • Control Plane 采用三节点以上架构,以保证 etcd quorum 和 API 高可用。
  • Worker 节点根据租户规模可横向扩展。
  • 监控节点独立部署,以减轻主业务节点压力。

三、环境准备

3.1 系统基础设置

所有节点执行:

bash 复制代码
# 关闭 swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 关闭防火墙(可选,根据安全策略开启)
sudo ufw disable

# 加载桥接网络支持
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
sudo modprobe br_netfilter

# 内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system

3.2 安装 containerd

bash 复制代码
sudo apt update
sudo apt install -y containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd

四、部署高可用 Kubernetes

4.1 安装 kubeadm + kubelet + kubectl

所有节点:

bash 复制代码
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt update
sudo apt install -y kubelet=1.27.4-00 kubeadm=1.27.4-00 kubectl=1.27.4-00
sudo apt-mark hold kubelet kubeadm kubectl

4.2 Control Plane 高可用初始化

选择一个 VIP(如 192.168.0.50)用于 kube-apiserver 访问。使用 HAProxy 负载控制平面请求。

初始化第一个 Master:

bash 复制代码
sudo kubeadm init \
  --control-plane-endpoint "192.168.0.50:6443" \
  --upload-certs \
  --pod-network-cidr=192.168.0.0/16

保存输出的 join 命令,并在其他 Control Plane 节点执行:

bash 复制代码
sudo kubeadm join 192.168.0.50:6443 \
  --token <TOKEN> \
  --discovery-token-ca-cert-hash sha256:<HASH> \
  --control-plane --certificate-key <CERT_KEY>

五、安装 CNI 插件

本文以 Calico 为例:

bash 复制代码
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.24/manifests/calico.yaml

验证:

bash 复制代码
kubectl get pods -n calico-system

六、多租户资源隔离与控制

多租户核心在于 命名空间隔离、Role-Based Access Control(RBAC)、资源配额(ResourceQuota)以及限制范围(LimitRange)

6.1 命名空间与 RBAC

创建租户命名空间:

bash 复制代码
kubectl create namespace tenant-a
kubectl create namespace tenant-b

为租户创建基础角色权限:

bash 复制代码
kubectl apply -f - <<EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: tenant-a
  name: tenant-a-admin
rules:
- apiGroups: ["", "apps", "batch"]
  resources: ["*"]
  verbs: ["get","list","watch","create","update","delete"]
EOF

为特定用户绑定:

bash 复制代码
kubectl create rolebinding tenant-a-admin-binding \
  --namespace tenant-a \
  --role tenant-a-admin \
  --user tenant-a-user

6.2 资源配额和 LimitRange

bash 复制代码
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-a-quota
  namespace: tenant-a
spec:
  hard:
    requests.cpu: "20"
    requests.memory: 64Gi
    limits.cpu: "40"
    limits.memory: 128Gi
EOF

限制单个 Pod 的资源范围:

bash 复制代码
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: LimitRange
metadata:
  name: tenant-a-limits
  namespace: tenant-a
spec:
  limits:
  - default:
      cpu: 2
      memory: 4Gi
    defaultRequest:
      cpu: 500m
      memory: 1Gi
    type: Container
EOF

七、调度与资源策略调优

7.1 kube-scheduler 调优

自定义调度策略可通过定义 Policy:

json 复制代码
{
  "kind": "Policy",
  "apiVersion": "v1",
  "predicates": [
    {"name": "PodFitsResources"},
    {"name": "NoDiskConflict"}
  ],
  "priorities": [
    {"name": "LeastRequestedPriority", "weight": 1},
    {"name": "BalancedResourceAllocation", "weight": 2}
  ]
}

将该策略传给 kube-scheduler:

bash 复制代码
kube-scheduler --config=/etc/kubernetes/scheduler-config.json

7.2 节点 Taints & Tolerations

为关键负载节点加 taint:

bash 复制代码
kubectl taint nodes worker01 critical=true:NoSchedule

只有带 tolerations 的 Pods 可以调度:

yaml 复制代码
tolerations:
- key: "critical"
  operator: "Equal"
  value: "true"
  effect: "NoSchedule"

八、监控与告警

8.1 部署 Prometheus Operator

使用 Helm 安装:

bash 复制代码
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace

8.2 多租户视图配置

通过 Grafana Dashboard 区分不同命名空间指标:

Dashboard 说明
CPU/Memory per Namespace 按租户隔离视图显示
Pod QoS 不同 QoS 类别统计
Node Health 节点负载与可用性

可通过 Grafana 的变量 namespace 实现动态切换。


九、容量评估与性能对比

以下是对比启用与未启用资源控制的效果:

指标 未启用 ResourceQuota 启用 ResourceQuota
单租户最大 CPU 占用 无限制 40 核
内存突增保护 128 Gi 限制
多租户公平性
OOM Event 数

十、常见故障与排查

故障现象 原因定位 解决方法
Pod 创建失败:QuotaExceeded 没有足够资源配额 调整 ResourceQuota 或优化资源请求
调度失败:NoNodesAvailable 节点资源不足 扩容节点组
网络策略阻断 CNI 策略误配置 查看 NetworkPolicy 并调整

十一、总结

A5数据通过上述配置,我们在 Ubuntu 20.04 上搭建了一个具备以下能力的 Kubernetes 多租户高可用集群:

  • 多 Control Plane 高可用架构
  • 多租户 Namespace 隔离 + RBAC 权限控制
  • ResourceQuota + LimitRange 保证租户资源分配公平
  • Prometheus + Grafana 实现租户级别监控与告警
  • 调度策略与节点标记实现关键任务优先级调度

A5数据的这个方案适用于云原生平台托管、SaaS 多租户服务、企业内部 PaaS 平台 等生产级 Kubernetes 场景。后续可结合 Kubernetes 1.28+ 特性(如 Topology Manager、Pod Overhead)进一步优化资源分配策略。

相关推荐
石头5302 小时前
Service 详解
linux
小鸡脚来咯2 小时前
Linux 服务器问题排查指南(面试标准回答)
linux·服务器·面试
末日汐2 小时前
磁盘与文件系统
linux·运维·数据库
爱吃大芒果2 小时前
openJiuwen(Windows端)大模型添加及AI Agent创建教程
人工智能·ubuntu·openjiuwen
水天需0102 小时前
Linux PS4 环境变量详解
linux
小新ya2 小时前
vscode增删改查文件,一直等待中...
linux·vscode
济6173 小时前
linux(第十四期)--官方 SDK 移植实验-- Ubuntu20.04
linux·运维·服务器
云qq3 小时前
x86操作系统23——进程相关系统调用
linux·c语言·汇编·ubuntu
小猪佩奇TONY3 小时前
Linux 内核学习(16) --- linux x86-64 虚拟地址空间和区域
linux·运维·学习