Задать вопрос

Почему Microk8s ingress не редиректит к поду?

Добрый день. Впервые сталкиваюсь с kubernetes и возможно мой вопрос покажется глупым. У меня есть сервер (Ubuntu 22.04) с установленным microk8s и я пытаюсь настроить конфигурацию для веб-приложения с Nginx. Все запускается нормально и я могу подключиться к серверу напрямую через SSH. Ingress контроллер и приложение находятся в разных неймспейсах. Когда я пытаюсь зайти на сайт, то получаю 503 ошибку. Причем я вижу эти подключения в логах Ingress, но не в webapp.

Мои конфиги: deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
spec:
  revisionHistoryLimit: 3
  replicas: 1
  selector:
    matchLabels:
      environment: production
      app: myapp
  template:
    metadata:
      labels:
        environment: production
        app: myapp
    spec:
      imagePullSecrets:
        - name: docker-token
      volumes:
        - name: vendor-dir
          emptyDir: {}
        - name: upload-dir
          emptyDir: {}
        - name: runtime-dir
          emptyDir: {}
        - name: assets-dir
          emptyDir: {}
        - name: host-config
          configMap:
            name: backend-host-config
      initContainers:
        - name: app-dependencies
          image: myimage
          imagePullPolicy: Always
          command: [ 'sh', '-c', 'composer install --no-interaction --classmap-authoritative' ]
          envFrom: &envFrom
            - secretRef:
                name: backend-env
          volumeMounts: &volumeMounts
            - mountPath: /var/www/vendor
              name: vendor-dir
            - mountPath: /var/www/web/upload
              name: upload-dir
            - mountPath: /var/www/runtime
              name: runtime-dir
        - name: app-migrations
          image: myimage
          imagePullPolicy: Always
          envFrom: *envFrom
          volumeMounts: *volumeMounts
          command: [ 'sh', '-c', './yii migrate --interactive=0' ]
        - name: app-cache-clear
          image: myimage
          imagePullPolicy: Always
          envFrom: *envFrom
          volumeMounts: *volumeMounts
          command: [ 'sh', '-c', './yii cache/flush-all --interactive=0' ]
      containers:
        - name: app
          securityContext:
            {}
          image: myimage
          imagePullPolicy: Always
          envFrom: *envFrom
          volumeMounts: *volumeMounts
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
            - name: https
              containerPort: 443
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /health
              port: http
          resources:
            {}
        - name: webapp
          image: nginx:alpine
          volumeMounts:
            - mountPath: /var/www/web/assets
              name: assets-dir
            - mountPath: /etc/nginx/conf.d
              name: host-config

host-config.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: backend-host-config
data:
  default.conf: |
    server {
      root /var/www/web;
      index index.php index.html index.htm;
  
      location /health {
          return 200;
      }
  
      sendfile off;
  
      location / {
           try_files $uri $uri/ /index.php$is_args$args;
      }
  
      location ~ \.php$ {
          try_files $uri /index.php =404;
          fastcgi_pass localhost:9000;
          fastcgi_index index.php;
          fastcgi_buffers 16 16k;
          fastcgi_buffer_size 32k;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          #fixes timeouts
          fastcgi_read_timeout 600;
          include fastcgi_params;
      }
  
      location ~ /\.ht {
          deny all;
      }
  
      location /.well-known/acme-challenge/ {
          root /var/www/letsencrypt/;
          log_not_found off;
      }
    }

ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-deployment
  labels:
    name: myapp
  annotations:
    kubernetes.io/ingressClassName: public
    nginx.ingress.kubernetes.io/backend-protocol: http
    nginx.ingress.kubernetes.io/client-body-buffer-size: 1M
    nginx.ingress.kubernetes.io/fastcgi-index: index.php
    nginx.ingress.kubernetes.io/fastcgi-params-configmap: default/fastcgi-config
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/http2-push-preload: "true"
spec:
  rules:
    - host: "myapp.site"
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              service:
                name: myapp-deployment
                port:
                  name: http

service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-deployment
  labels:
    app: myapp
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
    - port: 9000
      name: fastcgi
  selector:
    app: myapp
    environment: production

Вот логи, которые записываются при попытке зайти на сайт:
[ip] - - [26/Oct/2023:17:39:48 +0000] "GET / HTTP/1.1" 503 592 "-" [User-Agent] 472 0.000 [default-myapp-deployment-http] [] - - - - 0ac9bd0d9863ce5a065dba8b8b553321

kubectl get service myapp-deployment
NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
myapp-deployment     ClusterIP   10.152.183.181   <none>        80/TCP,9000/TCP   2d11h

kubectl get ingress
NAME                 CLASS    HOSTS          ADDRESS     PORTS   AGE
myapp-deployment     public   myapp.site     127.0.0.1   80      4h37m

Во всем этом меня смущает, что external-ip имеет значение "none" и Ingress имеет адрес 127.0.0.1. Перепробовал уже массу вариантов, но приблизиться к решению проблемы с 503 ошибкой пока никак не выходит. Буду рад любым подсказкам.
  • Вопрос задан
  • 258 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
  1. Точно ли обращение идет по хосту myapp.site указанному в ингрессе? Судя по логу - нет
  2. Что в kubectl get deploy и kubectl get pod? что в логах pod (kubectl logs myapp-deployment-...)?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы