Проблема с конфигурацией Ingress и nginx

У меня есть контейнерное приложение, и я пытаюсь передать заголовок proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; из моего nginx в мое приложение rails.

но когда я использую этот заголовок, датчики готовности и живости начинают давать сбой со статусом 502 and awaiting headers, и мое развертывание не завершается успешно.

Вот результат kubectl describe pod, где мы видим 502

  Warning  Unhealthy  11m                   kubelet, gke-cluster-1-upgraded-pool--v82p  Liveness probe failed: Get http://10.16.0.1:3000/users/sign_in: dial tcp 10.16.0.221:3000: connect: connection refused
  Warning  Unhealthy  11m                   kubelet, gke-cluster-1-upgraded-pool--v82p  Readiness probe failed: HTTP probe failed with statuscode: 502
  Warning  Unhealthy  11m                   kubelet, gke-cluster-1-upgraded-pool--v82p  Liveness probe failed: HTTP probe failed with statuscode: 502
  Warning  Unhealthy  11m                   kubelet, gke-cluster-1-upgraded-pool--v82p  Readiness probe failed: Get http://10.16.0.1:3000/users/sign_in: dial tcp 10.16.0.221:3000: connect: connection refused
  Warning  Unhealthy  11m                   kubelet, gke-cluster-1-upgraded-pool--v82p  Liveness probe failed: Get http://10.16.0.1:3000/users/sign_in: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
  Warning  BackOff    84s (x33 over 8m56s)  kubelet, gke-cluster-1-upgraded-pool--v82p  Back-off restarting failed container

Ранее значение заголовка было proxy_set_header X-Forwarded-For $http_x_forwarded_for;

ниже соответствующая часть моего nginx.conf

http {
  set_real_ip_from 1.2.3.4; -- example ip
  real_ip_header X-Forwarded-For;
  real_ip_recursive on;

  server {
    listen 80 default_server;
    server_name _;
    client_max_body_size 16m;
    location @app {
      proxy_pass http://127.0.0.1:3000;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    }
  }
}

ниже мой файл развертывания, я попытался сохранить только соответствующие части и удалил крепления volumne и настройки подключения к базе данных.

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: backend

spec:
  template:
    metadata:
      labels:
        app: backend
    spec:
      initContainers:
        - name: nginx-config
          image: my_nginx
          command: ['/bin/sh', '-c']
          args: ["sed -i -e 's/gzip_types/gzip_types application\\/json/g' /etc/nginx/nginx.conf && mv /etc/nginx/* /etc/nginx-new/"]
          volumeMounts:
            - name: nginx-config
              mountPath: /etc/nginx-new
        - name: copy-assets
          image: unicorn_image
          command: ['sh', '-c', 'cp -a /app/public/* /mnt/']
          volumeMounts:
            - name: assets
              mountPath: /mnt
      containers:
        - name: unicorn
          image: unicorn_image
          ports:
            - containerPort: 3000
          env:
          livenessProbe:
            httpGet:
              path: /users/sign_in
              port: 3000
              scheme: HTTP
            initialDelaySeconds: 10  
          readinessProbe:
            httpGet:
              path: /users/sign_in
              port: 3000
              scheme: HTTP
            initialDelaySeconds: 10  
        - name: nginx
          image: my_nginx
          ports:
            - containerPort: 80
          livenessProbe:
            httpGet:
              path: /users/sign_in
              port: 80
              scheme: HTTP
            initialDelaySeconds: 10  
          readinessProbe:
            httpGet:
              path: /users/sign_in
              port: 80
              scheme: HTTP
            initialDelaySeconds: 10  
          volumeMounts:
            - name: assets
              mountPath: /var/www
              readOnly: true
            - name: nginx-config
              mountPath: /etc/nginx

Обновление: я вижу, что контейнер nginx не создается. Пожалуйста, смотрите ниже

kubectl exec -it backend-6f4974cfd6-jtnqk -c nginx -- /bin/bash error: unable to upgrade connection: container not found ("nginx")

Не уверен, как обновление заголовка вызывает проблему.

может ли кто-нибудь указать мне в правильном направлении, как я могу это исправить, спасибо.


person opensource-developer    schedule 17.09.2019    source источник
comment
не могли бы вы поделиться конфигурацией .yml k8s   -  person error404    schedule 17.09.2019
comment
привет @ error404, я обновил вопрос с помощью файла конфигурации развертывания   -  person opensource-developer    schedule 17.09.2019
comment
@ error404, я опубликовал еще одно обновление вопроса   -  person opensource-developer    schedule 17.09.2019


Ответы (1)


1. В соответствии со вторым вопросом добавьте volumes и emptyDir или hostPath в ваш deployment.spec.template.spec section

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      initContainers:
      - name: ubuntu
        image: ubuntu
        command: ["/bin/sh"]
        args: ["-c", " echo test > /test1/index.html "]
        volumeMounts:
        - name: nginx-index
          mountPath: /test1
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-index
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nginx-index
        emptyDir: {}

2. Если вы используете стандартный образ nginx, имейте в виду, что предоставление args and commands изменит точку входа f..e определено в Dockerimage

3. На мой взгляд, будет лучше использовать configMap, чтобы указать конкретную конфигурацию в nginx

Надеюсь на эту помощь

person Mark    schedule 17.09.2019
comment
привет @Hanx, у меня уже есть том emprtyDir, но я не вставил его в вопрос, так как подумал, что это может быть неактуально. Однако я действительно застрял и не могу понять, как добавление заголовка может нарушить развертывание. - person opensource-developer; 17.09.2019
comment
взгляните на этот пример - person Mark; 17.09.2019