Kubernetes — Не удается получить доступ к apache Pod с прокси-сервера

#apache #docker #kubernetes

#apache #docker #kubernetes

Вопрос:

У меня есть PHP app Apache в модуле Kubernetes. Приложение PHP, доступ к API Elasticsearch на порту 9200 и показать пользователям простой веб-сайт на порту 5000.

Я запускаю прокси, используя kubectl proxy --address='0.0.0.0' --port=8001 --accept-hosts='.*' .

Когда я захожу в "http://localhost:8001/api/v1/namespaces/default/pods/website/proxy/" , я вижу следующую ошибку:

 Error: 'dial tcp 172.17.0.6:5000: connect: connection refused'
Trying to reach: 'http://172.17.0.6:5000/'
  

*172.17.0.6 — это IP-адрес модуля.

Это веб-модуль yaml:

 apiVersion: v1
kind: Pod
metadata:
  name: website
  labels:
    app: website
spec:
  containers:
  - name: website
    image: website_k8s:latest
    ports:
    - containerPort: 5000
    - containerPort: 80
  

Это файл dockerfile для website_k8s: последняя версия:

 FROM php:7.0-apache
RUN echo "ServerName 0.0.0.0" >> /etc/apache2/apache2.conf
COPY ./index.php /var/www/html/
EXPOSE 5000
  

Я также пытался запустить службу:

 apiVersion: v1
kind: Service
metadata:
  name: website-service
spec:
  ports:
  - port: 5000
    targetPort: 80
    protocol: TCP
    name: serving
  - port: 80
    targetPort: 9200
    protocol: TCP
    name: readfromelasticsearch
  selector:
    app: website
  

И когда я захожу в http://localhost:8001/api/v1/namespaces/default/services/website-service/proxy/ , я вижу:

 {
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "no endpoints available for service "website-service"",
  "reason": "ServiceUnavailable",
  "code": 503
}
  

Несмотря на то, что при запуске $kubectl get endpoints website-service я вижу:

 NAME              ENDPOINTS                       AGE
website-service   172.17.0.6:80,172.17.0.6:9200   59m
  

Я вижу конечную точку POD службы.

Как я могу получить доступ к своему веб-сайту через прокси?

Ответ №1:

Проблема в том, что Apache прослушивает порт 80, а не 5000.

Если вы удалите, containerPort: 5000 тогда вы сможете получить доступ к веб-сайту через http://localhost:8001/api/v1/namespaces/default/pods/website/proxy/ .

Во-вторых, конечные точки, которые вы видите для службы, являются внутренними для кластера. Итак, вы можете получить доступ к сервису через эти конечные точки IP из модуля: kubectl exec website -- curl 172.17.0.6/ . Если вы хотите предоставить свой сервис извне, сервис должен иметь тип NodePort или LoadBalancer .

Наконец, проблема, с которой вы сталкиваетесь при запросе службы через прокси, заключается в том, что, когда вы даете имя порту, вы должны включать его в вызов прокси: curl localhost:8001/api/v1/namespaces/default/services/website-service:serving/proxy/ .