Запуск контейнера apache в порту> 1024 - PullRequest
0 голосов
/ 05 июля 2019

Я создал образ докера на основе httpd: 2.4 .В моем развертывании k8s я определил следующее securityContext:

securityContext:
  privileged: false
  runAsNonRoot: true
  runAsUser: 431
  allowPrivilegeEscalation: false

Для того, чтобы этот контейнер работал должным образом, необходимо настроить Apache без полномочий root для привязки к порту> 1024, какв отличие от значения по умолчанию 80. Насколько я могу судить, это означает редактирование Listen 80 в httpd.conf в Listen {Some port > 1024}.

Когда я хочу запустить образ докера, который я собрал нормально (т.е. по умолчаниюпорт 80) У меня есть следующие настройки порта:

  • развертывание
    • spec.template.spec.containers[0].ports[0].containerPort: 80
  • service
    • spec.ports[0].targetPort: 80
    • spec.ports[0].port: 8080
  • вход
    • spec.rules[0].http.paths[0].backend.servicePort: 8080

С учетом этих настроек служба становится доступной по URL-адресу хоста, указанному во входном манифесте.Опять же, это без изменений httpd.conf.Когда я делаю эти изменения (используя Listen 8000) и добавляю в раздел securityContext к развертыванию, я соответственно изменяю различные манифесты:

  • развертывание
    • spec.template.spec.containers[0].ports[0].containerPort: 8000
  • сервис
    • spec.ports[0].targetPort: 8000
    • spec.ports[0].port: 8080
  • вход
    • spec.rules[0].http.paths[0].backend.servicePort: 8080

Тем не менее, по какой-то причине, когда я пытаюсь получить доступ к URL, который должен работать, я получаю ошибку 502 Bad Gateway.Я правильно установил порты?Есть ли что-то еще, что мне нужно сделать?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Для того, чтобы этот контейнер работал правильно как не-root apache должен быть настроен для привязки к порту> 1024, в отличие от по умолчанию 80

Вы поняли, это сложное требование для того, чтобы контейнер apache работал без полномочий root, поэтому это изменение необходимо выполнять на уровне контейнера, а не в абстрактах Kubernetes, таких как спецификация Pod для Deployment или объект ресурса Service / Ingress. определения. Таким образом, единственное, что осталось в вашем случае, это создать собственный образ httpd с портом прослушивания> 1024. Тот же подход применяется к NGINX Docker-контейнерам.

Одна ключевая информация для поля containerPort в спецификации Pod, которую вы пытаетесь настроить вручную, и которая не так очевидна. Он существует в первую очередь для информационных целей и не вызывает открытия порта на уровне контейнера. Согласно Kubernetes API ссылка :

Не указание порта здесь НЕ препятствует тому, чтобы этот порт был подвергаются. Любой порт, который прослушивает адрес по умолчанию «0.0.0.0» внутри контейнера будет доступен из сети. Не может быть обновлено.

Надеюсь, это поможет вам двигаться дальше

0 голосов
/ 06 июля 2019

Проверьте, запущен ли модуль

kubectl get pods
kubectl logs pod_name

Проверьте, доступен ли URL в модуле

kubectl exec -it <pod_name> -- bash
$ curl http://localhost:8000

Если вышеописанное не сработало, проверьте ваш httpd.conf.

Проверьте с названием услуги

kubectl exec -it <ingress pod_name> -- bash
$ curl http://svc:8080

Вы также можете проверить входящие журналы.

...