You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes部署Ruby on Rails应用:资源加载失败及API超时问题求助

Rails应用K8s部署问题解决方案

问题现象

  • 本地单独运行容器时,应用默认欢迎页及图片显示正常,但部署到Kubernetes后图片无法加载,API端点访问超时。
  • 添加NetworkPolicy的egress规则后,应用被完全切断访问。

一、修复NetworkPolicy的致命配置问题

当前的NetworkPolicy完全封锁了Pod的入站和出站流量:

  • ingress.from: [] 拒绝所有外部/集群内的入站请求
  • egress.to: [] 拒绝所有出站请求(包括DNS查询、依赖服务访问)

调整后的NetworkPolicy配置(按需开放流量)

根据应用实际需求,开放必要的入站和出站规则,示例如下:

---
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: some-policy
  namespace: "test"
spec:
  podSelector:
    matchLabels:
      app: testapi
  ingress:
    # 允许集群内其他Pod访问应用
    - from:
        - podSelector: {}
    # 允许外部通过LoadBalancer访问(生产环境建议替换为具体IP段)
    - from:
        - ipBlock:
            cidr: 0.0.0.0/0
  egress:
    # 允许访问集群CoreDNS(域名解析必须)
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - protocol: UDP
          port: 53
    # 允许访问应用依赖的服务(比如数据库,替换为实际网段/端口)
    - to:
        - ipBlock:
            cidr: 192.168.0.0/24
      ports:
        - protocol: TCP
          port: 5432
    # 如果应用需要访问互联网资源(如图片CDN),开放80/443端口
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0
      ports:
        - protocol: TCP
          port: 80
        - protocol: TCP
          port: 443

生产环境请遵循最小权限原则,不要直接开放0.0.0.0/0,替换为实际需要的IP范围。

二、修复Rails静态资源加载问题

  1. 容器构建阶段预编译静态资源
    确保Dockerfile中执行静态资源预编译命令,示例:
FROM ruby:3.2-slim

RUN apt-get update && apt-get install -y build-essential nodejs

WORKDIR /app

COPY Gemfile Gemfile.lock ./
RUN bundle install

COPY . .

# 生产环境预编译静态资源
RUN RAILS_ENV=production rails assets:precompile

CMD ["rails", "server", "-b", "0.0.0.0"]
  1. 确认生产环境静态资源配置
    检查config/environments/production.rb,确保开启静态资源服务:
# 开启静态文件服务
config.public_file_server.enabled = true

# 若使用CDN,配置资源域名
# config.asset_host = 'https://your-cdn-domain.com'

三、排查API超时问题

  1. 修复Service配置的缩进错误
    你提供的Service YAML中ports字段缩进错误,导致Service无法正确关联Pod端口,修正后:
---
apiVersion: v1
kind: Service
metadata:
  name: testapi
  namespace: "test"
  annotations:
    k8s.ikarem.io/update-dns: "true"
spec:
  selector:
    app: testapi
  ports: # 此处需与selector同级缩进
  - protocol: TCP
    port: 3000
    targetPort: 3000
  type: LoadBalancer
  1. 检查应用日志和依赖可达性
  • 查看Pod日志定位错误:
kubectl logs -n test testapi-<你的PodID>
  • 进入Pod内部测试依赖服务连通性(比如数据库):
kubectl exec -n test -it testapi-<你的PodID> -- bash
# 示例:测试PostgreSQL连接
psql -h <数据库地址> -U <用户名> -d <数据库名>

内容的提问来源于stack exchange,提问作者paul590

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:43:14