本文档风哥主要介绍Linux系统大规模Kubernetes成本优化与资源管理,包括K8s资源管理基础概念、成本优化基础概念、资源类型介绍、资源请求与限制配置、水平自动扩缩容配置、节点选择与调度以及实战案例等内容,风哥教程参考Kubernetes官方文档、Linux官方文档System administration等内容,适合系统管理员在生产环境中使用。
Part01-基础概念与理论知识
1.1 K8s资源管理基础概念
Kubernetes资源管理是确保集群资源有效利用的重要组成部分。Kubernetes资源管理主要包括:
from PG视频:www.itpux.com
- 资源请求(Resource Requests):Pod对资源的最小需求,用于调度决策
- 资源限制(Resource Limits):Pod对资源的最大使用限制,防止资源滥用
- 资源配额(Resource Quotas):命名空间级别的资源限制,防止单个命名空间占用过多资源
- 限制范围(Limit Ranges):命名空间级别的默认资源限制,为未指定资源的Pod设置默认值
- 合理设置资源请求:确保Pod能够获得足够的资源
- 设置资源限制:防止Pod滥用资源,影响其他Pod
- 使用资源配额:防止单个命名空间占用过多资源
- 自动扩缩容:根据负载自动调整Pod数量
- 节点选择:将Pod调度到合适的节点上
1.2 成本优化基础概念
Kubernetes成本优化是在保证应用性能的前提下,减少集群运行成本的过程。成本优化主要包括:
- 资源优化:合理使用CPU、内存等资源,避免资源浪费
- 节点优化:选择合适的节点类型,避免过度配置
- 存储优化:选择合适的存储类型,减少存储成本
- 自动扩缩容:根据负载自动调整资源,避免资源闲置
- 集群管理:合理管理集群规模,避免不必要的节点
1.3 资源类型介绍
Kubernetes中的资源类型主要包括:
– CPU:计算资源,以毫核(m)为单位,1核=1000m
– 内存:存储资源,以字节为单位,支持Ki、Mi、Gi等单位
– 存储:持久化存储资源,如PV、PVC
– 网络:网络带宽资源
# 资源使用情况
– 已请求资源(Requested):Pod请求的资源总量
– 已限制资源(Limited):Pod限制的资源总量
– 实际使用资源(Used):Pod实际使用的资源量
– 可分配资源(Allocatable):节点可分配的资源总量
– 已分配资源(Allocated):节点已分配的资源总量
Part02-生产环境规划与建议
2.1 资源规划
生产环境资源规划要点:
– 应用资源需求分析:分析应用的CPU、内存、存储需求
– 峰值负载分析:分析应用的峰值负载,确保资源足够
– 资源预留:为系统组件和突发负载预留资源
– 资源隔离:将不同类型的应用部署在不同的节点上
# 节点规划
– 节点类型选择:根据应用需求选择合适的节点类型
– 节点规模:根据应用数量和资源需求确定节点数量
– 节点分布:跨可用区部署,提高可靠性
– 节点生命周期:定期更新和维护节点
# 存储规划
– 存储类型选择:根据应用需求选择合适的存储类型
– 存储容量:根据数据量和增长预期确定存储容量
– 存储性能:根据I/O需求选择合适的存储性能级别
– 存储备份:定期备份存储数据,确保数据安全
2.2 成本优化策略
生产环境成本优化策略要点:
– 资源利用率优化:提高资源利用率,减少资源浪费
– 节点类型优化:选择性价比高的节点类型
– 自动扩缩容:根据负载自动调整资源,避免资源闲置
– 存储优化:选择合适的存储类型,减少存储成本
– 集群管理:合理管理集群规模,避免不必要的节点
# 云环境成本优化
– 预留实例:使用预留实例减少计算成本
– Spot实例:使用Spot实例处理非关键工作负载
– 自动关机:非工作时间自动关机,减少成本
– 资源标签:使用标签管理资源,便于成本分析
# 本地环境成本优化
– 硬件选型:选择性价比高的硬件
– 能源管理:优化能源使用,减少能源成本
– 资源共享:多个应用共享节点资源,提高利用率
– 虚拟化:使用虚拟化技术提高硬件利用率
2.3 资源分配方案
生产环境资源分配方案要点:
– 核心应用:分配足够的资源,确保性能
– 非核心应用:根据需求分配资源,避免过度配置
– 批处理任务:使用Spot实例或低优先级节点
– 开发测试:使用较小的节点,减少成本
# 资源分配比例
– CPU:根据应用的计算需求分配
– 内存:根据应用的内存需求分配
– 存储:根据数据量和I/O需求分配
– 网络:根据网络流量需求分配
# 资源监控与调整
– 监控资源使用情况:实时监控资源使用情况
– 分析资源使用趋势:分析资源使用趋势,预测需求
– 调整资源分配:根据监控结果调整资源分配
– 优化资源配置:优化Pod的资源配置,提高利用率
Part03-生产环境项目实施方案
3.1 资源请求与限制配置
3.1.1 配置资源请求与限制
$ kubectl apply -f – << EOF apiVersion: v1 kind: Pod metadata: name: nginx namespace: default spec: containers: - name: nginx image: nginx resources: requests: cpu: "100m" memory: "256Mi" limits: cpu: "500m" memory: "512Mi" ports: - containerPort: 80 EOF # 查看Pod资源配置 $ kubectl get pod nginx -o yaml | grep -A 20 resources resources: limits: cpu: 500m memory: 512Mi requests: cpu: 100m memory: 256Mi # 配置命名空间资源配额 $ kubectl apply -f - << EOF apiVersion: v1 kind: ResourceQuota metadata: name: default-quota namespace: default spec: hard: requests.cpu: "4" requests.memory: "8Gi" limits.cpu: "8" limits.学习交流加群风哥QQ113257174memory: "16Gi" pods: "10" services: "10" EOF # 查看资源配额 $ kubectl get resourcequota NAME AGE REQUEST LIMIT default-quota 5m requests.cpu: 100m/4, requests.memory: 256Mi/8Gi limits.cpu: 500m/8, limits.memory: 512Mi/16Gi
3.2 水平自动扩缩容配置
3.2.1 配置HPA
$ kubectl apply -f – << EOF apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx resources: requests: cpu: "100m" memory: "256Mi" limits: cpu: "500m" memory: "512Mi" ports: - containerPort: 80 EOF # 暴露服务 $ kubectl expose deployment nginx --port=80 --type=ClusterIP # 配置HPA $ kubectl autoscale deployment nginx --cpu-percent=50 --min=3 --max=10 # 查看HPA状态 $ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx Deployment/nginx 0%/50% 3 10 3 5m # 测试HPA # 增加负载 $ kubectl run load-generator --image=busybox --command -- sh -c "while true; do wget -q -O- http://nginx; done" # 查看HPA状态 $ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx Deployment/nginx 80%/50% 3 10 6 10m
3.3 节点选择与调度
3.3.1 配置节点选择
$ kubectl label nodes worker1 node-type=high-performance
$ kubectl label nodes worker2 node-type=standard
$ kubectl label nodes worker3 node-type=low-cost
# 查看节点标签
$ kubectl get nodes –show-labels
NAME STATUS ROLES AGE VERSION LABELS
master1 Ready control-plane 20m v1.27.0 node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
worker1 Ready
worker2 Ready
worker3 Ready
# 配置Pod节点选择
$ kubectl apply -f – << EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-high-performance
namespace: default
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: "1"
memory: "2Gi"
limits:
cpu: "2"
memory: "4Gi"
ports:
- containerPort: 80
nodeSelector:
node-type: high-performance
EOF
# 查看Pod调度情况
$ kubectl get pod nginx-high-performance -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-high-performance 1/1 Running 0 5m 10.244.1.2 worker1
Part04-生产案例与实战讲解
4.1 资源优化案例
4.1.1 企业级资源优化
# 环境:5节点K8s集群
# 目标:优化资源配置,提高资源利用率
# 1. 分析资源使用情况
$ kubectl top pods –all-namespaces
NAMESPACE NAME CPU(cores) MEMORY(bytes)
default nginx-6799fc88d8-2q4x2 10m 30Mi
default nginx-6799fc88d8-5b678 12m 32Mi
default nginx-6799fc88d8-7c89d 11m 31Mi
# 2. 优化资源配置
$ kubectl apply -f – << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: "50m"
memory: "100Mi"
limits:
cpu: "200m"
memory: "200Mi"
ports:
- containerPort: 80
EOF
# 3. 查看优化后的资源使用情况
$ kubectl top pods --all-namespaces
NAMESPACE NAME CPU(cores) MEMORY(bytes)
default nginx-54d4d5c678-2q4x2 8m 25Mi
default nginx-54d4d5c678-5b678 9m 26Mi
default nginx-54d4d5c678-7c89d 10m 27Mi
# 4. 配置资源配额
$ kubectl apply -f - << EOF
apiVersion: v1
kind: ResourceQuota
metadata:
name: default-quota
namespace: default
spec:
hard:
requests.cpu: "2"
requests.memory: "4Gi"
limits.cpu: "4"
limits.学习交流加群风哥微信: itpux-commemory: "8Gi"
pods: "20"
services: "10"
EOF
4.2 成本优化案例
4.2.1 企业级成本优化
# 环境:10节点K8s集群
# 目标:优化成本,减少集群运行费用
# 1. 分析节点使用情况
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 30d v1.27.0
master2 Ready control-plane 30d v1.27.0
master3 Ready control-plane 30d v1.27.0
worker1 Ready
worker2 Ready
worker3 Ready
worker4 Ready
worker5 Ready
worker6 Ready
worker7 Ready
# 2. 分析资源使用情况
$ kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master1 100m 5% 1.5Gi 19%
master2 110m 5% 1.6Gi 20%
master3 90m 4% 1.4Gi 18%
worker1 200m 10% 3Gi 38%
worker2 150m 7% 2.5Gi 31%
worker3 180m 9% 2.8Gi 35%
worker4 120m 6% 2.2Gi 28%
worker5 100m 5% 2Gi 25%
worker6 80m 4% 1.8Gi 23%
worker7 70m 3% 1.6Gi 20%
# 3. 优化节点数量
# 发现worker6和worker7资源利用率较低,考虑缩容
$ kubectl drain worker6 –ignore-daemonsets
$ kubectl drain worker7 –ignore-daemonsets
$ kubectl delete node worker6 worker7
# 4. 配置自动扩缩容
$ kubectl apply -f – << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
namespace: default
spec:
replicas: 5
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: nginx
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
ports:
- containerPort: 80
EOF
$ kubectl autoscale deployment web-app --cpu-percent=50 --min=5 --max=20
# 5. 查看成本优化效果
# 节点数量从10减少到8,预计每月节省20%的成本
4.3 自动扩缩容案例
4.3.1 企业级自动扩缩容
# 环境:5节点K8s集群
# 目标:配置自动扩缩容,根据负载自动调整资源
# 1. 部署应用
$ kubectl apply -f – << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: api-server
template:
metadata:
labels:
app: api-server
spec:
containers:
- name: api-server
image: nginx
resources:
requests:
cpu: "200m"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"
ports:
- containerPort: 80
EOF
# 2. 配置HPA
$ kubectl autoscale deployment api-server --cpu-percent=60 --min=3 --max=10
# 3. 配置集群自动扩缩容
$ kubectl apply -f - << EOF
apiVersion: cluster.k8s.io/v1alpha1
kind: ClusterAutoscaler
metadata:
name: cluster-autoscaler
namespace: kube-system
spec:
scaleDown:
enabled: true
delayAfterAdd: 10m
delayAfterDelete: 5m
delayAfterFailure: 3m
utilizationThreshold: 0.5
minSize: 3
maxSize: 10
nodes:
- name: worker1
minSize: 1
maxSize: 3
- name: worker2
minSize: 1
maxSize: 3
- name: worker3
minSize: 1
maxSize: 4
EOF
# 4. 测试自动扩缩容
# 增加负载
$ kubectl run load-generator --image=busybox --command -- sh -c "while true; do wget -q -O- http://api-server; done"
# 查看HPA状态
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
api-server Deployment/api-server 70%/60% 3 10 5 10m
# 查看集群自动扩缩容状态
$ kubectl get pods -n kube-system | grep cluster-autoscaler
cluster-autoscaler-7d75c484b5-8x8x8 1/1 Running 0 5m
Part05-风哥经验总结与分享
5.1 K8s成本优化与资源管理最佳实践
Kubernetes成本优化与资源管理最佳实践:
- 合理设置资源请求和限制:根据应用需求设置适当的资源请求和限制,避免资源浪费
- 使用自动扩缩容:配置HPA和集群自动扩缩容,更多视频教程www.fgedu.net.cn根据负载自动调整资源
- 优化节点选择:将应用调度到合适的节点上,提高资源利用率
- 使用资源配额:为命名空间设置资源配额,防止单个命名空间占用过多资源
- 定期分析资源使用情况:定期分析资源使用情况,调整资源配置
- 选择合适的节点类型:根据应用需求选择合适的节点类型,提高性价比
- 优化存储配置:选择合适的存储类型,减少存储成本
- 定期清理无用资源:清理无用的Pod、Service和ConfigMap等资源,释放资源
5.2 常见问题与解决方案
## 1. 资源使用过高
– 原因:应用配置不当、资源泄漏、负载过高
– 解决方案:优化应用配置、修复资源泄漏、增加资源或使用自动扩缩容
## 2. 资源使用过低
– 原因:资源配置过大、应用负载不足
– 解决方案:调整资源配置、减少节点数量、使用自动扩缩容
## 3. 自动扩缩容不生效
– 原因:监控数据不准确、扩缩容参数设置不当
– 解决方案:检查监控数据、调整扩缩容参数、确保HPA正常工作
## 4. 节点资源不足
– 原因:节点配置过低、应用资源需求过高
– 解决方案:增加节点、升级节点配置、优化应用资源需求
## 5. 成本过高
– 原因:节点数量过多、节点配置过高、资源利用率低
– 解决方案:减少节点数量、选择合适的节点类型、提高资源利用率
5.3 性能调优建议
风哥针对
Kubernetes成本优化与资源管理性能调优建议:
- 优化Pod资源配置:根据应用实际需求调整CPU和内存配置,提高资源利用率
- 使用节点亲和性:将相关应用调度到同一节点,减少网络延迟
- 使用Pod反亲和性:将同一应用的不同副本调度到不同节点,提高可用性
- 优化存储配置:使用本地存储或高速存储,提高I/O性能
- 使用缓存:为频繁访问的数据使用缓存,减少数据库负载
- 优化网络配置:使用高性能网络插件,提高网络性能
- 监控与分析:使用Prometheus和Grafana监控资源使用情况,分析瓶颈
- 定期维护:定期清理无用资源,更新集群版本,保持系统性能
风哥提示:
风哥提示:
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
