如何排错运行在Kubernetes集群中的服务?

我们的前端服务以job运行。k8s的job用于执行一次性的任务,运行完毕即退出。以job方式运行的前端服务启动程序只做一件事情,将镜像中指定目录下的静态文件上传到对象存储。上传前会做一些变量替换,替换的值和对象存储的连接信息存储在Nacos中。

Nacos的连接信息通过job的环境变量注入,类似下面这样,

复制代码
apiVersion: batch/v1
kind: Job
metadata:
  name: frontend-app-web
spec:
  template:
    metadata:
      labels:
        app: frontend-app-web
    spec:
      containers:
      - name: frontend-app-web
        image: harbor.example.com/frontend-app-web:3
        imagePullPolicy: Always             
        env:          
          - name: NACOS_HOST
            value: nacos-cs.nacos.svc.cluster.local:8848
          - name: NACOS_AUTH_USERNAME
            value: username
          - name: NACOS_AUTH_PASSWORD
            value: veryLongPassword
      restartPolicy: Never

在部署过程中,发现有一个前端服务始终卡在连接Nacos的阶段,日志如下,

起初我确定Nacos的连接信息是没有错的,但日志显示连接Nacos超时。为了排查这个问题,将原本以job方式运行的服务更改为deployment方式,如下,

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-app-web
  labels:
    app: frontend-app-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend-app-web
  template:
    metadata:
      labels:
        app: frontend-app-web
    spec:
      containers:
      - name: frontend-app-web
        image: harbor.example.com/frontend-app-web:3
        imagePullPolicy: Always        

        command: ["/bin/bash"]
        args: ["-c", "while true;do sleep 3600;done"]
        tty: true
        stdin: true
 
        env:
        - name: NACOS_HOST
          value: nacos-cs.nacos.svc.cluster.local:8848
        - name: NACOS_AUTH_USERNAME
          value: username
        - name: NACOS_AUTH_PASSWORD
          value: veryLongPassword        
      restartPolicy: Always

更改为deployment运行,最重要是加入下面四行内容,

复制代码
        command: ["/bin/bash"]
        args: ["-c", "while true;do sleep 3600;done"]
        tty: true
        stdin: true

这样Pod运行后,就可以进入容器内部调试。

Pod启动后,运行镜像原本的启动命令(是一段JavaScript代码,完成文章开头提到的上传前端文件到对象存储的功能),还是一样的报错。和正常服务比较,发现Nacos的连接地址少写了"http://",在容器里面修改环境变量,

复制代码
export NACOS_HOST=http://nacos-cs.nacos.svc.cluster.local:8848

重新运行上传程序,运行成功。

K8s调试Pod核心是集群视角多维度排查,依赖kubectl工具链。因分布式隔离、临时生命周期(重启丢状态),常用logs/exec/临时容器等方法,避免直接操作宿主机。

相关推荐
Linux-18741 小时前
分布式链路追踪系统之二进制安装skywalking
elasticsearch·云原生·skywalking·分布式链路追踪系统·应用程序性能监控
BullSmall5 小时前
Anolis OS 8.10 完整安装 Docker CE(生产可用,解决 podman 冲突)
docker·容器·podman
heimeiyingwang6 小时前
【架构实战】可观测性三支柱:日志、指标、链路的融合
elasticsearch·架构·kubernetes
阿里云云原生8 小时前
阿里云 AgentTeams 7月第二周产品动态
云原生
CodexDave12 小时前
数据库连接池耗尽:排查顺序与三层兜底
服务器·前端·数据库·git·云原生·容器·kubernetes
java_logo12 小时前
ELK Docker Compose 部署指南:轻松搭建日志检索平台
elk·elasticsearch·docker·容器·kibana·logstash·轩辕镜像
ShallWeL12 小时前
Orin 上用 Docker 跑通目标检测功能
人工智能·目标检测·docker·容器
辰同学ovo13 小时前
用“舞台换景”讲清 Docker 的 Restart 与 Recreate
运维·docker·容器
名字还没想好☜14 小时前
Kubernetes Ingress 实战:域名路由、TLS 证书与 502/404 排查
运维·云原生·容器·kubernetes·ingress
Zhu75814 小时前
在k8s部署alist 3.62.0
云原生·容器·kubernetes