Обеспечьте балансировку нагрузки, виртуальный хостинг на основе имени и SSL-терминацию.

Введение

В этом руководстве показано, как использовать Traefik в качестве контроллера входящего трафика в Kubernetes (или k8s) для обеспечения балансировки нагрузки, виртуального хостинга на основе имени и терминации SSL.

Чтобы следовать этому руководству, вам нужно.

  • Работающий кластер Kubernetes или управляемый Kubernetes
  • Балансировщик нагрузки, который динамически распределяет ваш трафик на любой ресурс Kubernetes, помеченный как LoadBalancer.
  • PRIMARY_DOMAIN

Примечание. В этом посте я использую домен PRIMARY_DOMAIN, пожалуйста, измените его соответствующим образом. Если вам нужен домен paulsblog.dev, замените PRIMARY_DOMAIN на paulsblog.dev.

Что такое Ingress-контроллер?

Ingress Controller — это объект API, который будет управлять внешним доступом к любой развернутой службе в кластере Kubernetes. Обычно используется HTTP или HTTPS. Кроме того, он обеспечивает балансировку нагрузки, виртуальный хостинг на основе имени и терминацию SSL.

Зачем вам Ingress Controller?

Этот список покажет наиболее важные преимущества использования Ingress Controller в кластере Kubernetes:

  • Балансировка нагрузки любого трафика между каждой службой, развернутой за пределами кластера Kubernetes.
  • Разрешите HTTP-трафик между службами внутри кластера, но примените HTTPS-трафик из-за пределов кластера Kubernetes при прекращении шифрования.
  • Упростите взаимодействие между внутренними службами и при необходимости перенаправьте маршрут, изменив правило маршрутизации входящего трафика.

Подготовьте среду Kubernetes

Установка Helm, диспетчера пакетов Kubernetes

Чтобы установить Helm в свой кластер Kubernetes, вы можете использовать официальный скрипт установки Helm, который автоматически установит последнюю версию.

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

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

Настройте kubectl для доступа к кластеру Kubernetes

Если используется kubectl, вы можете использовать три разных метода работы с кластером:

1. Используйте флаг --kubeconfig для каждой команды:

kubectl get pods --kubeconfig=config1
kubectl get pods --kubeconfig=config2

2. Используйте переменную среды KUBECONFIG:

export KUBECONFIG=config1 
kubectl get pods
kubectl get all

export KUBECONFIG=config2
kubectl get pods
kubectl get all

3. Скопируйте файл конфигурации в $HOME/.kube/config

Подготовьте диаграмму руля

Чтобы установить Traefik, вы должны добавить официальный репозиторий Traefik Helm в свой клиент Helm. Это можно сделать, выполнив:

helm repo add traefik https://helm.traefik.io/traefik
helm repo update

После этого вам нужно настроить диаграмму Helm, создав файл values.yaml. Все возможные значения можно найти в GitHub диаграммы Traefik Helm и они будут использоваться для установки статической конфигурации прокси Traefik.

Теперь вы должны создать values.yaml и вставить в него следующее:

---
additionalArguments:
  - --entrypoints.websecure.http.tls.certresolver=ionos
  - --entrypoints.websecure.http.tls.domains[0].main=PRIMARY_DOMAIN
  - --entrypoints.websecure.http.tls.domains[0].sans=*.PRIMARY_DOMAIN
  - --certificatesresolvers.ionos.acme.dnschallenge.provider=ionos
  - --certificatesresolvers.ionos.acme.email=webmaster@PRIMARY_DOMAIN
  - --certificatesresolvers.ionos.acme.dnschallenge.resolvers=1.1.1.1
  - --certificatesresolvers.ionos.acme.storage=/data/acme.json

deployment:
  initContainers:
    - name: volume-permissions
      image: busybox:1.31.1
      command: ["sh", "-c", "chmod -Rv 600 /data/*"]
      volumeMounts:
        - name: data
          mountPath: /data

env:
  - name: IONOS_API_KEY
    valueFrom:
      secretKeyRef:
        key: IONOS_API_KEY
        name: ionos-api-credentials

ingressRoute:
  dashboard:
    enabled: false

persistence:
  enabled: true
  path: /data
  size: 128Mi

Этот values.yaml используется для настройки прокси-сервера Traefik и будет:

  • используйте IONOS в качестве преобразователя сертификатов. Чтобы найти своего провайдера, обратитесь к документации traefik
  • установите основной домен сертификатов на PRIMARY_DOMAIN
  • установите без сертификатов значение *.PRIMARY_DOMAIN
  • хранить каждый сгенерированный сертификат в /data/acme.json
  • запустите контейнер инициализации busybox, чтобы исправить распространенную проблему с правами доступа, описанную здесь: https://github.com/containous/traefik/issues/6972
  • загрузить IONOS_API_KEY из секрета. Если вы используете какой-либо другой провайдер, добавьте все необходимые переменные среды.
  • деактивировать панель инструментов Traefik
  • включить постоянство для прокси-сервера Traefik

