面试题答案
一键面试整体设计思路
- 识别关键业务Pod:通过标签(如
app=database
等)来标记数据库相关等关键业务Pod。 - 资源优先级划分:为关键业务Pod分配更高的资源优先级,在资源紧张时优先保障其资源需求。
- 普通业务Pod资源限制:限制普通业务Pod的资源使用量,避免其过度占用资源导致关键业务Pod资源不足。
- 动态调整:根据集群资源使用情况和业务负载变化,动态调整资源配额设置。
通过Kubernetes资源配额与限制机制实现
设置ResourceQuota
- 创建ResourceQuota对象:在每个Namespace下创建
ResourceQuota
对象。
apiVersion: v1
kind: ResourceQuota
metadata:
name: example-resource-quota
namespace: your-namespace
spec:
hard:
requests.cpu: "10" # 例如,总共允许请求10个CPU核心
requests.memory: 20Gi # 总共允许请求20GB内存
limits.cpu: "20" # 总共允许限制20个CPU核心
limits.memory: 40Gi # 总共允许限制40GB内存
- 区分关键与普通业务资源配额:可以通过标签选择器(Selector)来为不同类型Pod设置不同配额。但在
ResourceQuota
中不能直接基于标签设置不同配额,可结合LimitRange
间接实现。例如,先通过LimitRange
对不同标签Pod设置不同资源限制,然后ResourceQuota
限制整体资源使用量。
设置LimitRange
- 创建LimitRange对象:在每个Namespace下创建
LimitRange
对象。
apiVersion: v1
kind: LimitRange
metadata:
name: example-limit-range
namespace: your-namespace
spec:
limits:
- type: Pod
max:
cpu: "2"
memory: 4Gi
min:
cpu: "0.1"
memory: 100Mi
- type: Container
default:
cpu: "1"
memory: 2Gi
defaultRequest:
cpu: "0.5"
memory: 1Gi
max:
cpu: "2"
memory: 4Gi
min:
cpu: "0.1"
memory: 100Mi
- 为关键业务Pod设置更高资源限制:通过标签选择器设置不同规则。
apiVersion: v1
kind: LimitRange
metadata:
name: critical-limit-range
namespace: your-namespace
spec:
limits:
- type: Pod
max:
cpu: "4"
memory: 8Gi
min:
cpu: "0.5"
memory: 500Mi
selector:
app: database # 假设关键业务Pod标签为app=database
- type: Container
default:
cpu: "2"
memory: 4Gi
defaultRequest:
cpu: "1"
memory: 2Gi
max:
cpu: "4"
memory: 8Gi
min:
cpu: "0.5"
memory: 500Mi
selector:
app: database
这样通过 LimitRange
对不同标签的Pod和容器设置不同资源限制,再配合 ResourceQuota
限制整个Namespace的资源使用量,实现关键业务Pod优先获取资源,同时限制普通业务Pod资源使用。