Инструменты пользователя

Инструменты сайта


k8s:nets

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
k8s:nets [2024/09/05 09:34]
admin
k8s:nets [2024/11/10 13:15] (текущий)
admin
Строка 1: Строка 1:
-===== Сервисы/Сеть =====+====== Сервисы/Сеть ======
  
  
-==== Services ====+===== Services =====
 Для доступа к поду (наборам подов) используются сервисы (service). Service - абстракция, определяющая набор подов и политику доступа к ним. Так же берет на себя вопрос распределения нагрузки\\ Для доступа к поду (наборам подов) используются сервисы (service). Service - абстракция, определяющая набор подов и политику доступа к ним. Так же берет на себя вопрос распределения нагрузки\\
  
Строка 40: Строка 40:
 Стратегия распределения запросов между подами, по умолчанию "round robin"\\ Стратегия распределения запросов между подами, по умолчанию "round robin"\\
 </details> </details>
- 
  
  
Строка 97: Строка 96:
  
  
-=== Endpoint ===+==== Endpoint ====
 **kubectl get ep**\\ **kubectl get ep**\\
 В случае сервисов использующих селекторы, ендпоинты создаются автоматом, система сама находит IP нужных подов и формирует запись в endpoint\\ В случае сервисов использующих селекторы, ендпоинты создаются автоматом, система сама находит IP нужных подов и формирует запись в endpoint\\
Строка 112: Строка 111:
  
  
-==== Доступ к приложению ==== +===== Доступ к приложению ===== 
-=== ClusterIP ===+==== ClusterIP ====
 Сервис k8s по умолчанию. Обеспечивает сервис внутри кластера, к которому могут обращаться другие приложения внутри кластера. Внешнего доступа нет\\ Сервис k8s по умолчанию. Обеспечивает сервис внутри кластера, к которому могут обращаться другие приложения внутри кластера. Внешнего доступа нет\\
  
Строка 152: Строка 151:
  
  
-=== NodePort ===+==== NodePort ====
 Самый примитивный способ направить внешний трафик в сервис. Открывает указанный порт для всех Nodes и трафик на этот порт перенаправляется сервису\\  Самый примитивный способ направить внешний трафик в сервис. Открывает указанный порт для всех Nodes и трафик на этот порт перенаправляется сервису\\ 
 Открываемый порт можно указать самому (nodePort), но лучше оставить автоматике\\ Открываемый порт можно указать самому (nodePort), но лучше оставить автоматике\\
Строка 201: Строка 200:
  
  
-=== LoadBalancer ===+==== LoadBalancer ====
 Стандартный способ предоставления сервиса в интернете. Сервис предоставляет IP адрес, этот адрес будет направлять весь трафик на сервис\\ Стандартный способ предоставления сервиса в интернете. Сервис предоставляет IP адрес, этот адрес будет направлять весь трафик на сервис\\
  
Строка 212: Строка 211:
  
  
-=== Ingress ===+==== Ingress ====
 **Ingress** - ресурс k8s где создается описание конфигурации Ingress Controller\\ **Ingress** - ресурс k8s где создается описание конфигурации Ingress Controller\\
 **Ingress Controller** - обрабатывает трафик, его конфигурация формируется из всех Ingress объектов внутри кластера\\ **Ingress Controller** - обрабатывает трафик, его конфигурация формируется из всех Ingress объектов внутри кластера\\
Строка 264: Строка 263:
          serviceName: bar          serviceName: bar
          servicePort: 8080          servicePort: 8080
 +</code>
 +
 +
 +Два location на разные сервисы
 +<code yaml>
 +apiVersion: networking.k8s.io/v1
 +kind: Ingress
 +metadata:
 +  name: ingress-test-site
 +  namespace: test-ingress-app
 +spec:
 +  ingressClassName: nginx
 +  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
 </code> </code>
 </details> </details>
  
  