Установите Traefik Proxy в качестве входного контроллера

Чтобы установить Traefik Proxy в свой кластер Kubernetes, выполните следующие четыре простых шага.

1. Начните с создания пространства имен Kubernetes:

kubectl create namespace traefik

2. Создайте treafik-secret.yaml, который будет содержать секрет, используемый в диаграмме Helm для создания SSL-сертификата:

---
apiVersion: v1
kind: Secret
metadata:
  name: ionos-api-credentials
  namespace: traefik

type: Opaque
stringData:
  IONOS_API_KEY: asdkjalshdasdlasdasd.asdahsdhasdkjahsdkasgdkasdg;aksda;d

3. Примените секрет в своем кластере Kubernetes:

kubectl apply -f traefik-secret.yaml

4. Установите Traefik с помощью Helm и примените values.yaml

helm install traefik traefik/traefik --namespace=traefik --values=values.yaml

Если вы что-то изменили в values.yaml и хотите обновить прокси-сервер Traefik, это можно сделать, выполнив:

helm upgrade traefik traefik/traefik --namespace=traefik --values=values.yaml

Через несколько минут ваш Traefik развернут правильно, и вы можете сопоставить запись PRIMARY_DOMAIN A с IP-адресом балансировщика нагрузки Traefik. Вы можете найти внешний IP-адрес, выполнив:

kubectl get all -n traefik

Он должен вывести следующее:

Если внешний IP-адрес не установлен, подождите некоторое время и повторите попытку. Если вы не получили внешний IP, возможно, у вас не установлен/не куплен внешний балансировщик нагрузки.

Включить панель управления Traefik

Чтобы включить панель мониторинга Traefik в кластере Kubernetes, вам потребуется создать маршрут Ingress и промежуточное ПО для включения базовой аутентификации.

Создайте новую папку с именем traefik-dashboard, которая будет содержать все файлы для настройки панели управления Traefik.

Теперь создайте пользователя и пароль в кодировке base64, которые будут использоваться в секрете Kubernetes:

htpasswd -nb superTraefikUser unbelievableSafePassword | openssl base64

После этого скопируйте строку htpasswd и создайте секрет Kubernetes 001-auth-secret.

---
apiVersion: v1
kind: Secret
metadata:
  name: traefik-dashboard-auth
  namespace: traefik

data:
  users: YOUR_UNBELIEVABLE_SECURE_HTPASSWD_STRING

Затем создайте промежуточное ПО Kubernetes 002-middleware, которое будет использовать базовый секрет аутентификации:

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: traefik-dashboard-basicauth
  namespace: traefik

spec:
  basicAuth:
    secret: traefik-dashboard-auth

Теперь вы можете создать входящий маршрут 003-ingressroute для панели инструментов Traefik:

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
  namespace: traefik

spec:
  entryPoints:
    - websecure

  routes:
    - match: Host(`traefik.PRIMARY_DOMAIN`)
      kind: Rule
      middlewares:
        - name: traefik-dashboard-basicauth
          namespace: traefik
      services:
        - name: api@internal
          kind: TraefikService

Если вы назвали файлы, как описано, у вас должна быть следующая файловая структура:

traefik-dashboard
--001-auth-secret
--002-middleware
--003-ingressroute

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

kubectl apply -f traefik-dashboard

Через несколько минут панель инструментов Traefik будет подключена к сети и доступна по ее домену (https://traefik.PRIMARY_DOMAIN).

Заключительные примечания

Я надеюсь, что эта статья дала вам быстрый и четкий обзор того, как настроить Traefik Proxy в качестве Ingress Controller в вашем кластере Kubernetes.

Использование Helm для настройки контроллера Traefik Ingress упрощает установку, перенастройку и обновление прокси-сервера Traefik.

С помощью этой настройки вы можете развернуть любой модуль/службу Kubernetes и использовать IngressRoute, чтобы сделать его доступным через SSL с любым поддоменом.

Я хотел бы услышать ваши отзывы об этом уроке. Кроме того, если вы уже запустили установку Traefik и используете другой подход, прокомментируйте здесь и объясните, что вы сделали по-другому. Также, если у вас есть вопросы, задавайте их в комментариях. Я отвечу на них, если это возможно.

Не стесняйтесь связаться со мной в мой блог, LinkedIn, Twitter и GitHub.

Эта статья изначально была опубликована в моем блоге по адресу https://www.paulsblog.dev/how-to-install-traefik-ingress-controller-in-kubernetes/