1. 首页 > Linux教程 > 正文

Linux教程FG478-Kubernetes成本优化

内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。

本文档

风哥提示:

介绍Kubernetes成本优化实战案例。

Part01-资源使用分析

1.更多视频教程www.fgedu.net.cn1 安装成本分析工具

# 安装kube-cost
[root@k8s-master ~]# helm repo add cost-analyzer https://kubecost.github.io/cost-analyzer/
“cost-analyzer” has been added to your repositories

[root@k8s-master ~]# helm install kubecost cost-analyzer/cost-analyzer –namespace kubecost –create-namespace
NAME: kubecost
LAST DEPLOYED: Sat Apr 4 23:00:00 2026
NAMESPACE: kubecost
STATUS: deployed

# 查看部署状态
[root@k8s-master ~]# kubectl get pods -n kubecost
NAME READY STATUS RESTARTS AGE
kubecost-cost-analyzer-abc12-xyz789 1/1 Running 0 5m
kubecost-grafana-abc12-xyz789 1/1 Running 0 5m
kubecost-prometheus-server-abc12 1/1 Running 0 5m

# 访问成本分析界面
[root@k8s-master ~]# kubectl port-forward -n kubecost svc/kubecost-cost-analyzer 9090:80 &
Forwarding from 127.0.0.1:9090 -> 9090

# 查看资源使用情况
[root@k8s-master ~]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 500m 25% 2Gi 25%
k8s-node1 800m 20% 4Gi 25%
k8s-node2 600m 15% 3Gi 18%

[root@k8s-master ~]# kubectl top pods -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system coredns-abc12-xyz789 10m 30Mi
kube-system etcd-k8s-master 50m 100Mi
fgedu-prod fgedu-app-abc12-xyz789 50m 128Mi

Part02-资源优化

2.1 资源配置优化

