Как применить вход nginx в Kubernetes с разными пространствами имен?

Я новичок в k8s и nginx. В настоящее время я реализую вход nginx в мои kubernetes microk8s через yaml, поскольку это nginx plus. Вот результат:

myubuntu$ kubectl get all -n nginx-ingress
NAME                                READY   STATUS    RESTARTS   AGE
pod/nginx-ingress-8dd4c95f5-b5qzs   1/1     Running   0          3d23h
pod/nginx-ingress-8dd4c95f5-vbvc6   1/1     Running   0          3d23h

NAME                    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/nginx-ingress   NodePort   10.152.183.119   <none>        80:31656/TCP,443:30406/TCP   4d3h

NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-ingress   2/2     2            2           4d3h

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-ingress-8dd4c95f5   2         2         2       3d23h
replicaset.apps/nginx-ingress-c4d985f57   0         0         0       4d3h

Я также развернул тестовое приложение со следующими значениями yaml:

apiVersion: v1
kind: Namespace
metadata:
  name: web
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
  namespace: web
  labels:
    app: web
  annotations:
    deployment.kubernetes.io/revision: '1'
    sensor.crowdstrike.com/imageanalyzer: "enable"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: test
        image: my docker image
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: web-server-service
  namespace: web
spec:
  selector:
    app: web
  type: ClusterIP
  ports:
    - port: 3000
      targetPort: http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-server-ingress
  namespace: web
  annotations:
      kubernetes.io/ingress.class: nginx-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: web.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-server-service
            port:
              number: 3000

Я проверил и подтвердил, что обе службы работают нормально независимо, но когда я пытался настроить порт в входном веб-файле, вход nginx plus всегда возвращал 404? Это проблема с моим конфигурационным файлом или пространством имен? Заранее спасибо.

Разверните приложение на microk8 с помощью специального nginx plus ingress.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

В случае nginx в большинстве случаев при возникновении ошибки 404 имя хоста либо неверно, либо представлено неправильно. Или путь неправильный.

Я настроил локальный вход nginx и применил вашу конфигурацию, используя модуль nginx и 80 в качестве порта контейнера. Я изменил имя хоста web-server-ingress на localhost. ниже приведен пример того, что я запускал:

# install nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/cloud/deploy.yaml

# setup the application
k apply -f <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: web
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
  namespace: web
  labels:
    app: web
  annotations:
    deployment.kubernetes.io/revision: '1'
    sensor.crowdstrike.com/imageanalyzer: "enable"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: test
        image: nginx:alpine
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: web-server-service
  namespace: web
spec:
  selector:
    app: web
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-server-ingress
  namespace: web
spec:
  ingressClassName: nginx
  rules:
  - host: localhost
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-server-service
            port:
              number: 80
EOF

# expose the ingress controller
kubectl port-forward -n ingress-nginx service/ingress-nginx-controller 8000:80

# access the application
curl -X GET http://localhost:8000/

В вашем случае я бы посоветовал вам получить имя модуля входного контроллера:

Меня зовут ingress-nginx-controller-77cfd766fc-2h4k8

Затем попробуйте просмотреть логи:

Вы не заметите журнал запросов, если имя хоста не совпадает.

Если есть логи, вы получите информацию о запросе, сделанном к вышестоящему сервису:

Ниже приведен пример ответа 200:

127.0.0.1 - - [05/Aug/2024:11:10:01 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" 1758 0.004 [web-web-server-service-80] [] 172.17.0.4:80 615 0.003 200 f12389c9f84a7855e38758a2004a021e

Обратите внимание, что часть после [web-web-server-service-80] записывает достигнутый модуль и порт, длину запроса, время и ответ, а также идентификатор запроса.

Вот журнал ответа 503:

127.0.0.1 - - [05/Aug/2024:11:08:12 +0000] "GET / HTTP/1.1" 503 592 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" 1758 0.000 [web-web-server-service-80] [] - - - - c1e3a81377b6483e8e2fb8293ff181a7

Обратите внимание, что для запроса/ответа восходящей службы журнал не ведется.

Если имя хоста не совпадает, контроллер не ведет журнал и возвращает клиенту ошибку 404.

Спасибо, я попробовал это, и это сработало, но теперь у меня возникла еще одна проблема, связанная с превышением ограничений сервера имен. Вы знаете, как это исправить? Я попытался удалить неиспользуемое развертывание, но это не сработало.

phunguyen 06.08.2024 12:19

Проверьте, может ли это помочь, gist.github.com/codeopensrc/e43c2af8ad2376f60c6411a8dbf2060f‌​. Если нет, я советую вам создать вопрос, подробно описывающий вашу настройку?

limistah 06.08.2024 14:45

Другие вопросы по теме