Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
k8s:nets [2024/09/04 04:48] admin [Доступ к приложению из вне] |
k8s:nets [2024/11/10 13:15] (текущий) admin |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ===== Сервисы/ | + | ====== Сервисы/ |
- | ==== Services ==== | + | ===== Services |
Для доступа к поду (наборам подов) используются сервисы (service). Service - абстракция, | Для доступа к поду (наборам подов) используются сервисы (service). Service - абстракция, | ||
Строка 20: | Строка 20: | ||
targetPort: 8080 | targetPort: 8080 | ||
</ | </ | ||
+ | |||
+ | Типы сервисов: | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
Строка 90: | Строка 96: | ||
- | === Endpoint === | + | ==== Endpoint |
**kubectl get ep**\\ | **kubectl get ep**\\ | ||
В случае сервисов использующих селекторы, | В случае сервисов использующих селекторы, | ||
Строка 105: | Строка 111: | ||
- | + | ===== Доступ к приложению ===== | |
- | ==== Доступ к приложению ==== | + | |
==== ClusterIP ==== | ==== ClusterIP ==== | ||
Сервис k8s по умолчанию. Обеспечивает сервис внутри кластера, | Сервис k8s по умолчанию. Обеспечивает сервис внутри кластера, | ||
Строка 142: | Строка 146: | ||
</ | </ | ||
</ | </ | ||
+ | |||
+ | {{: | ||
Строка 151: | Строка 157: | ||
Из минусов то что один порт-одно приложение, | Из минусов то что один порт-одно приложение, | ||
+ | {{: | ||
< | < | ||
Строка 190: | Строка 197: | ||
</ | </ | ||
</ | </ | ||
- | |||
Строка 197: | Строка 203: | ||
Стандартный способ предоставления сервиса в интернете. Сервис предоставляет IP адрес, этот адрес будет направлять весь трафик на сервис\\ | Стандартный способ предоставления сервиса в интернете. Сервис предоставляет IP адрес, этот адрес будет направлять весь трафик на сервис\\ | ||
- | Весь трафик указанного порта направляется н сервис, | + | Весь трафик указанного порта направляется н сервис, |
- | НО, каждому сервису нужен свой IP\\ | + | |
+ | Еще вырезка: | ||
+ | |||
+ | {{: | ||
- | === Ingress === | + | ==== Ingress |
**Ingress** - ресурс k8s где создается описание конфигурации Ingress Controller\\ | **Ingress** - ресурс k8s где создается описание конфигурации Ingress Controller\\ | ||
**Ingress Controller** - обрабатывает трафик, | **Ingress Controller** - обрабатывает трафик, | ||
Строка 215: | Строка 224: | ||
В системах " | В системах " | ||
+ | {{: | ||
< | < | ||
- | < | + | < |
- | Ingress Controller | + | Revers proxy в Ingress Controller |
+ | * NodePort | ||
+ | * HostPort (можно повесить на порты 80 и 443) | ||
+ | * Host network (под повесит свои порты на публичном интерфейсе, | ||
+ | Тут неясно, | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | <code yaml> | ||
+ | apiVersion: extensions/ | ||
+ | kind: Ingress | ||
+ | metadata: | ||
+ | name: my-ingress | ||
+ | spec: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | - host: foo.mydomain.com | ||
+ | http: | ||
+ | | ||
+ | - backend: | ||
+ | | ||
+ | | ||
+ | - host: mydomain.com | ||
+ | http: | ||
+ | | ||
+ | - path: /bar/* | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | |||
+ | Два location на разные сервисы | ||
+ | <code yaml> | ||
+ | apiVersion: networking.k8s.io/ | ||
+ | kind: Ingress | ||
+ | metadata: | ||
+ | name: ingress-test-site | ||
+ | namespace: test-ingress-app | ||
+ | spec: | ||
+ | ingressClassName: | ||
+ | rules: | ||
+ | - host: es.moysite.ru | ||
+ | http: | ||
+ | paths: | ||
+ | - path: / | ||
+ | pathType: Prefix | ||
+ | backend: | ||
+ | service: | ||
+ | name: spa | ||
+ | port: | ||
+ | number: 80 | ||
+ | - path: /test | ||
+ | pathType: Prefix | ||
+ | backend: | ||
+ | service: | ||
+ | name: frontend-api | ||
+ | port: | ||
+ | number: 80 | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | " | ||
+ | **ssl-redirect** - принудительное использование HTTPS на стороне сервера, | ||
+ | **force-ssl-redirect** - принудительно перенаправлять на HTTPS, даже если TLS недоступен.\\ | ||
+ | |||
+ | **ssl-passthrough** - передача данных по протоколу SSL. Указание контроллеру отправлять соединения по протоколу TLS непосредственно на серверную часть, вместо того чтобы позволять Nginx расшифровывать обмен данными\\ | ||
+ | :!: т.к. передача по протоколу SSL работает на уровне 4 модели OSI (TCP), а не на 7 (HTTP), то эта аннотация **делает недействительными** все остальные аннотации для входящего объекта\\ | ||
+ | :!: В том числе и маршрутизация на основе пути (т.е. Location фактически не работает, | ||
+ | |||
+ | Блок " | ||
+ | |||
+ | **** - | ||
+ | |||
+ | **** - | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | === Еще про Ingress Controller === | ||
+ | **Ingress Controller** обычно располагают на отдельных нодах, с внешними IP адресами, | ||
+ | |||
+ | Обеспечивает контроль доступа к приложениям и маршрутизацию трафика между ними. Обрабатывает запросы из внешней сети и направляет их на определенные внутренние сервисы, | ||
+ | Может как принимать весь внешний трафик так и стоять за каким то внешним балансером\\ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
Ingress работает на 7ом (прикладном) уровне OSI, для работы на третьем (сетевом) можно использовать другие методы публикации приложений: | Ingress работает на 7ом (прикладном) уровне OSI, для работы на третьем (сетевом) можно использовать другие методы публикации приложений: | ||
* ClusterIP | * ClusterIP | ||
* LoadBalancer | * LoadBalancer | ||
* NodePort | * NodePort | ||
+ | * ExternalName | ||
+ | * ExternalIP | ||
Внутри Ingress Controller обычный Nginx, поэтому можно настроить распределение запросов по доменам или location\\ | Внутри Ingress Controller обычный Nginx, поэтому можно настроить распределение запросов по доменам или location\\ | ||
+ | |||
+ | :!:(?) Важно отметить, | ||
+ | |||
+ | :!: Терминирование TLS: если IC настроен на обработку HTTPS, он выполняет терминирование, | ||
</ | </ | ||
- | < | ||
- | < | ||
- | Revers proxy в Ingress Controller слушает порты с HTTP/ | ||
- | * NodePort | ||
- | * HostPort (можно повесить на порты 80 и 443) | ||
- | * Host network (под повесит свои порты на публичном интерфейсе, | ||
- | **NodePort**\\ | + | === HTTPS Ingress === |
- | Непонятно, похоже что нужен " | + | Ресурс Ingress |
+ | Ссылка на этот секрет в Ingress сообщает контроллеру Ingress о необходимости защитить канал от клиента до балансировщика нагрузки с помощью TLS\\ | ||
+ | <code yaml> | ||
+ | spec: | ||
+ | tls: | ||
+ | - hosts: | ||
+ | - https-example.foo.com | ||
+ | secretName: testsecret-tls | ||
+ | </ | ||
- | **HostPort**\\ | + | :!: Важно не забывать что серт должен быть валидным, для этого URL\\ |
- | Открываются порты (вроде как на всех нодах), | + | |
- | **Host Network**\\ | + | Для |
- | тут вообще борода\\ | + | <code bash> |
+ | kubectl create secret tls my-tls --key my-tls.key --cert my-tls.cert | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | <code yaml> | ||
+ | apiVersion: extensions/ | ||
+ | kind: Ingress | ||
+ | | ||
+ | name: ingress-my-tls | ||
+ | | ||
+ | | ||
+ | - hosts: | ||
+ | - ingress.example.com | ||
+ | | ||
+ | | ||
+ | - host: ingress.example.com | ||
+ | | ||
+ | | ||
+ | - path: / | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
</ | </ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | <code yaml> | ||
+ | apiVersion: networking.k8s.io/ | ||
+ | kind: Ingress | ||
+ | metadata: | ||
+ | name: myapp-ing | ||
+ | annotations: | ||
+ | # указывает на использование nginx, зависит от настроек контроллера видимо | ||
+ | kubernetes.io/ | ||
+ | | ||
+ | # Указываем контроллеру пересылать шифрованный трафик дальше, | ||
+ | nginx.ingress.kubernetes.io/ | ||
+ | |||
+ | labels: | ||
+ | app: myapp | ||
+ | spec: | ||
+ | rules: | ||
+ | - host: " | ||
+ | http: | ||
+ | paths: | ||
+ | - path: / | ||
+ | pathType: Prefix | ||
+ | backend: | ||
+ | service: | ||
+ | name: myapp-svc | ||
+ | port: | ||
+ | number: 9444 | ||
+ | </ | ||
+ | </ | ||
Строка 255: | Строка 423: | ||
< | < | ||
- | < | + | < |
+ | [[https:// | ||
+ | [[https:// | ||
+ | " | ||
+ | Суть в том что в кластер устанавливается объект " | ||
+ | В манифесте Ingress, в блоке " | ||
+ | |||
+ | Пример конфига ingress | ||
+ | <code yaml> | ||
+ | apiVersion: networking.k8s.io/ | ||
+ | kind: Ingress | ||
+ | metadata: | ||
+ | name: ingress-test-site | ||
+ | namespace: test-ingress-app | ||
+ | annotations: | ||
+ | cert-manager.io/ | ||
+ | spec: | ||
+ | ingressClassName: | ||
+ | rules: | ||
+ | - host: es.moysite.ru | ||
+ | http: | ||
+ | paths: | ||
+ | - path: / | ||
+ | pathType: Prefix | ||
+ | backend: | ||
+ | service: | ||
+ | name: spa | ||
+ | port: | ||
+ | number: 80 | ||
+ | - path: /test | ||
+ | pathType: Prefix | ||
+ | backend: | ||
+ | service: | ||
+ | name: frontend-api | ||
+ | port: | ||
+ | number: 80 | ||
+ | tls: | ||
+ | - hosts: | ||
+ | - es.moysite.ru | ||
+ | secretName: test-ingress-app-production | ||
+ | </ | ||
+ | |||
+ | Еще пример | ||
+ | <code yaml> | ||
+ | apiVersion: extensions/ | ||
+ | kind: Ingress | ||
+ | metadata: | ||
+ | name: ingress-socks-tls | ||
+ | annotations: | ||
+ | kubernetes.io/ | ||
+ | cert-manager.io/ | ||
+ | spec: | ||
+ | rules: | ||
+ | - host: kuber.zeroxzed.ru | ||
+ | http: | ||
+ | paths: | ||
+ | - backend: | ||
+ | serviceName: | ||
+ | servicePort: | ||
+ | tls: | ||
+ | - hosts: | ||
+ | - kuber.zeroxzed.ru | ||
+ | secretName: socks-tls-2 | ||
+ | </ | ||
</ | </ | ||
Строка 264: | Строка 495: | ||
< | < | ||
- | < | + | < |
+ | [[https:// | ||
+ | Конфигурация с расшифровкой TLS на Ingress контроллере | ||
<code yaml> | <code yaml> | ||
+ | apiVersion: networking.k8s.io/ | ||
+ | kind: Ingress | ||
+ | metadata: | ||
+ | name: ingress-name | ||
+ | namespace: namespace-name | ||
+ | annotations: | ||
+ | # это хз, возможно не обязательно | ||
+ | nginx.ingress.kubernetes.io/ | ||
+ | spec: | ||
+ | # блок, задающий терминацию на ингрессе, | ||
+ | tls: | ||
+ | - hosts: | ||
+ | - app.myorg.com | ||
+ | secretName: tls-secret | ||
+ | rules: | ||
+ | - http: | ||
+ | paths: | ||
+ | - backend: | ||
+ | serviceName: | ||
+ | servicePort: | ||
+ | path: /carbon | ||
+ | - backend: | ||
+ | serviceName: | ||
+ | servicePort: | ||
+ | path: /oauth | ||
+ | </ | ||
+ | |||
+ | тоже самое, только пересылка шифрованного трафика, | ||
+ | <code yaml> | ||
+ | apiVersion: networking.k8s.io/ | ||
+ | kind: Ingress | ||
+ | metadata: | ||
+ | name: ingress-name | ||
+ | namespace: namespace-name | ||
+ | annotations: | ||
+ | nginx.ingress.kubernetes.io/ | ||
+ | spec: | ||
+ | rules: | ||
+ | - http: | ||
+ | paths: | ||
+ | - backend: | ||
+ | serviceName: | ||
+ | servicePort: | ||
+ | path: /carbon | ||
+ | - backend: | ||
+ | serviceName: | ||
+ | servicePort: | ||
+ | path: /oauth | ||
</ | </ | ||
</ | </ | ||
Строка 275: | Строка 555: | ||
+ | < | ||
+ | < | ||
+ | |||
+ | <code yaml> | ||
+ | |||
+ | </ | ||
+ | </ | ||