Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
k8s:nets [2024/09/04 03:56] 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 ==== | ||
+ | Сервис k8s по умолчанию. Обеспечивает сервис внутри кластера, | ||
- | === Доступ к приложению из вне === | ||
- | == NodePort== | + | < |
- | Для прода не рекомендуется, | + | < |
+ | <code yaml> | ||
+ | apiVersion: v1 | ||
+ | kind: Service | ||
+ | metadata: | ||
+ | name: my-internal-service | ||
+ | selector: | ||
+ | app: my-app | ||
+ | spec: | ||
+ | type: ClusterIP | ||
+ | | ||
+ | - name: http | ||
+ | port: 80 | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | </ | ||
< | < | ||
- | < | + | < |
+ | <code bash> | ||
+ | kubectl proxy --port=8080 | ||
+ | # Затем обратится по такому адресу | ||
+ | http:// | ||
+ | http:// | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | |||
+ | ==== NodePort ==== | ||
+ | Самый примитивный способ направить внешний трафик в сервис. Открывает указанный порт для всех Nodes и трафик на этот порт перенаправляется сервису\\ | ||
+ | Открываемый порт можно указать самому (nodePort), но лучше оставить автоматике\\ | ||
+ | |||
+ | Из минусов то что один порт-одно приложение, | ||
+ | |||
+ | {{: | ||
+ | |||
+ | < | ||
+ | < | ||
<code yaml> | <code yaml> | ||
apiVersion: v1 | apiVersion: v1 | ||
Строка 129: | Строка 176: | ||
На всех нодах открывается рандомный порт, по IP ноды и этому порту, будет доступен сервис. Порт виден в **oc describe svc/ | На всех нодах открывается рандомный порт, по IP ноды и этому порту, будет доступен сервис. Порт виден в **oc describe svc/ | ||
</ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | <code yaml> | ||
+ | apiVersion: v1 | ||
+ | kind: Service | ||
+ | metadata: | ||
+ | name: my-nodeport-service | ||
+ | selector: | ||
+ | app: my-app | ||
+ | spec: | ||
+ | type: NodePort | ||
+ | | ||
+ | - name: http | ||
+ | port: 80 | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== LoadBalancer ==== | ||
+ | Стандартный способ предоставления сервиса в интернете. Сервис предоставляет IP адрес, этот адрес будет направлять весь трафик на сервис\\ | ||
+ | |||
+ | Весь трафик указанного порта направляется н сервис, | ||
+ | |||
+ | Еще вырезка: | ||
+ | |||
+ | {{: | ||
Строка 138: | Строка 217: | ||
Вместе создают единую точку входа для трафика и выполняют роль прокси и балансировщика (?)\\ | Вместе создают единую точку входа для трафика и выполняют роль прокси и балансировщика (?)\\ | ||
- | < | ||
- | < | ||
- | Ingress Controller можно реализовать на разных платформах, | ||
- | Ingress | + | Ingress |
- | * ClusterIP | + | В одном кластере может быть установлено несколько IC, в зависимости от конфигурации и настроек кластера. Так же , в функции IC входит первичная маршрутизация, согласно |
- | * LoadBalancer | + | |
- | * NodePort | + | |
- | Внутри Ingress Controller | + | Ingress это yaml/json шаблон k8s, который |
- | </ | + | |
+ | В системах " | ||
+ | {{: | ||
Строка 158: | Строка 234: | ||
* Host network (под повесит свои порты на публичном интерфейсе, | * Host network (под повесит свои порты на публичном интерфейсе, | ||
+ | Тут неясно, | ||
+ | </ | ||
- | **NodePort**\\ | ||
- | Непонятно, | ||
+ | < | ||
+ | < | ||
+ | <code yaml> | ||
+ | apiVersion: extensions/ | ||
+ | kind: Ingress | ||
+ | metadata: | ||
+ | name: my-ingress | ||
+ | spec: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | - host: foo.mydomain.com | ||
+ | http: | ||
+ | | ||
+ | - backend: | ||
+ | | ||
+ | | ||
+ | - host: mydomain.com | ||
+ | http: | ||
+ | | ||
+ | - path: /bar/* | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
- | **HostPort**\\ | ||
- | Открываются порты (вроде как на всех нодах), | ||
+ | Два 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 фактически не работает, | ||
+ | |||
+ | Блок " | ||
+ | |||
+ | **** - | ||
- | **Host Network**\\ | + | **** - |
- | тут вообще борода\\ | + | |
</ | </ | ||
+ | === Еще про Ingress Controller === | ||
+ | **Ingress Controller** обычно располагают на отдельных нодах, с внешними IP адресами, | ||
+ | |||
+ | Обеспечивает контроль доступа к приложениям и маршрутизацию трафика между ними. Обрабатывает запросы из внешней сети и направляет их на определенные внутренние сервисы, | ||
+ | Может как принимать весь внешний трафик так и стоять за каким то внешним балансером\\ | ||
< | < | ||
- | < | + | < |
+ | Ingress работает на 7ом (прикладном) уровне OSI, для работы на третьем (сетевом) можно использовать другие методы публикации приложений: | ||
+ | * ClusterIP | ||
+ | * LoadBalancer | ||
+ | * NodePort | ||
+ | * ExternalName | ||
+ | * ExternalIP | ||
+ | |||
+ | Внутри Ingress Controller обычный Nginx, поэтому можно настроить распределение запросов по доменам или location\\ | ||
+ | :!:(?) Важно отметить, | ||
+ | :!: Терминирование TLS: если IC настроен на обработку HTTPS, он выполняет терминирование, | ||
</ | </ | ||
+ | |||
+ | |||
+ | === HTTPS Ingress === | ||
+ | Ресурс Ingress поддерживает только один порт TLS, 443, и предполагает завершение TLS в точке входа (трафик к Службе и ее Pods передается в виде открытого текста).\\ | ||
+ | Ссылка на этот секрет в Ingress сообщает контроллеру Ingress о необходимости защитить канал от клиента до балансировщика нагрузки с помощью TLS\\ | ||
+ | <code yaml> | ||
+ | spec: | ||
+ | tls: | ||
+ | - hosts: | ||
+ | - https-example.foo.com | ||
+ | secretName: testsecret-tls | ||
+ | </ | ||
+ | |||
+ | |||
+ | :!: Важно не забывать что серт должен быть валидным, | ||
+ | |||
+ | |||
+ | Для того чтобы использовать сертификаты в конфигурации Ingress, их нужно загрузить в кластер Kubernetes. Серты хранятся в секретах Кубера, | ||
+ | <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> | <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 | ||
</ | </ | ||
</ | </ | ||
Строка 196: | Строка 422: | ||
+ | < | ||
+ | < | ||
+ | [[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 | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | [[https:// | ||
+ | |||
+ | Конфигурация с расшифровкой TLS на Ingress контроллере | ||
+ | <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 | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | |||
+ | <code yaml> | ||
+ | |||
+ | </ | ||
+ | </ | ||