K8s治好了我的整理强迫症:当Node节点变成乐高积木

开篇暴击:从"俄罗斯方块玩家"到"乐高建筑师"

曾经的我:

  • 盯着服务器监控图就像玩真人版俄罗斯方块

  • 某台机器CPU飙红时,手动SSH迁服务的速度堪比电竞选手

  • 凌晨三点被告警吵醒,迷迷糊糊执行着kill -9 $(pgrep java)的肌肉记忆

直到遇见Kubernetes ——
"原来服务器不该是衣柜里纠缠的数据线,而该是儿童房散落的乐高积木"


第一幕:当HPA遇见《黄金分割》

暴怒场景

bash
复制
# 曾经手工维护的扩容脚本(黑历史警告)
while true; do
  LOAD=$(uptime | awk '{print $NF}')
  if [ $(echo "$LOAD > 4" | bc) -eq 1 ]; then
    scp service.jar node5:/apps && ssh node5 "nohup java -jar /apps/service.jar &"
  fi
  sleep 30
done

痛点

  • 新节点启动时老服务可能已过载崩溃

  • 凌晨流量低谷时忘缩容,早上发现空跑8台机器烧钱

K8s疗法

yaml
复制
# 让比例强迫症狂喜的HPA配置
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: payment-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: payment-service
  minReplicas: 3
  maxReplicas: 15
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60  # 永远锁定60%的优雅刻度线

从此集群像呼吸般自然伸缩,CPU曲线比股票K线图还丝滑


第二幕:Label选择器与《垃圾分类学》

抓狂时刻

bash
复制
# 远古时期手动打TAG的运维噩梦
ssh node03 "docker run -d --env ENV=prod --env DC=az1 ..."
ssh node07 "docker run -d --env ENV=staging --env DC=az2 ..."

当需要批量操作"所有华东地区的前端测试容器"时 ——
只能含泪写200行Shell脚本+人工复核

K8s哲学

yaml
复制
# 给Node贴智能标签(乐高积木分类法)
kubectl label nodes node-01 region=east-az1 disk=ssd
kubectl label nodes node-02 region=east-az2 disk=hdd

# 让Pod像磁铁般吸附目标节点
apiVersion: v1
kind: Pod
metadata:
  name: redis-cache
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disk
            operator: In
            values: [ssd]
  tolerations:
  - key: "special"
    operator: "Exists"

现在只需一句kubectl get pods -l 'env=prod,app=gateway',精准度堪比超市扫码枪


第三幕:CRD自定义资源与《乐高说明书》

混沌记忆

bash
复制
# 曾经分散在Confluence的部署文档摘录:
/*
1. 先启动config-service
2. 等5分钟后启动gateway
3. 如果遇到ZK连接失败,检查hosts文件第47行
*/

结果每次发版都像拆弹部队在操作

K8s式秩序

yaml
复制
# 用Operator实现"乐高说明书"自动化
apiVersion: middleware.mycompany.com/v1
kind: MicroserviceSuite
metadata:
  name: order-system
spec:
  components:
    - name: config-server
      version: 2.3.1
      dependsOn: []
    - name: zuul-gateway
      version: 1.8.2
      dependsOn: ["config-server"]
    - name: order-service
      version: 3.0.0
      dependsOn: ["config-server", "zuul-gateway"]
  healthCheckPath: /actuator/health

现在只需kubectl apply -f order-system.yaml,系统自组织能力堪比蜂群


终极治愈:声明式API与《断舍离》

当我们:

  • kubectl rollout undo设成紧急逃生键

  • 看着Helm Chart的版本历史露出姨母笑

  • 用Prometheus+Granfana绘制资源拓扑图当屏保

或许这就是云原生时代的禅意?

运维觉悟

最好的整理不是排列整齐的文件夹
而是万物皆有归处,变化自有其道 🍃


下期脑洞
《当我在K8s里养了只数字化工宠:Operator模式奇幻之旅》

posted @ 2025-03-24 09:30  Wang、sir  阅读(12)  评论(0)    收藏  举报