-== Еще про Ingress Controller ==+<details> 
 +<summary>:!: Annotations</summary> 
 +"nginx.ingress.kubernetes.io/":\\ 
 +**ssl-redirect** - принудительное использование HTTPS на стороне сервера, с помощью перенаправления. По умолчанию контроллер перенаправляет на HTTPS если для этого входа включен TLS\\ 
 +**force-ssl-redirect** - принудительно перенаправлять на HTTPS, даже если TLS недоступен.\\ 
 + 
 +**ssl-passthrough** - передача данных по протоколу SSL. Указание контроллеру отправлять соединения по протоколу TLS непосредственно на серверную часть, вместо того чтобы позволять Nginx расшифровывать обмен данными\\ 
 +:!: т.к. передача по протоколу SSL работает на уровне 4 модели OSI (TCP), а не на 7 (HTTP), то эта аннотация **делает недействительными** все остальные аннотации для входящего объекта\\ 
 +:!: В том числе и маршрутизация на основе пути (т.е. Location фактически не работает, тк путь зашифрован)\\ 
 + 
 +Блок "TLS" вероятно по этой же причине не работает, тк подставляется дефолтный сертификат кубера  
 + 
 +**** -  
 + 
 +**** -  
 +</details> 
 + 
 + 
 + 
 +=== Еще про Ingress Controller ===
 **Ingress Controller** обычно располагают на отдельных нодах, с внешними IP адресами, которые используются точкой подключения к сервисам\\ **Ingress Controller** обычно располагают на отдельных нодах, с внешними IP адресами, которые используются точкой подключения к сервисам\\
  
Строка 290: Строка 338:
 :!: Терминирование TLS: если IC настроен на обработку HTTPS, он выполняет терминирование, те расшифровку входящего трафика и пересылку его во внутреннюю службу уже по нешифрованному соединению\\ :!: Терминирование TLS: если IC настроен на обработку HTTPS, он выполняет терминирование, те расшифровку входящего трафика и пересылку его во внутреннюю службу уже по нешифрованному соединению\\
 </details> </details>
 +
 +
 +
 +
 +=== HTTPS Ingress ===
 +Ресурс Ingress поддерживает только один порт TLS, 443, и предполагает завершение TLS в точке входа (трафик к Службе и ее Pods передается в виде открытого текста).\\
 +Ссылка на этот секрет в Ingress сообщает контроллеру Ingress о необходимости защитить канал от клиента до балансировщика нагрузки с помощью TLS\\
 +<code yaml>
 +spec:
 +  tls:
 +  - hosts:
 +      - https-example.foo.com
 +    secretName: testsecret-tls
 +</code>
 +
 +
 +:!: Важно не забывать что серт должен быть валидным, для этого URL\\
 +
 +
 +Для того чтобы использовать сертификаты в конфигурации Ingress, их нужно загрузить в кластер Kubernetes. Серты хранятся в секретах Кубера, Создать такой секрет можно следующим образом:\\
 +<code bash>
 +kubectl create secret tls my-tls --key my-tls.key --cert my-tls.cert
 +</code>
  
  
 <details> <details>
-<summary>:!: Еще пример</summary>+<summary>:!: Далее этот серт можно использовать в конфигурации Ingress</summary> 
 +<code yaml> 
 +apiVersion: extensions/v1beta1 
 + kind: Ingress 
 + metadata: 
 +   name: ingress-my-tls 
 + spec: 
 +   tls: 
 +   - hosts: 
 +     - ingress.example.com 
 +     secretName: my-tls 
 +   rules: 
 +   - host: ingress.example.com 
 +     http: 
 +       paths: 
 +       - path: / 
 +         backend: 
 +           serviceName: nginx 
 +           servicePort: 80 
 +</code> 
 +</details> 
 + 
 + 
 +<details> 
 +<summary>:!: Пересылка шифрованного трафика через Ingress</summary> 
 <code yaml> <code yaml>
 apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
 kind: Ingress kind: Ingress
 metadata: metadata:
 +  name: myapp-ing
   annotations:   annotations:
-#    kubernetes.io/ingress.class: nginx +    указывает на использование nginx, зависит от настроек контроллера видимо 
-   nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'+    kubernetes.io/ingress.class: nginx 
 +     
 +    Указываем контроллеру пересылать шифрованный трафик дальше, в приложение
     nginx.ingress.kubernetes.io/ssl-passthrough: 'true'     nginx.ingress.kubernetes.io/ssl-passthrough: 'true'
-  name: ingress-my-service + 
-  namespacemy-namespace+  labels: 
 +    appmyapp
 spec: spec:
-  ingressClassName: nginx 
   rules:   rules:
