续:从 Docker Compose 到 Kubernetes(2)—— 服务优化与排错

加油打工人!

上篇回顾:完成了物联网管理系统在 K8S 上的部署,前后端正常运行,设备管理功能可用。但有一个问题:迁移只是完成了"跑起来",生产环境还需要考虑资源控制和故障自愈。

本篇目标:给后端服务加上资源限制和健康检查。


一、配置资源限制

目的:防止容器耗尽节点资源,影响其他 Pod。

修改 Deployment ,在 containers 下添加:

yaml

复制代码
resources:
  requests:
    memory: "256Mi"
    cpu: "200m"
  limits:
    memory: "512Mi"
    cpu: "500m"

应用配置:

复制代码
kubectl apply -f iot-backend-deploy.yaml
kubectl rollout status deployment iot-backend

验证:

复制代码
kubectl describe pod $(kubectl get pod -l app=iot-backend -o jsonpath='{.items[0].metadata.name}') | grep -A3 "Limits\|Requests"

二、配置健康检查

目的:让 K8S 自动检测服务状态,挂掉时自动重启。

添加探针配置:

yaml

复制代码
livenessProbe:
  tcpSocket:
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
readinessProbe:
  tcpSocket:
    port: 8080
  initialDelaySeconds: 10
  periodSeconds: 5

验证:

复制代码
kubectl describe pod $(kubectl get pod -l app=iot-backend -o jsonpath='{.items[0].metadata.name}') | grep -A5 "Liveness\|Readiness"

三、配置后出现新问题

现象:配置完健康检查和资源限制后,浏览器无法进行设备增删改查。

排错思路:

1. 检查后端日志

复制代码
kubectl logs -l app=iot-backend --tail=50

后端启动正常,无报错。

2. 检查后端接口

复制代码
curl http://10.109.210.199:8080/device/list

返回正常数据,后端接口没问题。

3. 检查 Service Endpoints

复制代码
kubectl get endpoints iot-backend-svc

ENDPOINTS 有值,Service 能转发流量。

4. 浏览器直接访问后端

复制代码
http://192.168.116.168:30786/device/list

返回 ERR_CONNECTION_REFUSED。

5. 检查 Service 类型

复制代码
kubectl get svc iot-backend-svc

发现 Service 类型变成了 ClusterIP。

根本原因:重新 apply Deployment 时,连带修改了 Service 配置,导致后端 Service 从 NodePort 变回了 ClusterIP。


四、修复问题

将后端 Service 改回 NodePort 并固定端口:

复制代码
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: iot-backend-svc
spec:
  type: NodePort
  selector:
    app: iot-backend
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 30786
EOF

验证:

复制代码
curl http://192.168.116.168:30786/device/list

返回正常数据。

浏览器访问 http://192.168.116.168:30081,设备管理功能恢复。


五、验证健康检查生效

模拟后端故障:

复制代码
kubectl exec -it $(kubectl get pod -l app=iot-backend -o jsonpath='{.items[0].metadata.name}') -- pkill java

观察 Pod 自动重启:

复制代码
kubectl get pods -w

六、核心问题汇总

问题 原因 解决方案
配置后服务异常 Service 类型被覆盖为 ClusterIP 改回 NodePort 并固定端口
端口老变动 没指定 nodePort YAML 中固定 nodePort

七、小结

从 Docker Compose 迁移到 Kubernetes,不只是把容器搬过来。资源限制 保障了多容器共存时的资源分配,健康检查实现了服务故障的自愈。这是 K8S 相比 Docker Compose 的核心能力差异。

配置过程中的 Service 类型被覆盖,也提醒了一件事:Deployment 和 Service 的配置应该分开管理,避免 apply 时互相影响。

相关推荐
高频因子挖掘机1 小时前
回测收益为什么可能不真实?从时间戳、数据可用性到未来函数检查
后端·github·api
碧海银沙音频科技研究院3 小时前
炬芯ATS3089X手表的HFP通话不自动路由到设备BT的问题解决
网络·人工智能·嵌入式硬件·算法
EasyDSS7 小时前
连锁扩张管控难?一套视频会议/直播/点播/集群对讲EasyDSS音视频云平台打通门店全流程数字化
网络·音视频·easydss
像风一样自由20208 小时前
52.Docker部署大模型应用从本地开发到服务化运行
运维·人工智能·docker·容器·大模型·智能体
比兔代理9 小时前
游戏、直播、远程办公遇到动态IP怎么办?
网络
Lzg_na9 小时前
ARP 地址解析协议详解
网络·网络协议
行百里er10 小时前
Redis 完结篇——Redis 热点问题在 Spring Boot 项目中实战
redis·后端
IT规划师10 小时前
MQTT实战 - 用了8年MQTT,我为什么还要重新系统啃一遍(一)
物联网·.net
IT规划师10 小时前
MQTT 生产实战 - 用了 8 年 MQTT,我为什么还要重新系统啃一遍(一)
物联网·mqtt·.net10
上海广测检测科技有限公司10 小时前
消费类智能联网设备安全分级国标征求意见要点解析:三级五维框架与跨境对标逻辑
网络·经验分享