Настройка robots.txt в Kubernetes Image source

Настройка robots.txt в Kubernetes

Представьте себе, что на ваших плечах лежит инфраструктура около дюжины проектов, которые написаны на разных языках программирования и имеют свой стек технологий. Некоторые из них совсем свежие и используют самые современные веяния веб-индустрии, а другие – кладезь легаси и устаревшего кода.

У каждого из этих проектов, помимо продового, есть еще 1-3 окружения для тестирования. И вот вам, как DevOps инженеру прилетает следующая задача: нужно для каждого тестового окружения добавить robots.txt файл, который будет запрещать поисковикам индексацию.

Есть несколько способов, как это сделать, но я нашел самый простой и оптимальный.

Конечно, можно заставить всех бекендеров добавить этот файл в каждый проект, но это сложный подход, который DevOps инженер не контролирует. Поэтому мы пойдем по другому пути.

Решение очень зависит от используемых вами технологий. У нас используются следущие:

Каждый из этих инструментов вносит свои улучшения в решение этой задачи.

Чистый Kubernetes #

Если у вас используется чистый Kubernetes без установленного Nginx Ingress, то у вас есть 2 пути.

Nginx #

Вы можете взять самый легкий чистый образ с Nginx, куда с помощью ConfigMap примонтировать как конфиг сервера, так и содержимое файла robots.txt. После этого достаточно только настроить Ingress на то, чтобы он все запросы на /robots.txt направлял в этот контейнер.

Примеры конфигов приводить не буду, так как есть вариант получше.

“Robots Disallow” #

Второе, еще более простое решение, это взять wikiwi/robots-disallow образ в Docker Hub. Принцип работы абсолютно такой же, только теперь не придется ничего настраивать. Только Ingress.

Ingress Nginx #

Если вы еще не установили его себе в кластер, то я вам настоятельно рекомендую это сделать. Это мощный инструмент, который умеет делать все, что умеет Nginx, но имеет такой же подход к использованию, как и все сущности в Kubernetes.

Вы только посмотрите на количество параметров, которые можно настроить через аннотации или конфиг мапы.

В общем, этим мы и воспользуемся, чтобы решить поставленную задачу. Достаточно добавить в Ingress приложения следующие строки:

metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/server-snippet: |
      location = /robots.txt {
        add_header Content-Type text/plain;
        return 200 'User-agent: *\nDisallow: /\n';
      }

Да, Nginx умеет не только выдавать статику или проксировать запросы. Он может генерировать ответ самостоятельно. Строка return 200 'Content' именно это и делает.

Таким образом, мы решили задачу буквально в 5 строк.

Helm #

В этой ситуации Helm не делает ничего особенного, но позволяет переиспользовать один манифест в разных окружениях. В простейшем его использовании, Helm по своей сути является шаблонизатором для конфигов Kubernetes.

Поэтому можно сделать так:

{{- if ne .Values.env "production" }}
nginx.ingress.kubernetes.io/server-snippet: |
  location = /robots.txt {
    add_header Content-Type text/plain;
    return 200 'User-agent: *\nDisallow: /\n';
  }
{{- end }}

То есть если окружение не продовое, запрещаем поисковикам индексирование.

Либо так, если хочется большей власти:

{{- if .Values.disallowRobots }}
nginx.ingress.kubernetes.io/server-snippet: |
  location = /robots.txt {
    add_header Content-Type text/plain;
    return 200 'User-agent: *\nDisallow: /\n';
  }
{{- end }}

Пользуйтесь на здоровье :fox: