在企业级生产环境中,尤其是面向多业务线或多租户的场景下,高可用性、资源隔离与合理调度是 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)进一步优化资源分配策略。