2015-12-23 4 views
1

Я только что запустил довольно простой кластер, основанный на сценариях CoreOS kube-aws.Почему мой модуль не отвечает на запросы на открытом порту?

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

Я активировал реестр надстройку, и я его правильно проксировании моей локальной машине, так что я могу нажать изображения к кластеру на локальном хосте: 5000. У меня также есть прокси-сервер, правильно загруженный на каждом узле, так что localhost: 5000 также вытаскивает изображения из этого реестра.

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

Тогда я dockerized довольно простое приложение Синатры, чтобы работать на моем кластере и толкнул его в реестр. Я также подготовил определение ReplicationController и определение службы для запуска приложения. Изображения вытащили и не начали никаких проблем, я могу использовать kubectl, чтобы получить журналы запуска из каждого модуля, принадлежащего группе репликации.

Моя проблема в том, что когда я curl общественная конечная точка ELB для моего обслуживания, она просто зависает.

Что я пробовал:

  • Я получил публичный IP для одного из узлов работает мой стручок и попытался curl его в NodePort описано в описании сервиса, то же самое.
  • I SSH'd в этот узел и попытался curl localhost:3000, тот же результат.
  • Также SSH'd в этот узел, я попытался сделать 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 запустит сервер Puma прослушивает порт 3000.

Моя группа репликации определяется следующим образом:

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

Entrypoint.гь:

#!/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]}") 

PROCFILE:

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 
+0

Как выглядит 'entrypoint.rb' (и любые другие файлы, участвующие в запуске вашего приложения Sinatra)? Это может быть связано с тем, что приложения Sinatra в режиме разработки только прослушивают «localhost» по умолчанию, но я не знаю, как это взаимодействует с Docker и другими технологиями, задействованными здесь. – matt

+0

@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) ' – jvergeldedios

+0

Думаю, вы правы. Проблема, о которой я думаю, относится к встроенному серверу Sinatra, но вы начинаете Puma напрямую, так что это должно быть что-то еще. – matt

ответ

0

Там не было ничего плохого с моим Kubernetes создана. Оказывается, приложение не запускалось, потому что соединение с БД было тайм-аут из-за некоторой не связанной с сетью проблемы.

Любое любознательное: не запускайте ничего внешнего для Kubernetes в диапазоне IP 10.x.x.x (например, RDS, Elasticache и т. Д.). Короче говоря, у Kubernetes в настоящее время жестко закодировано правило маскировки IPTables, которое испортило связь с чем-либо в этом диапазоне, который не является частью кластера. См. Подробности here.

В результате я создал отдельный VPC для своих хранилищ данных в разных диапазонах IP и просматривал его с помощью VPC Kubernetes.

Смежные вопросы