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静态资源加载问题
- 容器构建阶段预编译静态资源
确保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"]
- 确认生产环境静态资源配置
检查config/environments/production.rb,确保开启静态资源服务:
# 开启静态文件服务 config.public_file_server.enabled = true # 若使用CDN,配置资源域名 # config.asset_host = 'https://your-cdn-domain.com'
三、排查API超时问题
- 修复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
- 检查应用日志和依赖可达性
- 查看Pod日志定位错误:
kubectl logs -n test testapi-<你的PodID>
- 进入Pod内部测试依赖服务连通性(比如数据库):
kubectl exec -n test -it testapi-<你的PodID> -- bash # 示例:测试PostgreSQL连接 psql -h <数据库地址> -U <用户名> -d <数据库名>
内容的提问来源于stack exchange,提问作者paul590
相关产品推荐
相关产品推荐

