CA 不够用了?Azure 推 Karpenter + Spot,让 AKS 便宜 80%!

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04 编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017) 阅读详情

引言

在 2023 年的 KubeCon 北美大会上,微软宣布在 Azure Kubernetes Service(AKS) 中引入 Karpenter 作为 Cluster Autoscaler(CA)的替代方案,并将其命名为 Node Autoprovisioning(NAP)。

虽然 Cluster Autoscaler 一直以来是 AKS/Kubernetes 的默认节点扩缩工具,但其存在诸多限制,促使微软引入 Karpenter。

本文将深入探讨这些挑战,并介绍 Karpenter 如何有效解决它们。

CA vs Karpenter vs CloudPilot AI

太长不看版

在这里插入图片描述

如果你想了解这几款工具的更多技术细节、查看 Karpenter 与 Cluster Autoscaler 的架构差异,回复关键词【对比】,获取完整版 PDF 文件。

Cluster Autoscaler 的局限性

以下是 Cluster Autoscaler 进行节点自动扩缩的流程示意图:

在这里插入图片描述

  1. 受限于虚拟机规模集( VMSS Groups ):

Cluster Autoscaler 仅支持 AKS 中的虚拟机规模集。

每个 VMSS 由特定类型的 VM 实例组成,具有固定的 VM SKU、硬件规格和 CPU:内存比(例如 Standard D4sv5,4 vCPU 和 16GB 内存)。

  1. 节点池约束:

当新 Pod 需要部署但当前节点容量已满时,Cluster Autoscaler 会尝试创建新的节点,但只能基于现有 VMSS SKU 进行扩容。如果该类型的实例不可用,Pod 将保持待调度状态。

  1. 扩缩能力受限:

Cluster Autoscaler 仅能基于指定的 VMSS 进行弹性扩缩,即使其他虚拟机 SKU 有闲置资源,也无法利用这些 VM SKU 的剩余容量。

Karpenter的优势

Karpenter 是一款开源的 Kubernetes 集群自动扩缩工具,专为优化性能和成本而设计,旨在以灵活、高性能和简洁的方式实现节点的弹性扩展。它比 Cluster Autoscaler 的扩缩速度更快,并且能够直接创建独立节点,无需传统的节点组限制。

在这里插入图片描述

Karpenter 的核心特性:

✅高效扩缩:快速弹性扩展 Kubernetes 节点。

✅灵活调度:无需依赖 VMSS 也能启动新节点。

✅成本优化:支持自动补丁更新和 Kubernetes 版本升级,降低总体成本。

✅基于 YAML 配置的 NodePool,可自定义节点类型及调度策略。

Karpenter 的中断管理

中断控制器 (Disruption Controller)负责在 Kubernetes 集群中终止或替换节点,并采用以下三种策略来决定如何处理节点:

1. 节点到期

Karpenter 会为节点设置存活时间(TTL),到期后进行替换。例如:

spec:
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: 300s  # 

2. 延迟合并

设置中断间隔,控制在触发中断操作前等待的时间。

3. 资源整合

Karpenter 通过分析节点资源使用情况来主动减少集群成本。

📌 支持的策略模式:

  • 无工作负载时:仅移除无 Pod 运行的节点。

  • 资源利用不足时:当节点资源利用率低时,尝试减少或替换节点。

示例:

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: ondemand
spec:
  disruption:
    consolidationPolicy: WhenEmpty
    consolidateAfter: 60s

在 AKS 上启用 Karpenter

启用 Karpenter 之前,需要满足以下前置条件:

✅ 安装 Az CLI 并更新至 0.5.17 以上版本

✅ 注册 NAP 预览功能

✅ AKS 需使用 Cilium + Overlay 作为网络配置

如果在 Karpenter 安装上有困难,欢迎尝试 Karpenter 的托管云服务 CloudPilot AI(www.cloudpilot.ai),仅需5分钟即可完成安装。

在现有 AKS 集群上启用 Karpenter

确保 AKS 集群启用了 Azure 网络插件,并使用 Cilium 作为网络策略。

关键参数:--node-provisioning-mode Auto,用于将 Karpenter 设为默认节点扩缩工具。

az aks update --name <aks-cluster-name> --resource-group <rg-name> --node-provisioning-mode Auto

创建新的 AKS 集群并启用 Karpenter

az aks create --name <aks-cluster-name> --resource-group <rg-name> \
  --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium

验证 Karpenter 是否已启用

