Подключение к службе Kubernetes привело к отказу в подключении

#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, как вы думаете, в этом проблема, как предложено здесь ссылка