如何优化Kubernetes的性能和资源利用率优化

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 根据业务实际需求可以添加或删除节点。如果我们的业务中有一段时间流量比较大可以考虑增加节点来增加集群的承载能力,等过了这段时间之后就可以减少节点了以节省成本

一、Kubernetes性能优化

1 集群节点规模优化

1.1 根据实际需求调整节点数量

根据业务实际需求可以添加或删除节点。如果我们的业务中有一段时间流量比较大可以考虑增加节点来增加集群的承载能力,等过了这段时间之后就可以减少节点了以节省成本

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3 # 可以根据需求设置Pod数量
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

1.2 考虑使用云服务提供商的扩展功能

云服务提供商为我们提供了一些自动扩展的功能,可以根据CPU、内存等指标来自动调整集群节点数量,从而避免手动操作的繁琐。例如阿里云的Auto Scaling会根据指标设定的阈值自动调整节点数量

2 优化容器镜像

2.1 使用轻量级基础镜像

使用轻量级的基础镜像可以减少应用启动时间和镜像大小提高性能

FROM alpine:3.13 # 使用轻量级的Alpine镜像作为基础镜像
RUN apk update \
    && apk add nginx \
    && rm -rf /var/cache/apk/*

2.2 最小化安装软件包

在镜像构建过程中只安装必要的软件包可以减小镜像的大小。在应用运行过程中,不要在容器内安装除必要软件包以外的其他软件包

3 资源限制和请求的设置

3.1 设置正确的请求和限制

为了避免一个Pod占用所有资源而导致其他Pod无法正常运行,我们可以设置资源请求和限制。其中请求表示Pod开始运行时所需的最低资源,限制表示Pod可以使用的最大资源。一般情况下请求和限制应该一致

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    resources:
      limits:
        cpu: "1" # 限制CPU使用量
        memory: "1Gi" # 限制内存使用量
      requests:
        cpu: "500m" # 请求CPU使用量
        memory: "500Mi" # 请求内存使用量

3.2 使用QoS策略进行负载均衡

QoS(Quality of Service)策略表示对Pod优先级的界定。在QoS策略中高优先级的Pod会优先获得资源,而低优先级的Pod则会受到限制。通过设置QoS策略,可以实现对资源的优先分配和合理利用实现负载均衡

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    resources:
      limits:
        cpu: "1"
        memory: "1Gi"
      requests:
        cpu: "500m"
        memory: "500Mi"
  priorityClassName: high # 设置Pod的优先级

二、 Kubernetes资源利用率优化

1 监测集群资源使用率

1.1 安装和配置监测工具

安装和配置监测工具可以帮助我们及时了解集群中各个节点和Pod的资源使用情况,有针对性地进行资源调配。

# 安装Prometheus和Grafana
helm install prometheus stable/prometheus
helm install grafana stable/grafana

1.2 监控集群资源使用

使用监测工具来监控集群资源使用情况与问题并及时调整容器规模或容器资源,让集群运行在最佳状态

2 节点资源管理

2.1 调整节点资源配额

调整节点资源配额可以帮助我们充分利用节点资源,更好地满足业务需求。可以通过Kubernetes提供的调整节点资源的API来达到这个目的

apiVersion: v1
kind: ResourceQuota
metadata:
  name: cluster-resource-quota
spec:
  hard:
    cpu: "8000m" # 设置CPU的总配额
    memory: 8Gi # 设置内存的总配额
    persistentvolumeclaims: "16" # 设置允许的总PVC数

2.2 确定节点互斥组和Pod亲和性

节点互斥组和Pod亲和性可以帮助我们更好地利用节点资源。通过调整节点互斥组和Pod亲和性可以实现资源更加均衡的分配

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3
  selector:matchLabels:
      app: nginx
  strategy: # 定义Pod调度策略
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        scheduler.alpha.kubernetes.io/affinity: >
          {
            "podAntiAffinity": {
              "requiredDuringSchedulingIgnoredDuringExecution": [{
                "labelSelector": {
                  "matchExpressions": [{
                    "key": "app",
                    "operator": "In",
                    "values": ["nginx"]
                  }]
                },
                "topologyKey": "kubernetes.io/hostname"
              }]
            }
          }
    spec:
      affinity: # 定义Pod亲和性规则
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values: [nginx]
            topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: nginx

3 应用资源管理

3.1 应用级别的缓存和数据库

实现应用级别的缓存和数据库可以减少对数据库的访问量从而减轻数据库的负担并提高性能

3.2 使用负载均衡器

使用负载均衡器可以避免单点故障,并实现负载均衡,从而提高应用的可靠性和性能。

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

三、小结

通过对Kubernetes集群资源利用率和性能进行优化,可以实现更加高效和可靠的业务运行。在进行优化时需要深入理解资源和性能的原理,并针对实际场景进行优化才能达到最佳效果。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3月前
|
Prometheus Kubernetes 监控
Kubernetes 性能调优与成本控制
【8月更文第29天】随着 Kubernetes 在企业中的广泛应用,如何有效地管理和优化 Kubernetes 集群的性能和成本成为了一个重要的课题。本篇文章将介绍 Kubernetes 性能监控的基础知识,以及一些实用的成本优化技巧,包括资源配额的设置、Pod 密度的提高和集群规模的合理调整。
274 1
|
1月前
|
JSON 运维 Kubernetes
|
25天前
|
存储 Kubernetes 监控
深度解析Kubernetes在微服务架构中的应用与优化
【10月更文挑战第18天】深度解析Kubernetes在微服务架构中的应用与优化
95 0
|
1月前
|
NoSQL 关系型数据库 Redis
高可用和性能:基于ACK部署Dify的最佳实践
本文介绍了基于阿里云容器服务ACK,部署高可用、可伸缩且具备高SLA的生产可用的Dify服务的详细解决方案。
|
3月前
|
存储 Kubernetes 数据中心
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
|
3月前
|
Kubernetes Cloud Native 应用服务中间件
Kubernetes 自动伸缩策略:优化资源利用率
【8月更文第29天】在现代云原生环境中,应用的流量往往具有不可预测性。为了应对这种变化,Kubernetes 提供了多种自动伸缩机制来动态调整应用实例的数量和每个实例分配的资源。本文将深入探讨两种主要的自动伸缩工具:水平 Pod 自动伸缩器 (HPA) 和垂直 Pod 伸缩器 (VPA),并提供实际的应用示例。
97 0
|
3月前
|
Prometheus Kubernetes 监控
在K8S中,DaemonSet类型的资源特性有哪些?
在K8S中,DaemonSet类型的资源特性有哪些?
|
3月前
|
存储 Kubernetes 监控
在K8S中,集群可以做哪些优化?
在K8S中,集群可以做哪些优化?
|
3月前
|
Kubernetes 安全 Linux
在K8S中,calico和cilium这两种cni有什么区别?cailico的ipip模型和ciliume的vxlan模型,两种不通模型性能也不同,它们怎么处理数据的?
在K8S中,calico和cilium这两种cni有什么区别?cailico的ipip模型和ciliume的vxlan模型,两种不通模型性能也不同,它们怎么处理数据的?
|
3月前
|
存储 Kubernetes 监控
在K8S中,ELK是如何实现及如何优化的ES?
在K8S中,ELK是如何实现及如何优化的ES?