Kubernetes 相关问题与解答

1. K8s 集群规模描述

问题: 描述K8s集群的机器数量和节点配置。

解答:

  • 节点数量: 50个节点
  • 配置: 每个节点16核CPU,32GB内存
  • 角色划分: 3个Master节点和47个Worker节点
  • Pod数量: 超过500个

2. K8s 集群资源分配率和使用率

问题: 如何计算K8s集群中的资源分配率和使用率?

解答:

计算资源

CPU

分配率通过已分配给所有容器的 CPU 总量与集群总 CPU 容量的比值来计算。比如,如果集群总 CPU 容量为 100 核,而所有容器总共被分配了 60 核的 CPU 资源,那么 CPU 分配率为 60%。

使用率通过实际使用的 CPU 资源量除以已分配的 CPU 资源量来计算。如果已分配 60 核 CPU 资源,实际使用了 40 核,那么 CPU 使用率为 40/60 ≈ 66.7%。

内存

分配率是已分配给容器的内存总量与集群总内存容量的比值。比如集群总内存为 100GB,已分配给容器的内存为 70GB,那么内存分配率为 70%。

使用率是实际使用的内存量除以已分配的内存量。若已分配 70GB 内存,实际使用了 50GB,则内存使用率为 50/70 ≈ 71.4%。

存储(PV、PVC)

持久化存储(PV、PVC)

分配率通过已分配的持久化存储容量与集群总持久化存储容量的比值来计算。比如,集群总持久化存储为 1000TB,已分配的存储为 400TB,那么分配率为 40%。

使用率通过实际使用的存储量除以已分配的存储量。如果已分配 400TB 存储,实际使用了 300TB,则使用率为 300/400 = 75%。

监控措施

  • 使用Prometheus和Grafana进行实时监控
  • 定期评估和规划资源需求
  • 应用资源配额和限制
  • 回收或重新分配长期闲置的资源

3. Kubelet组件优化

问题: 在安装K8s集群时,对Kubelet组件进行了哪些参数优化?

解答:

  • 系统资源预留:--kube-reserved, --system-reserved
  • 性能优化:镜像拉取优化(--serialize-image-pulls=false)
  • Cgroup驱动设置
  • 日志管理:轮转和大小限制
  • 健康检查和资源驱逐策略
  • 安全策略:禁用匿名认证,配置授权模式为RBAC

4. 节点默认Pod上限数

问题: 节点上默认允许的最大Pod数量是多少?如何调整?

解答:

  • 默认最大Pod数量: 110
  • 调整方法:通过修改kubelet启动命令中的--max-pods参数,并重启kubelet服务生效

5. 节点资源利用率高导致的问题及解决方案

问题: 当节点上的Pod数量导致资源利用率极高,可能引起Pod被驱逐或系统宕机,如何解决?

解答:

  • 使用监控工具如Prometheus和Grafana设置告警机制
  • 合理配置Pod的资源请求和限制
  • 利用亲和性和反亲和性规则平衡负载
  • 应用污点和容忍度控制调度
  • 预留节点资源给系统守护进程

6. Deployment YAML 文件编写优化

问题: 编写Deployment YAML文件时有哪些优化建议?

解答:

  • 设置合理的资源请求和限制
  • 配置健康检查(livenessProbe, readinessProbe)
  • 使用亲和性和反亲和性规则优化部署
  • 应用安全性设置(securityContext)
  • 使用ConfigMap和Secret管理环境变量而非硬编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
httpGet:
path: /readyz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
imagePullSecrets:
- name: imageregsecret