#kubernetes #kubernetes-pod #amazon-eks #kubernetes-service
#kubernetes #kubernetes-pod #amazon-eks #kubernetes-service
Вопрос:
Я пытаюсь развернуть свое веб-приложение с помощью Kubernetes. Я использовал Minikube для создания кластера и успешно предоставил доступ к своему интерфейсному приложению react с помощью ingress. Тем не менее, когда я прикрепил URL-адрес серверной службы в поле «env» в файле deployment.yaml интерфейса, он не работает. Когда я попытался подключиться к серверной службе через модуль интерфейса, соединение было прервано.
развертывание интерфейса yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: frontend
spec:
replicas: 1
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend
image: <image_name>
imagePullPolicy: Never
ports:
- containerPort: 80
env:
- name: REACT_APP_API_V1_ENDPOINT
value: http://backend-svc
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: frontend-svc
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: frontend
Вход для интерфейса
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: front-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/proxy-read-timeout: "12h"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host: front-testk.info
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-svc
port:
number: 80
Серверное развертывание yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: backend
labels:
name: backend
spec:
replicas: 1
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: <image_name>
ports:
- containerPort: 80
imagePullPolicy: Never
restartPolicy: Always
---
kind: Service
apiVersion: v1
metadata:
name: backend-svc
labels:
app: backend
spec:
selector:
app: backend
ports:
- name: http
port: 80
targetPort: 80
% kubectl get svc backend-svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
backend-svc ClusterIP 10.109.107.145 <none> 80/TCP 21h app=backend
Подключился внутри модуля внешнего интерфейса и попытался подключиться к серверной части, используя ENV, созданный во время развертывания:
❯ kubectl exec frontend-75579c8499-x766s -it sh
/app # apk update amp;amp; apk add curl
OK: 10 MiB in 20 packages
/app # env
REACT_APP_API_V1_ENDPOINT=http://backend-svc
/app # curl $REACT_APP_API_V1_ENDPOINT
curl: (7) Failed to connect to backend-svc port 80: Connection refused
/app # nslookup backend-svc
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: backend-svc.default.svc.cluster.local
Address: 10.109.107.145
** server can't find backend-svc.cluster.local: NXDOMAIN
Exec в мой серверный модуль
# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1/node
# netstat -lnturp
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
Комментарии:
1. Можете ли вы добавить вывод
kubectl get svc backend-svc -o wide
too сюда?2. @vishal Спасибо за предложение, я только что добавил это.
3. проверьте состояние ваших модулей управления, модулей core-dns. Посмотрите, есть ли что-нибудь полезное в журналах модуля control plane. проверьте, существует ли какая-либо сетевая политика, которая запрещает обмен данными между модулями.
4. каково ваше пространство имен для серверной части ? dns должен быть серверным-svc.default.cluster.local, если пространство имен задано по умолчанию?
5. @ThanhNguyenVan Согласно опубликованным им yamls, он не упомянул ни одного пространства имен в метаданных, что означает, что оно будет автоматически развернуто в ns по умолчанию.
Ответ №1:
Как я и подозревал, ваше приложение прослушивает порт 8080. Если вы внимательно посмотрите на свой вывод, netstat
вы заметите Local Address
, что 0.0.0.0:8080
:
# netstat -tulpn
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 👉 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1/node
Чтобы исправить это, вы должны исправить свой targetPort
в своем сервисе:
kind: Service
apiVersion: v1
metadata:
name: backend-svc
labels:
app: backend
spec:
selector:
app: backend
ports:
- name: http
port: 80
targetPort: 8080 # 👈 change this to 8080
Нет необходимости менять порт на стороне развертывания, поскольку он в containerPort
основном информационный. Неуказание порта там не препятствует раскрытию этого порта. Будет доступен любой порт, который прослушивает "0.0.0.0"
адрес по умолчанию внутри контейнера.
Комментарии:
1. Спасибо за остальное. Измененный yaml развертывания по-прежнему приводит к отказу в подключении.
2. Это действительно странно. Я проверил ваши файлы yaml с разными изображениями, и интерфейсное приложение смогло подключить резервные копии. Таким образом, ошибка определенно находится на стороне вашего поддерживаемого приложения. Просто чтобы подтвердить, вы изменили развертывание или службу?
3. Я изменил целевой порт службы, как вы предложили. Спасибо за проверку, я попытаюсь использовать другое изображение для серверной части и посмотреть, работает ли оно
4. Я использовал mendhak/http-https-echo . Это очень хорошо для тестирования.
5. Я развернул тестовый модуль с той же конфигурацией, что и предлагаемая здесь ссылка , и у него нет проблем с запуском
nslookup backend-svc.default
иnslookup kubernetes.default
. В моем интерфейсном модуле используется изображение Alpine, как вы думаете, в этом проблема, как предложено здесь ссылка