Я только что запустил довольно простой кластер, основанный на сценариях 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
Как выглядит 'entrypoint.rb' (и любые другие файлы, участвующие в запуске вашего приложения Sinatra)? Это может быть связано с тем, что приложения Sinatra в режиме разработки только прослушивают «localhost» по умолчанию, но я не знаю, как это взаимодействует с Docker и другими технологиями, задействованными здесь. – matt
@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
Думаю, вы правы. Проблема, о которой я думаю, относится к встроенному серверу Sinatra, но вы начинаете Puma напрямую, так что это должно быть что-то еще. – matt