# 分析资源使用率
[root@k8s-master ~]# cat > resource-analysis.sh << 'EOF' #!/bin/bash # resource-analysis.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn echo "=== Kubernetes资源使用分析 ===" echo "" echo "1. 低使用率Pod(请求>实际使用2倍)”
echo “—————————————-”
kubectl top pods -A –no-headers | while read ns pod cpu mem; do
request_cpu=$(kubectl get pod -n $ns $pod -o jsonpath='{.spec.containers[0].resources.requests.cpu}’ 2>/dev/null)
if [ -n “$request_cpu” ]; then
echo “$ns/$pod: CPU请求=$request_cpu, 实际=$cpu”
fi
done

echo “”
echo “2. 无资源限制的Pod”
echo “—————————————-”
kubectl get pods -A -o json | jq -r ‘.items[] | select(.spec.containers[].resources.limits == null) | “\(.metadata.namespace)/\(.metadata.name)”‘ | head -10

echo “”
echo “3. 资源请求vs限制对比”
echo “—————————————-”
kubectl get pods -A -o custom-columns=’NAMESPACE:.metadata.namespace,NAME:.metadata.name,CPU_学习交流加群风哥QQ113257174REQ:.spec.containers[0].resources.requests.cpu,CPU_LIM:.spec.containers[0].resources.limits.cpu,MEM_REQ:.spec.containers[0].resources.requests.memory,MEM_LIM:.spec.containers[0].resources.limits.memory’ | head -20
EOF

[root@k8s-master ~]# chmod +x resource-analysis.sh
[root@k8s-master ~]# ./resource-analysis.sh
=== Kubernetes资源使用分析 ===

1. 低使用率Pod(请求>实际使用2倍)
—————————————-
fgedu-prod/fgedu-app-abc12: CPU请求=500m, 实际=50m

2. 无资源限制的Pod
—————————————-
default/test-pod

3. 资源请求vs限制对比
—————————————-
NAMESPACE NAME CPU_REQ CPU_LIM MEM_REQ MEM_LIM
fgedu-prod fgedu-app-abc12 500m 1000m 512Mi 1Gi
fgedu-prod fgedu-app-def34 500m 1000m 512Mi 1Gi

# 优化资源配置
[root@k8s-master ~]# cat > fgedu-optimized-resources.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-app namespace: fgedu-prod spec: replicas: 3 selector: matchLabels: app: fgedu-app template: metadata: labels: app: fgedu-app spe更多学习教程公众号风哥教程itpux_comc: containers: - name: app image: nginx:1.25 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi EOF [root@k8s-master ~]# kubectl apply -f fgedu-optimized-resources.yaml deployment.apps/fgedu-app configured

Part03-集群自动伸缩

3.1 Cluster Autoscaler

# 部署Cluster Autoscaler
[root@k8s-master ~]# cat > cluster-autoscaler.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: cluster-autoscaler namespace: kube-system spec: replicas: 1 selector: matchLabels: app: cluster-autoscaler template: metadata: labels: app: cluster-autoscaler spec: containers: - namefrom PG视频:www.itpux.com: cluster-autoscaler image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.28.0 command: - ./cluster-autoscaler - --v=4 - --stderrthreshold=info - --cloud-provider=aws - --skip-nodes-with-local-storage=false - --expander=least-waste - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/fgedu-cluster - --balance-similar-node-groups - --max-node-provision-time=15m resources: limits: cpu: 100m memory: 300Mi requests: cpu: 100m memory: 300Mi env: - name: AWS_REGION value: us-east-1 EOF [root@k8s-master ~]# kubectl apply -f cluster-autoscaler.yaml deployment.apps/cluster-autoscaler created # 配置节点自动伸缩组标签 # 在云平台配置节点组标签: # k8s.io/cluster-autoscaler/enabled=true # k8s.io/cluster-autoscaler/fgedu-cluster=owned # 查看自动伸缩状态 [root@k8s-master ~]# kubectl logs -n kube-system -l app=cluster-autoscaler | tail -10 I0423 23:00:00.000000 1 static_autoscaler.go:123] Cluster autoscaler initialized I0423 23:00:00.000000 1 static_autoscaler.go:456] Scale up: setting total target capacity for node group to 5

Part04-成本控制策略

4.1 实施成本控制

# 创建成本报告脚本
[root@k8s-master ~]# cat > /usr/local/bin/cost-report.sh << 'EOF' #!/bin/bash # cost-report.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn echo "=== Kubernetes成本报告 ===" echo "生成时间: $(date)" echo "" # 节点成本估算 echo "1. 节点资源成本" echo "----------------------------------------" kubectl get nodes -o custom-columns='NAME:.metadata.name,CPU:.status.capacity.cpu,MEMORY:.status.capacity.memory' | while read name cpu mem; do if [ "$name" != "NAME" ]; then # 假设: CPU $0.05/核/小时, 内存 $0.01/GB/小时 cpu_cost=$(echo "$cpu * 0.05 * 24 * 30" | bc) mem_gb=$(echo "$mem" | sed 's/Ki//' | awk '{print $1/1024/1024}') mem_cost=$(echo "$mem_gb * 0.01 * 24 * 30" | bc) total=$(echo "$cpu_cost + $mem_cost" | bc) echo "$name: 月成本约 \$${total}" fi done echo "" echo "2. 命名空间资源使用" echo "----------------------------------------" kubectl top pods -A --no-headers | awk '{ns[$1]+=$3; mem[$1]+=$4} END {for (n in ns) printf "%s: CPU=%dm, MEM=%dMi\n", n, ns[n], mem[n]}' echo "" echo "3. 闲置资源" echo "----------------------------------------" echo "未绑定PVC:" kubectl get pvc -A --no-headers | awk '$4!="Bound" {print $1"/"$2}' echo "" echo "孤立Pod(无控制器):" kubectl get pods -A -o json | jq -r '.items[] | select(.metadata.ownerReferences == null) | "\(.metadata.namespace)/\(.metadata.name)"' echo "" echo "4. 优化建议" echo "----------------------------------------" echo "- 检查并删除未使用的资源" echo "- 优化资源请求和限制配置" echo "- 使用Spot实例降低成本" echo "- 配置自动伸缩策略" EOF [root@k8s-master ~]# chmod +x /usr/local/bin/cost-report.sh # 执行成本报告 [root@k8s-master ~]# /usr/local/bin/cost-report.sh === Kubernetes成本报告 === 生成时间: Sat Apr 4 23:00:00 CST 2026 1. 节点资源成本 ---------------------------------------- k8s-master: 月成本约 $108 k8s-node1: 月成本约 $216 k8s-node2: 月成本约 $162 2. 命名空间资源使用 ---------------------------------------- fgedu-prod: CPU=150m, MEM=384Mi kube-system: CPU=100m, MEM=200Mi 3. 闲置资源 ---------------------------------------- 未绑定PVC: 孤立Pod(无控制器): default/test-pod 4. 优化建议 ---------------------------------------- - 检查并删除未使用的资源 - 优化资源请求和限制配置 - 使用Spot实例降低成本 - 配置自动伸缩策略 # 配置资源配额控制成本 [root@k8s-master ~]# cat > fgedu-cost-quota.yaml << 'EOF' apiVersion: v1 kind: ResourceQuota metadata: name: fgedu-cost-quota namespace: fgedu-prod spec: hard: requests.cpu: "4" requests.memory: 8Gi limits.cpu: "8" limits.memory: 16Gi pods: "20" EOF [root@k8s-master ~]# kubectl apply -f fgedu-cost-quota.yaml resourcequota/fgedu-cost-quota created
风哥针对成本优化建议:

  • 定期分析资源使用情况
  • 优化资源配置减少浪费
  • 使用自动伸缩降低成本
  • 清理闲置资源
  • 实施资源配额控制

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息