Маршрутизация Traefik (ingressRoute) в Kubernetes (K8S)
Маршрутизация Traefik (ingressRoute) в Kubernetes (K8S)

Маршрутизация Traefik (ingressRoute) в Kubernetes (K8S)

Ван Сяньсен2023-08-172023-08-17

Введение в IngressRoute

kubernetes используется в Traefik ingress из ingressRoute актерское мастерство httphttpstcpudp

Официальная документация

три способа

В Traefik есть множество способов создания правил маршрутизации, например:

  • Родной Ingress Метод письма
  • использовать CRD IngressRoute Способ
  • использовать GatewayAPI из Способ

По сравнению с собственным методом записи Ingress, ingressRoute является новой функцией после версии 2.1. Проще говоря, они оба поддерживают маршрутизацию по пути (пути) и HTTP-маршрутизацию по имени домена (хоста), а также настройку HTTPS. Разница в том, что IngressRoute необходимо определить. расширение CRD, но оно поддерживает новые функции, такие как TCP, UDP-маршрутизация и промежуточное программное обеспечение, настоятельно рекомендуется использовать ingressRoute

Правила сопоставления

правило

описывать

Headers(key, value)

Проверьте, есть ли в заголовках пара ключ-значение.

HeadersRegexp(key, regexp)

Проверьте, есть ли в заголовках значение ключа, соответствующее регулярному выражению из пары ключ-значение.

Host(example.com, boysec.cn, …)

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

HostRegexp(example.com, {subdomain:[a-z]+}.example.com, …)

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

Method(GET, …)

Проверьте, является ли метод запроса да заданным изметодов(GET、POST、PUT、DELETE、ПАТЧ) в

Path(/path, /articles/{cat:[a-z]+}/{id:[0-9]+}, …)

Сопоставить конкретный путь запроса,он принимает последовательность текстаи Путь регулярного выражения

PathPrefix(/products/, /articles/{cat:[a-z]+}/{id:[0-9]+})

Соответствие конкретному пути префикса,он принимает последовательность текстаи Путь префикса регулярного выражения

Query(foo=bar, bar=baz)

Сопоставление параметров строки запроса,Принимать пары ключ=значение из пар ключ-значение

ClientIP(10.0.0.0/16, ::1)

Если запросить клиента IP да Данныйиз IP/CIDR один, он совпадает. он принимает IPv4、IPv6 и формат сегмента сети.

Демо через панель управления

Пройдите, как показано ниже IngressСоздать ресурсобъект:

Язык кода:javascript
копировать
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: traefik-dashboard
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: traefik # использовать traefk из IngressClass
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: ingress.od.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: traefik-v2
            port:
              number: 8090

доступ: http://ingress.od.com

Пройдите, как показано ниже ingressRouteСоздать ресурсобъект:

Язык кода:javascript
копировать
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
  namespace: kube-system
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`traefik.od.com`)  # Укажите доменное имя
    kind: Rule
    services:
    - name: api@internal
      kind: TraefikService

доступ:http://traefik.test.com

ingressRoute

HTTP-маршрутизация

достигать целей:Пользователи вне кластерапроходитьдоступhttp://whoami.od.com актерское будет запрошено, когда доменное имя будет мастерство в приложении whoami.

Создайте, как показано ниже из whoami Список распределения ресурсов

Язык кода:javascript
копировать
cat > whoami.yml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: whoami
spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
  selector:
    app: whoami
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoami
  labels:
    app: whoami
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: containous/whoami
          ports:
            - name: web
              containerPort: 80
EOF

Определите объект IngressRoute

