Проверка работоспособности Kubernetes не удалась с пользовательской конфигурацией Nginx веб-сервера - PullRequest
1 голос
/ 01 мая 2020

Мои проверки работоспособности завершаются неудачно со следующей настройкой.

nginx .conf

user                            root;
worker_processes                auto;

error_log                       /var/log/nginx/error.log warn;

events {
    worker_connections          1024;
}

http {
    server {
        listen                  80;
        server_name             subdomain.domain.com
        auth_basic              "Restricted";
        auth_basic_user_file    /etc/nginx/.htpasswd;
    }
    server {
        listen                  80;
        auth_basic              off;
    }
    server {
        listen                  2222;
        auth_basic              off;
        location /healthz {
            return 200;
        }
    }
}

DOCKERFILE

FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
VOLUME /usr/share/nginx/html
COPY /server/nginx.conf /etc/nginx/
COPY /server/htpasswd /etc/nginx/.htpasswd
CMD ["nginx", "-g", "daemon off;"]
EXPOSE 80
EXPOSE 2222

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: my-namespace
  labels:
    app: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: gcr.io/GOOGLE_CLOUD_PROJECT/my-app
          ports:
            - containerPort: 80
            - containerPort: 2222
          livenessProbe:
            httpGet:
              path: /healthz
              port: 2222
          readinessProbe:
            httpGet:
              path: /healthz
              port: 2222

Это определенно работает, когда я удаляю строку «имя_сервера» в nginx .conf и удаляю второй блок сервера. Может ли это быть проблемой с входом / балансировщиком нагрузки, так как я не знаю, сколько времени занимает обновление (вчера я испытал здоровый модуль go, нездоровый после нескольких минут). Запуск его на Google Kubernetes Engine (GKE) с собственным входным контроллером Google (не NGINX входной!)

Что я делаю не так?

1 Ответ

1 голос
/ 04 мая 2020

Проблема заключалась в том, что балансировщик нагрузки GKE выполняет собственные проверки работоспособности. Они смотрят на / по умолчанию и ожидают 200 в ответ. Только когда проверки работоспособности в развертывании / модуле объявляют другой путь, проверка работоспособности балансировщика нагрузки будет выбирать эти пути.

Балансировщик нагрузки предоставляется после применения входного YAML. Любые изменения в развертывании или входе, которые влияют на балансировщик нагрузки, не будут приняты, пока балансировщик нагрузки работает. Это означает, что мне сначала пришлось удалить балансировщик нагрузки, а затем применить YAML для развертывания, обслуживания и входа (затем вход автоматически устанавливает балансировщик нагрузки). Вместо удаления балансировщика нагрузки можно вручную ввести правильный путь (и подождать несколько минут).

Поскольку кажется, что балансировщик нагрузки выполняет проверки работоспособности на каждом открытом порту, я удалил свой порт 2222 и добавил местоположение / работоспособность для каждого блока сервера с портом 80 в nginx с отключенным auth_basi c.

См .: https://cloud.google.com/load-balancing/docs/health-check-concepts и { ссылка } и { ссылка }

Новый nginx .conf

user                            root;
worker_processes                auto;

error_log                       /var/log/nginx/error.log warn;

events {
    worker_connections          1024;
}

http {
    server {
        listen                  80;
        server_name             subdomain1.domain.com;
        root                    /usr/share/nginx/html;
        index                   index.html;
        auth_basic              "Restricted";
        auth_basic_user_file    /etc/nginx/.htpasswd_subdomain1;
        location /healthz {
            auth_basic          off;
            allow               all;
            return              200;
        }
    }
    server {
        listen                  80;
        server_name             subdomain2.domain.com;
        root                    /usr/share/nginx/html;
        index                   index.html;
        auth_basic              "Restricted";
        auth_basic_user_file    /etc/nginx/.htpasswd_subdomain2;
        location /healthz {
            auth_basic          off;
            allow               all;
            return              200;
        }
    }
    server {
        listen                  80;
        server_name             domain.com www.domain.com;
        root                    /usr/share/nginx/html;
        index                   index.html;
        auth_basic              "Restricted";
        auth_basic_user_file    /etc/nginx/.htpasswd_domain;
        location /healthz {
            auth_basic          off;
            allow               all;
            return              200;
        }
    }
    ## next block probably not necessary
    server {
        listen                  80;
        auth_basic              off;
        location /healthz {
            return              200;
        }
    }
}

мое новое развертывание. Yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: my-namespace
  labels:
    app: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: gcr.io/GOOGLE_CLOUD_PROJECT/my-app
          ports:
            - containerPort: 80
          livenessProbe:
            httpGet:
              path: /healthz
              port: 80
          readinessProbe:
            httpGet:
              path: /healthz
              port: 80
...