【问题标题】:Why doesn't my pod respond to requests on the exposed port?为什么我的 pod 不响应暴露端口上的请求?
【发布时间】:2016-01-13 08:53:49
【问题描述】:

我刚刚基于 CoreOS kube-aws 脚本启动了一个相当基本的集群。

https://coreos.com/kubernetes/docs/latest/kubernetes-on-aws.html

我已经激活了注册表插件,并且我已经将它正确代理到我的本地机器,因此我可以将图像推送到 localhost:5000 上的集群。我还在每个节点上正确加载了代理 pod,以便 localhost:5000 也将从该注册表中提取图像。

https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/registry

然后我将一个相当简单的 Sinatra 应用程序 docker 化以在我的集群上运行并将其推送到注册表。我还准备了 ReplicationController 定义和 Service 定义来运行应用程序。镜像拉取启动没问题,我可以使用kubectl从属于replication group的每个pod获取启动日志。

我的问题是,当我 curl 我的服务的公共 ELB 端点时,它只是挂起。

我尝试过的事情:

  • 我获得了运行我的 pod 的节点之一的公共 IP,并尝试在服务描述中描述的 NodePort 上 curl 它,同样的事情。
  • 我通过 SSH 连接到该节点并尝试 curl localhost:3000,结果相同。
  • 我也尝试通过 SSH 连接到该节点,curl <pod-ip>:3000,结果相同。
  • ps 显示 Puma 进程在端口 3000 上运行和侦听。
  • 节点上的docker ps 显示应用容器没有将任何端口转发到主机。可能是这个问题吗?

请求必须正确路由,因为在任何其他端口访问这些 IP 会导致 connection refused 而不是挂起。

我的应用程序的 Dockerfile 相当简单:

FROM ruby:2.2.4-onbuild
RUN apt-get update -qq && apt-get install -y \
  libpq-dev \
  postgresql-client

RUN mkdir -p /app
WORKDIR /app

COPY . /app

EXPOSE 3000

ENTRYPOINT ['ruby', '/app/bin/entrypoint.rb']

entrypoint.rb 将启动一个监听端口 3000 的 Puma 服务器。

我的复制组是这样定义的:

apiVersion: v1
kind: ReplicationController
metadata:
  name: web-controller
  namespace: app
spec:
  replicas: 2
  selector:
    app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      volumes:
      - name: secrets
        secret:
          secretName: secrets
      containers:
      - name: app
        image: localhost:5000/app:v2
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
        env:
        - name: DATABASE_NAME
          value: app_production
        - name: DATABASE_URL
          value: postgresql://some.postgres.aws.com:5432
        - name: ENV
          value: production
        - name: REDIS_URL
          value: redis://some.redis.aws.com:6379
        volumeMounts:
        - name: secrets
          mountPath: "/etc/secrets"
          readOnly: true
        command: ['/app/bin/entrypoint.rb', 'web']
        ports:
          - containerPort: 3000

这是我的服务:

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  ports:
  - port: 80
    targetPort: 3000
    protocol: TCP
  selector:
    app: web
  type: LoadBalancer

kubectl describe service web-service的输出:

Name:           web-service
Namespace:      app
Labels:         <none>
Selector:       app=web
Type:           LoadBalancer
IP:         10.3.0.204
LoadBalancer Ingress:   some.elb.aws.com
Port:           <unnamed>   80/TCP
NodePort:       <unnamed>   32062/TCP
Endpoints:      10.2.47.3:3000,10.2.73.3:3000
Session Affinity:   None
No events.

docker ps 在其中一个节点上显示应用容器未将任何端口转发到主机。可能是这个问题吗?

编辑以添加 entrypoint.rb 和 Procfile

入口点.rb:

#!/usr/bin/env ruby

db_user_file = '/etc/secrets/database_user'
db_password_file = '/etc/secrets/database_password'

ENV['DATABASE_USER'] = File.read(db_user_file) if File.exists?(db_user_file)
ENV['DATABASE_PASSWORD'] = File.read(db_password_file) if File.exists?(db_password_file)

exec("bundle exec foreman start #{ARGV[0]}")

过程文件:

web: PORT=3000 bundle exec puma
message_worker: bundle exec sidekiq -q messages -c 1 -r ./config/environment.rb
email_worker: bundle exec sidekiq -q emails -c 1 -r 

【问题讨论】:

  • entrypoint.rb 是什么样的(以及启动 Sinatra 应用程序所涉及的任何其他文件)?这可能与处于开发模式的 Sinatra 应用程序默认仅监听 localhost 有关,但我不知道它如何与 Docker 以及此处涉及的其他技术交互。
  • @matt:我添加了 entrypoint.rb 和 Procfile。我认为这不是问题,但因为运行 ps aux 我可以看到 Puma 进程正在监听 0.0.0.0:root 1798 0.0 0.6 156236 23872 ? Sl 00:01 0:00 puma 2.9.0 (tcp://0.0.0.0:3000)
  • 我认为你是对的。我想的问题适用于 Sinatra 的内置服务器,但你是直接启动 Puma,所以它必须是别的东西。

标签: amazon-web-services docker sinatra kubernetes coreos


【解决方案1】:

我的 Kubernetes 设置没有任何问题。事实证明,应用程序无法启动,因为与数据库的连接由于一些不相关的网络问题而超时。

对于任何好奇的人:不要在 10.x.x.x IP 范围内启动 Kubernetes 外部的任何东西(例如 RDS、Elasticache 等)。长话短说,Kubernetes 目前有一个硬编码的 IPTables 伪装规则,它会扰乱与该范围内不属于集群的任何东西的通信。详情见here

我最终做的是为我在不同 IP 范围上的数据存储创建一个单独的 VPC,并与我的 Kubernetes VPC 对等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2019-10-24
    • 2019-06-22
    相关资源
    最近更新 更多