Язык кода:javascript
копировать
cat > who-ing.yml <<EOF
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingressroute-demo
spec:
  entryPoints:
    - web
  routes:
    - match: Host(\`whoami.od.com\`) && PathPrefix(\`/notls\`)
      kind: Rule
      services:
        - name: whoami
          port: 80
EOF

проходить entryPoints Указывает точку входа для нашего приложения. web,То естьдапроходить 80 Доступ к порту, затем доступ изменен на да, чтобы соответствовать whoami.od.com это доменное имя и имеет /notls из префикса пути из запроса будет whoami этот Service совпало. Мы можем напрямую создать указанный выше объект ресурсов.,Затем сделайте соответствующий анализ доменного имени,Вот и вседоступприложение:http://whoami.od.com/notls

https маршрутизация

Если нам нужно использовать HTTPS Чтобы получить доступ к нашему приложению, вам необходимо отслеживать websecure этотточка входа,То естьдапроходить 443 Порт для доступа, также используйте HTTPS Для доступа к приложению требуется сертификат. Здесь мы используем сертификат. openssl создать самозаверяющий сертификат

Язык кода:javascript
копировать
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=whoami.od.com"

Затемпроходить Secret Объект для ссылки на файл сертификата:

Язык кода:javascript
копировать
# Обратите внимание, что имя файла сертификата должно быть да. tls.crt и tls.key
kubectl create secret tls who-tls --cert=tls.crt --key=tls.key

это мы можем создать HTTPS Посетите приложение IngressRoute Цель

TraefikIngress

Язык кода:javascript
копировать
cat >> who-ing.yml <<EOF
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingressroute-tls-demo
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(\`whoami.od.com\`) && PathPrefix(\`/tls\`)
      kind: Rule
      services:
        - name: whoami
          port: 80
  tls:
    secretName: who-tls
EOF
Язык кода:javascript
копировать
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingressroute-tls-demo2
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    traefik.ingress.kubernetes.io/router.tls: "true"
spec:
  tls:
    - secretName: who-tls
  rules:
  - host: whoami.od.com
    http:
      paths:
      - pathType: Prefix
        path: /ssl
        backend:
          service:
            name: whoami
            port:
              number: 80

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

Traefik доступ:https://whoami.od.com/tls

Ingress доступhttps://whoami.od.com/ssl

ingressRouteTCP

Простой TCP-сервис

Traefik2.X Уже поддерживается TCP Служитьиз, ниже мы используем mongo Давайте возьмем пример, чтобы понять Traefik как поддержать TCP Хороший сервис.

ingreeRouteTCP Официальная документация

Язык кода:javascript
копировать
cat > mongo.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-traefik
  labels:
    app: mongo-traefik
spec:
  selector:
    matchLabels:
      app: mongo-traefik
  template:
    metadata:
      labels:
        app: mongo-traefik
    spec:
      containers:
        - name: mongo
          image: mongo:5.0
          ports:
            - containerPort: 27017
---
apiVersion: v1
kind: Service
metadata:
  name: mongo-traefik
spec:
  selector:
    app: mongo-traefik
  ports:
    - port: 27017
EOF

После успешного создания вы можете mongo Служба настроена с использованием маршрута. потому что Traefik используется в TCP Требуется настройка маршрутизации SNISNI Зависимость снова TLS из, поэтому нам нужен сертификат конфигурации. Если сертификата нет, мы можем использовать подстановочный знак. * Для настройки создаем здесь IngressRouteTCP Тип из CRD объект (мы уже установили соответствующий из CRD ресурс)

Язык кода:javascript
копировать
cat > mongo-ingressroute-tcp.yaml <<EOF
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: mongo-traefik-tcp
spec:
  entryPoints:
    - mongo
  routes:
    - match: HostSNI(\`*\`)  # потому что Traefik используется в TCP Требуется настройка маршрутизации СНИ, в то время как SNI Зависимость снова TLS из, поэтому нам нужен сертификат конфигурации. Если сертификата нет, мы можем использовать подстановочный символ.*(Известные видыip) Может Конфигурация
      services:
        - name: mongo-traefik
          port: 27017
EOF

Обратите внимание здесьиз entryPoints Часть, да согласно нашему началу из Traefik изConfigMapстатический Конфигурациясерединаиз entryPoints Чтобы решить, мы можем сами добавить один для mongo Служитьиз Специализированный пункт пропуска. о entryPoints Точка входа из Для получения дополнительной информации вы можете просмотреть документацию entrypoints Узнать больше.

Язык кода:javascript
копировать
vim cm.yml
...
   entryPoints:
      web:
        address: ":80"
      websecure:
        address: ":443"
      traefik:
        address: ":8090"
      metrics:
        address: ":9100"
      mongo:
        address: ":27017"        # Конфигурация порта 27017, как вход монго
...

Затем обновите Traefik и перезапустите.

Язык кода:javascript
копировать
kubectl apply -f cm.yml
kubectl delete pods -n kube-system -l app=traefix-v2

После завершения создания мы также можем перейти к Traefik из Dashboard Проверьте, вступает ли оно в силу на странице:

Затем настраиваем доменное имя mongo.local разобрать на Traefik Местосуществоватьизузел,Затемпроходить 27017 порт для подключения mongo Служить:

TCP с сертификатом TLS

Выше мы разворачиваем из mongo даа обычно из Служить, потом использовать Traefik актерское мастерствоиз, но да иногда для безопасности mongo Сам сервис также использует TLS Предоставьте Служить в виде сертификата из, поместите вышеуказанный сертификат в certs каталог, а затем создаем новый tls-mongo изкаталога,существуют Выполните следующую команду в этом каталоге, чтобы создать сертификат:

Язык кода:javascript
копировать
# Создать корневой сертификат
#-x509: Используется для создания самозаверяющего сертификата. Это не требуется, если вам не нужен самозаверяющий сертификат.
#-days: Срок действия сертификата, по умолчанию – 365 дней.
#Введите параметры напрямую и введите пароль напрямую.
openssl req -out ca.pem -new -x509 -days 3650 -subj "/C=CN/ST=BeiJing/O=Boysec/CN=server1/CN=Boysec/emailAddress=wangxiansen@boysec.cn"
#Просто используйте свой пароль, passwd

# Создать закрытый ключ сертификата
openssl genrsa -out server.key 2048

# Создание файлов приложения сертификата cat server.req
# CN=mongo.local Машина дамонго запускает информацию об имени домена узла. Если она не совпадает, будет сообщено об ошибке.
openssl req -key server.key -new -out server.req -subj "/C=CN/ST=BeiJing/O=Boysec/CN=server1/CN=Boysec/CN=mongo.local/emailAddress=wangxiansen@boysec.cn"

# Создать сертификат
openssl x509 -req -in server.req -CA ca.pem -CAkey privkey.pem -CAcreateserial -out server.crt -days 3650

# Объединить закрытый ключ и открытый ключ,Создать файл server.pem
cat server.key server.crt > server.pem

существовать tls-mongo/certs Выполните следующую команду в каталоге Secret чтобы включить содержимое сертификата:

Язык кода:javascript
копировать
$ kubectl create secret tls mongo-certs --cert=server.crt --key=server.key

Затем обновите еще раз IngressRouteTCP объект, увеличение TLS Конфигурация:

Язык кода:javascript
копировать
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: mongo-traefik-tcp
spec:
  entryPoints:
    - mongo
  routes:
    - match: HostSNI(`mongo.local`)
      services:
        - name: mongo-traefik
          port: 27017
  tls:
    secretName: mongo-certs

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

Язык кода:javascript
копировать
$ mongo --host mongo.local --port 27017 --ssl --sslCAFile=./ca.pem --sslPEMKeyFile=./server.pem
MongoDB shell version v4.4.24
connecting to: mongodb://mongo.local:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("4a8a66b1-7371-415f-b353-23d71648e054") }
MongoDB server version: 5.0.5
WARNING: shell and server versions do not match
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

Вы можете видеть, что соединение успешно существует, что завершает использование. TLS Сертификатактерское мастерство TCP Служитьиз функции, если мы используем для подключения другие доменные имена, будет сообщено об ошибке, потому что сейчас мы указываем изда конкретного из HostSNI:

Язык кода:javascript
копировать
mongo --host traefik.od.com --port 27017 --ssl --sslCAFile=./ca.pem --sslPEMKeyFile=./server.pem
{"t":{"$date":"2023-07-22T03:52:20.300Z"},"s":"W",  "c":"CONTROL",  "id":23321,   "ctx":"main","msg":"Option: This name is deprecated. Please use the preferred name instead.","attr":{"deprecatedName":"ssl","preferredName":"tls"}}
{"t":{"$date":"2023-07-22T03:52:20.300Z"},"s":"W",  "c":"CONTROL",  "id":23321,   "ctx":"main","msg":"Option: This name is deprecated. Please use the preferred name instead.","attr":{"deprecatedName":"sslPEMKeyFile","preferredName":"tlsCertificateKeyFile"}}
{"t":{"$date":"2023-07-22T03:52:20.300Z"},"s":"W",  "c":"CONTROL",  "id":23321,   "ctx":"main","msg":"Option: This name is deprecated. Please use the preferred name instead.","attr":{"deprecatedName":"sslCAFile","preferredName":"tlsCAFile"}}
MongoDB shell version v4.4.24
connecting to: mongodb://k8s.mongo.local:27017/?compressors=disabled&gssapiServiceName=mongodb
Error: couldn't connect to server k8s.mongo.local:27017, connection attempt failed: HostNotFound: Could not find address for k8s.mongo.local:27017: SocketException: Host not found (authoritative) :
connect@src/mongo/shell/mongo.js:374:17
@(connect):2:6
exception: connect failed
exiting with code 1

ingressRouteUDP

также Traefik2.3.x Также были предоставлены версии для UDP из поддерживается, поэтому мы можем использовать его для таких вещей, как DNS Разбор из Служить обеспечивает нагрузку. Также сначала разверните один, как показано ниже, из UDP Служить:

Язык кода:javascript
копировать
apiVersion: v1
kind: Service
metadata:
  name: whoamiudp
spec:
  ports:
    - protocol: UDP
      name: udp
      port: 8080
  selector:
    app: whoamiudp
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoamiudp
  labels:
    app: whoamiudp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoamiudp
  template:
    metadata:
      labels:
        app: whoamiudp
    spec:
      containers:
        - name: whoamiudp
          image: containous/whoamiudp
          ports:
            - name: udp
              containerPort: 8080

После завершения развертывания нам необходимо существование Traefik Определите один в UDP из entryPoint Точка входа, измените наше развертывание Traefik из ConfigMap файл, добавить UDP Протокол точки входа:

Язык кода:javascript
копировать
...
    entryPoints:
      web:
        address: ":80"          ## Конфигурация 80 порт и установите имя записи web
      websecure:
        address: ":443"         # Конфигурация443порт и установите имя записи websecure
      traefik:
        address: ":8090"        ## Конфигурация 8090 порт и установите имя записи dashboard
      metrics:
        address: ":9100"        ## Конфигурация 9100 Порт, используемый как вход в сбор метрик.
      mongo:
        address: ":27017"        # Конфигурация порт 9200, как TCP вход
      udpep:
        address: ":9300/udp"    # Конфигурация порта 9300, как вход udp
...

Затем обновите Traefik и перезапустите.

Язык кода:javascript
копировать
kubectl apply -f cm.yml
kubectl delete pods -n kube-system -l app=traefix-v2

UDP после того, как точка входа успешно добавлена, мы можем создать IngressRouteUDP Тип изресурсобъект,используется дляактерское мастерство UDP просить:

Язык кода:javascript
копировать
cat <<EOF | kubectl apply -f -
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteUDP
metadata:
  name: whoamiudp
spec:
  entryPoints:
  - udpep
  routes:
  - services:
    - name: whoamiudp
      port: 8080
EOF
$  kubectl get ingressrouteudp
NAME        AGE
whoamiudp   27s

После успешного создания сначала устанавливаем существующий кластер на диск. Service Заходите в гости выше из UDP приложение:

Язык кода:javascript
копировать
$ kubectl get svc
NAME            TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)     AGE
whoamiudp       ClusterIP   192.168.145.194   <none>        8080/UDP    112s

$ echo "WHO" | socat - udp4-datagram:192.168.145.194:8080
Hostname: whoamiudp-7d968ff858-c425d
IP: 127.0.0.1
IP: 172.16.130.8
$ echo "wangxiansen" | socat - udp4-datagram:192.168.145.194:8080            
Received: wangxiansen

Мы открываем приложение, когда печатаем WHO из, он распечатает доступ из Pod из Hostname Если эта информация отсутствует, печатается полученная строка. Сейчас мы существуем Traefik Местосуществоватьузелиз IP (mongo.local) против. 9300 порт для доступа UDP Подать заявку на тестирование:

Мы видим, что тест прошел успешно. Чтобы доказать это, я воспользуюсь. Traefik Приходитьактерское мастерство UDP Заявка прошла успешно. кроме Traefik Есть еще много Функция,особенныйдамощныйизсерединапромежуточное программное обеспечениеи Пользовательский плагиниз Функция(Следующая глава),Предоставляет нам возможность постоянно расширять свою функциональность.,Мы можем осуществлять вторичное развитие в соответствии с нашими собственными потребностями.

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.