-    - host: <my-service>.<url кластера>+    - host: "myapp.apps.url-cluster.ru"
       http:       http:
         paths:         paths:
Строка 314: Строка 413:
             backend:             backend:
               service:               service:
-                name: my-service+                name: myapp-svc
                 port:                 port:
-                  number: 3000+                  number: 9444
 </code> </code>
 </details> </details>
Строка 324: Строка 423:
  
 <details> <details>
-<summary>:!: </summary>+<summary>:!: Вариант с Lets Encrypt</summary> 
 +[[https://habr.com/ru/articles/668098|Есть статья по этому поводу]]\\ 
 +[[https://serveradmin.ru/kubernetes-ingress|Еще статья]]\\ 
 +"Cert-manager" - утилита в кластере Кубера, которая умеет автоматически полуать и продлевать сертификаты, в том числе и от бесплатного "Lets Encrypt"\\ 
  
 +Суть в том что в кластер устанавливается объект "cert-manager", типа "issuer", он занимается выпуском/перевыпуском сертов\\
 +В манифесте Ingress, в блоке "tls", указывается этот объект, точнее секрет, куда эмитент сохраняет серт\\ 
  
 +Пример конфига ingress
 <code yaml> <code yaml>
 +apiVersion: networking.k8s.io/v1
 +kind: Ingress
 +metadata:
 +  name: ingress-test-site
 +  namespace: test-ingress-app
 +  annotations:
 +    cert-manager.io/issuer: letsencrypt-production
 +spec:
 +  ingressClassName: nginx
 +  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>
  
 +Еще пример
 +<code yaml>
 +apiVersion: extensions/v1beta1
 +kind: Ingress
 +metadata:
 +  name: ingress-socks-tls
 +  annotations:
 +    kubernetes.io/ingress.class: "nginx"
 +    cert-manager.io/cluster-issuer: "letsencrypt"
 +spec:
 +  rules:
 +  - host: kuber.zeroxzed.ru
 +    http:
 +      paths:
 +      - backend:
 +          serviceName: front-end
 +          servicePort: 80
 +  tls:
 +  - hosts:
 +    - kuber.zeroxzed.ru
 +    secretName: socks-tls-2
 </code> </code>
 </details> </details>
Строка 335: Строка 494:
  
  
 +<details>
 +<summary>:!: Еще про TLS</summary>
 +[[https://stackoverflow-com.translate.goog/questions/54459015/how-to-configure-ingress-to-direct-traffic-to-an-https-backend-using-https?_x_tr_sl=en&_x_tr_tl=ru&_x_tr_hl=ru&_x_tr_pto=sc|Хорошая инфа по этому поводу]]\\
  
 +Конфигурация с расшифровкой TLS на Ingress контроллере 
 +<code yaml>
 +apiVersion: networking.k8s.io/v1
 +kind: Ingress
 +metadata:
 +  name: ingress-name
 +  namespace: namespace-name 
 +  annotations:
 +    # это хз, возможно не обязательно
 +    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
 +spec:
 +  # блок, задающий терминацию на ингрессе, далее трафик не шифрованный, внутри кластера
 +  tls:
 +  - hosts:
 +    - app.myorg.com
 +    secretName: tls-secret 
 +  rules:
 +  - http:
 +      paths:
 +      - backend:
 +          serviceName: service
 +          servicePort: 9443
 +        path: /carbon
 +      - backend:
 +          serviceName: service2
 +          servicePort: 9443
 +        path: /oauth
 +</code>
 +
 +
 +тоже самое, только пересылка шифрованного трафика, расшифровка в приложении
 +<code yaml>
 +apiVersion: networking.k8s.io/v1
 +kind: Ingress
 +metadata:
 +  name: ingress-name
 +  namespace: namespace-name 
 +  annotations:
 +    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
 +spec:
 +  rules:
 +  - http:
 +      paths:
 +      - backend:
 +          serviceName: service
 +          servicePort: 9443
 +        path: /carbon
 +      - backend:
 +          serviceName: service2
 +          servicePort: 9443
 +        path: /oauth
 +</code>
 +</details>
 +
 +
 +
 +
 +<details>
 +<summary>:!: </summary>
 +
 +
 +<code yaml>
 +
 +</code>
 +</details>
  
  
k8s/nets.1725528853.txt.gz · Последнее изменение: 2024/09/05 09:34 — admin