如何在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)进一步优化资源分配策略。

相关推荐
嵩山小老虎1 天前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模1 天前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
a41324471 天前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
一只自律的鸡1 天前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
17(无规则自律)1 天前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考
!chen1 天前
linux服务器静默安装Oracle26ai
linux·运维·服务器
REDcker1 天前
Linux 文件描述符与 Socket 选项操作详解
linux·运维·网络
蒹葭玉树1 天前
【C++上岸】C++常见面试题目--操作系统篇(第二十八期)
linux·c++·面试
2501_927773071 天前
imx6驱动
linux·运维·服务器
hy____1231 天前
Linux_进程间通信
linux·运维·服务器