kubectl api-resources | grep -e aksnodeclasses -e nodeclaims -e nodepools

返回结果示例:

aksnodeclasses      aksnc,aksncs      karpenter.azure.com/v1alpha2      false      AKSNodeClass
nodeclaims                               karpenter.sh/v1beta1             false      NodeClaim
nodepools                                karpenter.sh/v1beta1             false      NodePool

禁用 Cluster Autoscaler

如果希望从 Cluster Autoscaler 切换到 Karpenter,首先需要在 AKS 集群上禁用 Cluster Autoscaler:

az aks update --name <aks-cluster-name> --resource-group <rg-name> --disable-cluster-autoscaler

部署示例应用

为了观察节点自动扩缩的实际运行情况,可以部署一个示例应用:

osama [ ~ ]$ kubectl get nodes
NAME                                STATUS   ROLES   AGE     VERSION
aks-default-h2jxh                   Ready    agent   35m     v1.27.9
aks-nodepool1-41633911-vmss000000   Ready    agent   3d19h   v1.27.9

调整 Vote 应用副本数量以触发扩容事件

osama [ ~ ]$ kubectl scale deployment azure-vote-front --replicas=12 -n karpenter-demo-ns
^[[Adeployment.apps/azure-vote-front scaled
osama [ ~ ]$ kubectl scale deployment azure-vote-back --replicas=12 -n karpenter-demo-ns
deployment.apps/azure-vote-back scaled

使用以下 kubectl 命令检查 Karpenter 自动扩容情况

kubectl get events -A --field-selector source=karpenter --sort-by='.lastTimestamp' -n 10
NAMESPACE           LAST SEEN   TYPE     REASON                  OBJECT                                  MESSAGE
default             50m         Normal   Unconsolidatable        nodeclaim/default-95f54                 SpotToSpotConsolidation is disabled, can't replace a spot node with a spot node
default             50m         Normal   Unconsolidatable        node/aks-default-95f54                  SpotToSpotConsolidation is disabled, can't replace a spot node with a spot node
default             38m         Normal   DisruptionBlocked       nodepool/default                        No allowed disruptions due to blocking budget
default             5m33s       Normal   Unconsolidatable        nodeclaim/default-h2jxh                 Can't remove without creating 2 candidates
default             5m33s       Normal   Unconsolidatable        node/aks-default-h2jxh                  Can't remove without creating 2 candidates
default             2m12s       Normal   DisruptionBlocked       nodepool/system-surge                   No allowed disruptions due to blocking budget
karpenter-demo-ns   63s         Normal   Nominated               pod/azure-vote-front-6855444955-bnq7p   Pod should schedule on: nodeclaim/default-mrh7w
karpenter-demo-ns   63s         Normal   Nominated               pod/azure-vote-front-6855444955-gbwk6   Pod should schedule on: nodeclaim/default-mrh7w
karpenter-demo-ns   63s         Normal   Nominated               pod/azure-vote-front-6855444955-l2bgj   Pod should schedule on: nodeclaim/default-mrh7w
karpenter-demo-ns   63s         Normal   Nominated               pod/azure-vote-front-6855444955-nvc56   Pod should schedule on: nodeclaim/default-mrh7w
karpenter-demo-ns   63s         Normal   Nominated               pod/azure-vote-front-6855444955-22glj   Pod should schedule on: nodeclaim/default-mrh7w
karpenter-demo-ns   63s         Normal   Nominated               pod/azure-vote-front-6855444955-sxdl6   Pod should schedule on: nodeclaim/default-mrh7w
karpenter-demo-ns   63s         Normal   Nominated               pod/azure-vote-front-6855444955-t69w4   Pod should schedule on: nodeclaim/default-mrh7w

自定义 Karpenter 配置

Karpenter 在 Kubernetes 中引入了一种新的资源类型:NodePool,用于管理和优化节点调度。

  • 自定义 NodePools:指定特定的 VM 系列、VM 家族,或自定义 CPU 与内存比例。

  • 基于特性选择节点:支持 GPU 加速或网络加速等功能。

  • 定义 CPU 架构:根据特定工作负载需求,选择 ARM 或 AMD 架构。

  • 构建高可用节点架构:通过配置可用区拓扑提高容灾能力。

  • 限制节点级别的 CPU 和内存使用:控制单个节点可分配的 CPU 和内存资源。

以下是 Karpenter 默认的 NodePool 配置 YAML,其中包含:

  • 节点 SKU 类型和容量配置

  • CPU:内存比例限制

  • 在多个 NodePools 存在时的调度权重(Weight)

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: 10s
  template:
    spec:
      nodeClassRef:
        name: default

      # Requirements that constrain the parameters of provisioned nodes.
      # These requirements are combined with pod.spec.affinity.nodeAffinity rules.
      # Operators { In, NotIn, Exists, DoesNotExist, Gt, and Lt } are supported.
      # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#operators
      requirements:
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: kubernetes.io/os
        operator: In
        values:
        - linux
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - ondemand
      - key: karpenter.azure.com/sku-family
        operator: In
        values:
        - E
        - D
      - key: karpenter.azure.com/sku-name
        operator: In
        values:
        - Standard_E2s_v5
        - Standard_D4s_v3
limits:
  cpu: "1000"
  memory: 1000Gi
weight: 100

使用 Spot 节点与 Karpenter

  • 在 AKS-Vote 示例应用中添加 Toleration(如 "karpenter.sh/disruption:NoSchedule"),该 Toleration 在 AKS 集群预配 Spot 节点时默认存在。

  • 请参考我的 GitHub 仓库,获取应用的 YAML 配置和示例 NodePool 配置。(https://github.com/Osshaikh/Karpenter-AKS-Spot)

spec:
      nodeSelector:
        "kubernetes.io/os": linux
      tolerations:
      - key: "kubernetes.azure.com/scalesetpriority"
        operator: "Equal"
        value: "spot"
        effect: "NoSchedule"
      containers:
      - name: azure-vote-front
        image: mcr.microsoft.com/azuredocs/azure-vote-front:v1
  • 缩减应用副本数量,以便 Karpenter 逐步驱逐现有的 On-Demand 节点,并用 Spot 节点替换:
osama [ ~/karpenter ]$ kubectl get nodes
NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-41633911-vmss000000   Ready    agent   3d21h   v1.27.9
aks-nodepool1-41633911-vmss00000b   Ready    agent   24m     v1.27.9

osama [ ~/karpenter ]$ kubectl get pods -n karpenter-demo-ns -o wide
No resources found in karpenter-demo-ns namespace.

osama [ ~/karpenter ]$ kubectl scale deployment azure-vote-back --replicas=10 -n karpenter-demo-ns
deployment.apps/azure-vote-back scaled
osama [ ~/karpenter ]$ kubectl scale deployment azure-vote-front --replicas=10 -n karpenter-demo-ns
deployment.apps/azure-vote-front scaled
osama [ ~/karpenter ]$
  • 部署并扩展 Vote 应用副本,使 Karpenter 根据 NodePool 配置启动 Spot 节点,并在 Toleration 验证后将 Pod 调度到 Spot 节点上。

  • Karpenter 启动新的 Spot 节点,并将该节点指定用于调度 Vote 示例应用。

osama [ ~/karpenter ]$ kubectl get events -A --field-selector source=karpenter --sort-by='.lastTimestamp'
NAMESPACE           LAST SEEN   TYPE      REASON                       OBJECT                                    MESSAGE
karpenter-demo-ns   104s        Normal    Nominated                    pod/azure-vote-back-687ddb67bd-pz8sp      Pod should schedule on: nodeclaim/default-52gbg
karpenter-demo-ns   104s        Normal    Nominated                    pod/azure-vote-back-687ddb67bd-ckdcq      Pod should schedule on: nodeclaim/default-52gbg
karpenter-demo-ns   104s        Normal    Nominated                    pod/azure-vote-back-687ddb67bd-v9nqj      Pod should schedule on: nodeclaim/default-52gbg
karpenter-demo-ns   104s        Normal    Nominated                    pod/azure-vote-back-687ddb67bd-vswvs      Pod should schedule on: nodeclaim/default-52gbg
karpenter-demo-ns   104s        Normal    Nominated                    pod/azure-vote-back-687ddb67bd-lnxmp      Pod should schedule on: nodeclaim/default-52gbg
karpenter-demo-ns   104s        Normal    Nominated                    pod/azure-vote-back-687ddb67bd-jc2jz      Pod should schedule on: nodeclaim/default-52gbg
karpenter-demo-ns   104s        Normal    Nominated                    pod/azure-vote-back-687ddb67bd-hwnbh      Pod should schedule on: nodeclaim/default-52gbg
karpenter-demo-ns   104s        Normal    Nominated                    pod/azure-vote-back-687ddb67bd-r7msb      Pod should schedule on: nodeclaim/default-52gbg
karpenter-demo-ns   104s        Normal    Nominated                    pod/azure-vote-back-687ddb67bd-96lm9      Pod should schedule on: nodeclaim/default-52gbg
karpenter-demo-ns   104s        Normal    Nominated                    pod/azure-vote-back-687ddb67bd-5qcvk      Pod should schedule on: nodeclaim/default-52gbg
default             1s          Normal    DisruptionLaunching          nodeclaim/default-bkz6c                   Launching NodeClaim: Expiration/Replace
default             1s          Normal    DisruptionWaitingReadiness   nodeclaim/default-bkz6c                   Waiting on readiness to continue disruption
default             1s          Normal    DisruptionBlocked            nodepool/system-surge                     No allowed disruptions due to blocking budget
default             1s          Normal    DisruptionWaitingReadiness   nodeclaim/default-5vp7x                   Waiting on readiness to continue disruption
default             1s          Normal    DisruptionLaunching          nodeclaim/default-5vp7x                   Launching NodeClaim: Expiration/Replace

配置多个NodePools

  • 为 Spot 和 On-Demand 资源分别配置 NodePool:

使用 E 系列 VM(如 “Standard_E2s_v5”)的 Spot 节点和使用 D 系列 VM(如 “Standard_D4s_v5”)的 On-Demand 节点。

  • 设置 NodePool 的优先级

在多 NodePool 场景中,每个 NodePool 需要配置 Weight 属性,Karpenter 会优先选择权重最高的 NodePool 进行调度。

📌 在此配置中,Spot 节点的权重为 100,On-Demand 节点的权重为 60:

osama [ ~ ]$ kubectl get nodepool default -o yaml
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    budgets:
    - nodes: 100%
    consolidationPolicy: WhenUnderutilized
    expireAfter: 720h
  template:
    spec:
      nodeClassRef:
        name: default
      requirements:
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: kubernetes.io/os
        operator: In
        values:
        - linux
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - spot
      - key: karpenter.azure.com/sku-family
        operator: In
        values:
        - B
      - key: karpenter.azure.com/sku-name
        operator: In
        values:
        - Standard_B2s_v2
  weight: 100
  • 如果未指定具体的 SKU 名称,Karpenter 将默认考虑整个 VM 系列。

  • 要验证示例 VoteApp 是否运行在 Spot 节点上,请使用以下命令:

  • 输出结果应显示节点的容量类型为 “spot”:

osama [ ~ ]$ kubectl get pods -n karpenter-demo-ns -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP             NODE                NOMINATED NODE   READINESS GATES
azure-vote-back-687ddb67bd-w7ghm    1/1     Running   0          63m   10.244.3.11    aks-default-5cr5f   <none>           <none>
azure-vote-front-6855444955-64558   1/1     Running   0          63m   10.244.3.168   aks-default-5cr5f   <none>           <none>
osama [ ~ ]$ kubectl describe node aks-default-5cr5f | grep karpenter.sh
                    karpenter.sh/capacity-type=spot
                    karpenter.sh/initialized=true
                    karpenter.sh/nodepool=default
                    karpenter.sh/registered=true
                    karpenter.sh/nodepool-hash: 12393960163388511505
                    karpenter.sh/nodepool-hash-version: v2

模拟 Spot 节点驱逐

要测试 Spot 节点的驱逐情况,可以使用 Azure CLI 模拟 Spot 节点被回收:

osama [ ~ ]$ az vm simulate-eviction --resource-group MC_aks-lab_aks-karpenter_eastus --name aks-default-5cr5f
osama [ ~ ]$ date
Tue May 21 06:20:02 PM IST 2024
  • 使用以下 curl 命令监控 VoteApp 的可用性:
while true; do echo "$(date) $(curl -s -v -o /dev/null -w 'HTTP %{http_code}\n' http://voteapp.com 2>&1 | grep 'HTTP')"; sleep 2; done
  • 在运行 Spot 模拟驱逐后,现有节点将被标记为终止,Karpenter 将自动创建新的 Spot 节点来调度 VoteApp 的 Pods。 在不到一分钟内,VoteApp 应该会恢复运行,并开始返回 HTTP 200 状态码。
  root@MININT-8C81HDE:/home/osamaex while true; do echo "$(date) $(curl -s -v -o /dev/null -w 'HTTP %{http_code}\n' http://voteapp.com 2>&1 | grep 'HTTP')"; sleep 2; done
    Tue May 21 18:20:04 IST 2024 > GET / HTTP/1.1
    < HTTP/1.1 200 OK
    HTTP 200
    Tue May 21 18:20:07 IST 2024 > GET / HTTP/1.1
    < HTTP/1.1 200 OK
    HTTP 200
    Tue May 21 18:20:09 IST 2024 > GET / HTTP/1.1
    < HTTP/1.1 200 OK
    HTTP 200
    Tue May 21 18:20:12 IST 2024 HTTP 000  $Failure-Alert
    Tue May 21 18:21:14 IST 2024 > GET / HTTP/1.1
    < HTTP/1.1 200 OK                      $Successful-Response
    HTTP 200
    Tue May 21 18:22:58 IST 2024 > GET / HTTP/1.1
    < HTTP/1.1 200 OK
    HTTP 200
  • 查看 Karpenter 记录的事件日志:
       kubectl get events -A --field-selector source=karpenter --sort-by='.lastTimestamp'
  • Karpenter 记录的事件日志显示 Spot 节点被替换为 On-Demand 节点的过程:
  osama [ ~ ]$ 
    NAMESPACE           LAST SEEN   TYPE      REASON           OBJECT                                  MESSAGE
    default             23s         Warning   FailedDraining   node/aks-default-5cr5f                  Failed to drain node, 10 pods are waiting to be evicted
    karpenter-demo-ns   22s         Normal    Evicted          pod/azure-vote-back-687ddb67bd-w7ghm    Evicted pod
    karpenter-demo-ns   22s         Normal    Evicted          pod/azure-vote-front-6855444955-64558   Evicted pod
    karpenter-demo-ns   21s         Normal    Nominated        pod/azure-vote-back-687ddb67bd-tb2pv    Pod should schedule on: nodeclaim/default-6zkkl
    karpenter-demo-ns   21s         Normal    Nominated        pod/azure-vote-front-6855444955-7wzss   Pod should schedule on: nodeclaim/default-6zkkl
  • 验证 Pods 是否已运行在新的 Spot 节点上:
kubectl get pods -n karpenter-demo-ns -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP             NODE                NOMINATED NODE   READINESS GATES
azure-vote-back-687ddb67bd-tb2pv    1/1     Running   0          18m   10.244.2.103   aks-default-6zkkl   <none>           <none>
azure-vote-front-6855444955-7wzss   1/1     Running   0          18m   10.244.2.47    aks-default-6zkkl   <none>           <none>

通过使用预留实例节省成本

NodePool 配置允许您指定不同的 VM 系列以及多个 VM SKU。

您可以创建一个独立的 NodePool,设置最高权重,并通过karpenter.azure.com/sku-name或 karpenter.azure.com/sku-family 参数,指定所有预留实例的 VM SKU 家族或具体 SKU 名称。

 spec:
      nodeClassRef:
        name: default
      requirements:
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: kubernetes.io/os
        operator: In
        values:
        - linux
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - on-demand
      - key: karpenter.azure.com/sku-family
        operator: In
        values:
        - D
      - key: karpenter.azure.com/sku-name
        operator: In
        values:
        - [Standard_D2s_v3, Standard_D4s_v3, Standard_D8s_v3, Standard_D16s_v3, Standard_D32s_v3, Standard_D64s_v3, Standard_D96s_v3]
  weight: 90

结论

在 AKS 引入 Karpenter 标志着节点扩缩效率、灵活性和成本优化方面的一次重大升级。

Karpenter 克服了 Cluster Autoscaler 的局限性,引入了动态且快速的节点预置能力,为 Kubernetes 集群管理提供了更强大、更高效的解决方案。

Karpenter 在支持不同 VM 类型、提高扩缩能力以及优化成本方面展现出了极大的灵活性,使其成为 Kubernetes 集群管理的重要利器。

通过 Karpenter,企业可以实现更敏捷、更具成本效益的 Kubernetes 部署,提升集群的响应速度和资源利用率。

如果你正在寻找 Karpenter 的相关实践教程,关注「 CloudPilot AI 」,我们将持续带来更多干货💡

推荐阅读

弹性工具选Karpenter还是Cluster Autoscaler?看这篇就知道啦!

劲省85%云成本!在K8s上使用Karpenter私有部署DeepSeek-R1

机器学习推理成本减少45%!Ray+Karpenter 在科技初创公司的落地实践

七星棋牌顶级运营产品全开源修复版源码教程:6端支持,200+子游戏玩法,完整搭建指南(含代码解析) 让您从源码下载到本地运行一步到位!此外,文中还将附带详细代码解析与操作步骤,即便没有开发经验,也能轻松完成二开与定制。数据库是棋牌游戏中极为关键的组成部分,用于存储用户信息、乐豆余额、游戏记录、提现申请等数据。以下是部分核心数据表结构示例,便于存储用户信息与游戏记录。AI模块能够控制游戏中的胜率,常用于调节玩家体验。防沉迷功能旨在限制未成年人游戏时间。的完整搭建流程,特别适合。首先,获取七星棋牌源码。本教程将为您详细讲解。 阅读详情

相关推荐

安卓开发者必看:Win11最新Fastboot驱动安装避坑指南(含Android Bootloader Interface选择技巧)

本文为安卓开发者提供了Windows 11系统下Fastboot驱动安装的详细指南,特别针对Android Bootloader Interface选择技巧和多设备并发连接时的驱动冲突问题。通过解析Windows 11的特殊驱动验证机制,推荐使用Google官方USB驱动,并提供安装流程、版本选择建议及疑难问题排查方法,帮助开发者高效完成开发环境配置。

sea99的博客 1332

OSX-KVM虚拟机资源限制终极指南:防止过度占用物理资源的10个技巧

在虚拟化环境中运行macOS系统时,合理的资源分配是确保系统稳定性和性能的关键。OSX-KVM项目让你可以在QEMU/KVM上运行macOS系统,但如果不进行适当的资源限制,虚拟机可能会过度占用物理资源,影响主机系统的正常运行。本文将详细介绍如何有效管理OSX-KVM虚拟机的资源使用,确保你的虚拟化环境既高效又稳定。 ## 为什么需要资源限制? 虚拟机资源限制的主要目的是防止单个虚拟机占用过多

gitblog_00576的博客 933

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

【Azure 应用服务】App Service自动扩容时,如何避免新实例尚未就绪就接收流量(应用初始化篇)?

在Azure App Service启用自动扩容时,确保新实例完成初始化并健康就绪再接收流量至关重要。需采用无状态架构,避免依赖本地内存状态。通过配置ApplicationInitialization(Windows用IIS applicationInitialization,Linux设WEBSITE_WARMUP_PATH和WEBSITE_WARMUP_STATUSES),实现应用预热,提前完成组件、依赖与缓存初始化。结合健康检查(HealthCheck)验证就绪状态,配合预热实例(PrewarmedI

编码者卢布,国家认证程序员,十八年开发人员,目前生活在云环境。 121

Dify部署后访问报502?手把手教你排查和修复Nginx反向代理问题

本文针对Dify部署后常见的502 Bad Gateway错误,提供了从基础容器状态检查到Nginx配置与Docker网络诊断的完整排查流程。详细解析了错误本质,并给出动态服务发现修复与静态IP配置两种解决方案,帮助开发者彻底解决Nginx反向代理问题,确保Dify平台稳定访问。

rnn9storyteller的博客 1096

Neo4j:入门基础(二)之导入CSV文件

导入CSV文件的方式  主要的两种方式如下:   1、使用 Cypher 命令LOAD CSV,这种方式可以处理中小型数据(可达10 million条记录)   2、使用批量导入工具neo4j-admin ,用来直接导入大数据集 三、上述方式具体导入过程   1、Cypher 命令LOAD CSV 参数 1、USING PERIODIC COMMIT 300 使用批量提交,每满300条提交一次,防止内存溢出 2、WITH HEADERS 从文件中读取第一行作为参数名,...

Puzzle的博客 3万+

K8s弹性伸缩完整实战:HPA内置指标 + Prometheus自定义指标 + VPA垂直伸缩

Kubernetes弹性伸缩是生产环境保障服务稳定性、节约集群资源的核心能力。本文完整带你实操HPA基于CPU内存扩缩容、基于Prometheus QPS自定义指标实现伸缩,同时讲解VPA垂直Pod自动伸缩四种工作模式、部署踩坑与完整实验案例,理清水平扩容和垂直扩容适用业务场景。

Adhjhfes的博客 186

Windows 下 Hermes Agent(爱马仕)安装全记录:从零到一的保姆级图文教程

本文主要介绍了Windows 下 Hermes Agent(爱马仕) 安装全记录:从零到一的保姆级图文教程,希望能对学习使用 Hermes Agent 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装WSL环境 2.2 步骤二 安装Python环境 2.3 步骤三 安装Hermes Agent 2.4 步骤四 修正 API Key 错误 2.5 步骤五 配置多个模型 2.6 步骤六 启动Hermes Agent 3. 常见问题及解决方案 4. 总结

weixin_43178406的博客 14万+

综合实践-K8S 部署 LNMP 架构 ECShop

在 K8s 中部署 LNMP 架构 ECShop 商城。部署 NFS 服务器,提供共享目录 /ecshop部署 NFS 动态卷制备,存储类型 ecshop创建命名空间存储卷的命名空间部署RBAC权限部署 NFS Provisioner 应用部署 NFS StorageClass商城相关资源部署在 ecshop 命名空间后续使用ecshop用户管理 ecshop 命名空间中资源。配置 ingress 规则,通过 https://shop.laoma.cloud 访问商城。

fb_12345的博客 179

一文带你了解什么是RDMA

RDMA(Remote Direct Memory Access,远程直接内存访问)是一种起源于高性能计算领域的通信技术,如今已广泛应用于数据中心。该技术使得用户程序能够绕过操作系统内核及CPU,直接与网络接口卡(NIC)交互,实现网络通信。这种方式不仅大幅提升了通信带宽,还显著降低了网络延迟,优化了整体性能。

嵌入式技术开发 6016

保姆级教程!Python爬虫爬取知乎回答,保存为Markdown文件

本教程实现了知乎公开回答的完整爬取与Markdown保存,核心流程为「请求页面→解析作者/时间/正文/图片→下载图片→保存MD文件」,步骤清晰,代码可直接复用关键特性:支持合并/单文件两种保存模式、自动下载图片并引用、中文乱码防护、非法文件名过滤,满足日常整理知乎回答的需求新手友好:无需复杂配置,仅需修改知乎问题URL即可运行,全程无坑,5分钟内可看到运行结果灵活扩展:支持进阶优化(登录、分页、格式完善),可根据个人需求调整功能。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1232

KubeSphere 容器云实践:从管理 K8s 到建设企业 PaaS,还需要哪些能力

安装KubeSphere后,怎样继续建设企业PaaS?结合RuoYi Office真实微服务环境,从工作负载管理、项目与权限、Jenkins发布、独立监控到运维目录,核对已经可用的能力和待补的交付契约,给出可复核的配置、权限检查与平台演进方法。

RuoYi Office是基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue3 + Vben Admin + Uniapp 构建的中小企业全业务办公一体化平台,涵盖OA 协同 355

YOLO26科研优化:多损失函数(EIoU、SIoU等)融合,让边界框回归精度再上台阶

将原有损失函数替换为我们编写的MultiLoss。例如,在bbox_loss。

LXY_LOVE36的博客 172

K8s 配置风险评审:从问题清单到修改对照

Kubernetes 工作负载配置检查完成后,整改评审还需要解决三件事:定位具体对象、解释风险是否适用、确认建议修改与当前配置的差异。只有风险清单,很难直接判断变更影响。

chrsh44e的博客 172

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

k8s -- 拉取镜像nginx

Pulling image "docker.1ms.run/library/nginx:alpine" 是拉取镜像的日志。IP: 10.244.0.70 这个是这个pod的访问ip。Type Status 下面的状态是pod的启动情况。10.244.0.70:80 这个地址只有集群内部的机器可以访问,但是外部访问是不行的。192.168.129.136是这个k8s节点的ip,31128是映射的端口。需要用 service 功能来做端口映射。

DGH2430284817的博客 139

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

K8s 健康检查三大探针:存活、就绪、启动探针配置与排错实战

对于多副本应用, 当执行Scale Up操作时, 新副本会作为backend被添加到Service的负载均衡中, 与已有副本一起处理客户的请求。因为新副本本身没有异常退出, 默认的Health Check机制会认为容器已经就绪, 进而会逐步用新副本替换现有副本, 其结果就是: 当所有旧副本都被替换后, 整个应用将无法处理请求, 无法对外提供服务。例如,当存活探针可以探测到应用死锁(应用在运行,但是无法继续执行后面的步骤)情况,进而重启pod,有助于提高应用的可用性,即使其中存在缺陷。

weixin_63581562的博客 170

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

K8s Pod 反复重启 CrashLoopBackOff:从 exit code 到根因的 5 步排查

容器起来 37 秒就被杀、kubectl get pod 满屏 CrashLoopBackOff,而应用日志只有一行。本文给出一条从 exit code 反推根因的 5 步排查链,附 exit 137/143/1/2 与 OOMKilled 的对照表和最小复现。

2501_92769340的博客 265

K8s控制器揭秘:一键实现Pod自愈与自动扩缩

控制器是Kubernetes中实现Pod生命周期自动化管理的中间层,通过声明期望状态并持续比对实际状态,实现自愈、扩缩容与故障恢复。常用控制器包括:Deployment(无状态应用,支持滚动更新与回滚)、ReplicaSet(维持指定副本数)、DaemonSet(每节点运行一个Pod)、Job(一次性任务)、CronJob(定时任务)及StatefulSet(有状态应用,提供稳定标识、网络和存储)。其中,Deployment通过管理ReplicaSet实现版本迭代,而StatefulSet结合无头服务保障有

2301_80092853的博客 246

容器化与 K8s 编排

容器化与K8s编排是云原生高可用的核心,但仅部署Docker+K8s仍难保障稳定性。真实场景中,扩容滞后、POD雪崩、发布故障、资源争抢等问题频发。需构建三层防御:通过QoS隔离、PDB防护、镜像预拉取保障POD稳定;基于多维度指标(CPU/QPS/RT)实现精准弹性扩缩容;结合可观测性与故障自愈机制,实现自动重启、驱逐与熔断。大促案例表明,唯有系统化治理才能避免连锁崩溃,真正实现高可用。

weixin_38805083的博客 157

K8s ConfigMap实战:配置解耦与动态更新

Kubernetes中ConfigMap用于存储配置数据,以键值对形式实现镜像与配置解耦,提升可移植性。支持通过命令行、文件、目录或YAML创建,最大1MB限制。可通过环境变量、envFrom或Volume方式注入Pod,适用于Nginx、MySQL等场景。企业级应用中,如phpMyAdmin+MySQL共用配置,确保参数统一管理,避免重复构建镜像,增强运维效率。

2301_80092853的博客 202

K8s的部署

名称IPsy-harbor。

2503_92709449的博客 176

docker run 的 6 个问题,K8s 逐个解决:从脚本部署到声明式发布

两个Ready,集群就绪。如果 node1 一直是NotReady,99% 是 Calico 的 Pod 没起来(),通常是因为拉不到镜像,或者防火墙没关。

weixin_45488455的博客 237

K8s 动态存储供应:StorageClass 与 Local Path Provisioner 自动创建 PV 实战

之前创建存储卷(PV)都需要管理员手动操作,这类卷被称为静态卷。那么 Kubernetes 能不能 “智能” 管理卷呢?比如需要用卷时自动创建,不用时自动清理?答案是可以的 —— 这就是动态卷供应的能力。它彻底省去了集群管理员提前手动配置存储的工作,用户只要提出存储需求,系统就会自动创建对应的存储卷。

weixin_63581562的博客 305

GPUWorks 免 K8s 交付:单二进制装起推理平台,异构加速卡统一纳管

面向受限机房的 GPUWorks 落地方法:单二进制免 K8s 交付推理服务,用适配层统一纳管多厂商加速卡,并给出路由、观测与分阶段上线步骤。

2301_78967866的博客 386

k8s基础组件与创建资源

本文概述Kubernetes核心组件(Master/Worker节点及Add-ons)、使用kubeadm部署集群的流程,以及kubectl命令行工具的常用操作。涵盖节点管理、资源创建与删除、标签与选择器使用、Deployment控制器实现弹性扩缩容等关键内容,结合yaml配置实现声明式管理,提升集群运维效率。

我的梦想有多远,我就能走多远! 269

【K8s系列 (一) 】Docker与容器(上篇)

本文从Kubernetes的普及背景切入,系统介绍容器技术基础。以DockerEngine为例,详解容器安装、使用与架构,揭示容器本质是基于namespace、cgroup等内核技术实现的隔离环境。通过对比虚拟机,阐明容器轻量高效的优势,并深入解析镜像与容器的“静态-动态”关系。最后结合实际命令演示,引导读者理解“一次构建,随处运行”的容器化应用核心理念,为后续K8s学习奠定坚实基础。

2501_93095927的博客 354
上一篇: 逐层优化!网安独角兽如何在 AWS 上削减 60% 的 K8s 成本
下一篇: 别再被忽悠啦!揭秘 AWS Savings Plans 的糖衣炮弹:省钱不成,反被“绑架”?
CloudPilotAI
博客等级 码龄2年 519粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值