Ван Сяньсен2023-08-172023-08-17
kubernetes используется в Traefik ingress из ingressRoute актерское мастерство http
、https
、tcp
、udp
。
В Traefik есть множество способов создания правил маршрутизации, например:
Ingress
Метод письма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
Создать ресурсобъект:
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
Создать ресурсобъект:
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
достигать целей:Пользователи вне кластерапроходитьдоступhttp://whoami.od.com актерское будет запрошено, когда доменное имя будет мастерство в приложении whoami.
Создайте, как показано ниже из whoami
Список распределения ресурсов
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
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 Чтобы получить доступ к нашему приложению, вам необходимо отслеживать websecure
этотточка входа,То естьдапроходить 443 Порт для доступа, также используйте HTTPS Для доступа к приложению требуется сертификат. Здесь мы используем сертификат. openssl
создать самозаверяющий сертификат
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=whoami.od.com"
Затемпроходить Secret Объект для ссылки на файл сертификата:
# Обратите внимание, что имя файла сертификата должно быть да. tls.crt и tls.key
kubectl create secret tls who-tls --cert=tls.crt --key=tls.key
это мы можем создать HTTPS Посетите приложение IngressRoute Цель
TraefikIngress
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
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
Traefik2.X Уже поддерживается TCP Служитьиз, ниже мы используем mongo Давайте возьмем пример, чтобы понять Traefik как поддержать TCP Хороший сервис.
ingreeRouteTCP Официальная документация
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 Требуется настройка маршрутизации SNI
,и SNI
Зависимость снова TLS
из, поэтому нам нужен сертификат конфигурации. Если сертификата нет, мы можем использовать подстановочный знак. *
Для настройки создаем здесь IngressRouteTCP
Тип из CRD объект (мы уже установили соответствующий из CRD ресурс)
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 Узнать больше.
vim cm.yml
...
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
traefik:
address: ":8090"
metrics:
address: ":9100"
mongo:
address: ":27017" # Конфигурация порта 27017, как вход монго
...
Затем обновите Traefik и перезапустите.
kubectl apply -f cm.yml
kubectl delete pods -n kube-system -l app=traefix-v2
После завершения создания мы также можем перейти к Traefik из Dashboard Проверьте, вступает ли оно в силу на странице:
Затем настраиваем доменное имя mongo.local
разобрать на Traefik Местосуществоватьизузел,Затемпроходить 27017 порт для подключения mongo Служить:
Выше мы разворачиваем из mongo даа обычно из Служить, потом использовать Traefik актерское мастерствоиз, но да иногда для безопасности mongo Сам сервис также использует TLS Предоставьте Служить в виде сертификата из, поместите вышеуказанный сертификат в certs каталог, а затем создаем новый tls-mongo
изкаталога,существуют Выполните следующую команду в этом каталоге, чтобы создать сертификат:
# Создать корневой сертификат
#-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 чтобы включить содержимое сертификата:
$ kubectl create secret tls mongo-certs --cert=server.crt --key=server.key
Затем обновите еще раз IngressRouteTCP
объект, увеличение TLS Конфигурация:
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
После того же обновления,Теперь существуют, если мы напрямую обратимся к приложению, мы зависнем.,Потому что мы не предоставили сертификат,Когда это мы сможем использовать сертификат для подключения
$ 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:
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
также Traefik2.3.x Также были предоставлены версии для UDP из поддерживается, поэтому мы можем использовать его для таких вещей, как DNS Разбор из Служить обеспечивает нагрузку. Также сначала разверните один, как показано ниже, из UDP Служить:
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 Протокол точки входа:
...
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 и перезапустите.
kubectl apply -f cm.yml
kubectl delete pods -n kube-system -l app=traefix-v2
UDP после того, как точка входа успешно добавлена, мы можем создать IngressRouteUDP
Тип изресурсобъект,используется дляактерское мастерство UDP просить:
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 приложение:
$ 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 Есть еще много Функция,особенныйдамощныйизсерединапромежуточное программное обеспечениеи Пользовательский плагиниз Функция(Следующая глава),Предоставляет нам возможность постоянно расширять свою функциональность.,Мы можем осуществлять вторичное развитие в соответствии с нашими собственными потребностями.