#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/
.