Как разрешить доступ к приложению внутри кластера только от Ingress-контроллера? | How do I limit access to the application in the cluster to Ingress controllers only? |
Если необходимо ограничить доступ к вашему приложению внутри кластера исключительно от подов Ingress-контроллера, необходимо в под с приложением добавить контейнер с kube-rbac-proxy, как показано в примере ниже: | If you need to limit access to your application inside the cluster exclusively from Ingress Pods, you should add a kube-rbac-proxy container to the application Pod as shown in the example below: |
yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: my-namespace spec: selector: matchLabels: app: my-app replicas: 1 template: metadata: labels: app: my-app spec: serviceAccountName: my-sa containers:
| yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: my-namespace spec: selector: matchLabels: app: my-app replicas: 1 template: metadata: labels: app: my-app spec: serviceAccountName: my-sa containers:
|
Приложение принимает запросы на адресе | The application only accepts localhost (127.0.0.1) requests. That means that an unsecured connection can only be established to it from within the Pod. At the same time, the proxy listens on 0.0.0.0 and intercepts all external traffic to the Pod. |
Как выдать минимальные права для ServiceAccount? | How do I provide minimum rights to the Service Account? |
Чтобы аутентифицировать и авторизовывать пользователей с помощью kube-apiserver, у прокси должны быть права на создание | The proxy needs permissions to create |
В кластерах DKP уже есть готовая ClusterRole — d8-rbac-proxy, создавать её самостоятельно не требуется! Свяжите её с ServiceAccount вашего Deployment’а, как показано в примере ниже. | DKP clusters already have a ready-made ClusterRole — d8-rbac-proxy, you don’t need to create it yourself! Link it to your Deployment’s ServiceAccount, as shown in the example below. |
yamlapiVersion: v1 kind: ServiceAccount metadata: name: my-sa namespace: my-namespace — apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: my-namespace:my-sa:d8-rbac-proxy roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: d8:rbac-proxy subjects:
| yamlapiVersion: v1 kind: ServiceAccount metadata: name: my-sa namespace: my-namespace — apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: my-namespace:my-sa:d8-rbac-proxy roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: d8:rbac-proxy subjects:
|
Конфигурация Kube-RBAC-Proxy | The Kube-RBAC-Proxy configuration |
yaml apiVersion: v1 kind: ConfigMap metadata: name: kube-rbac-proxy data: config-file.yaml: |+ excludePaths:
| yaml apiVersion: v1 kind: ConfigMap metadata: name: kube-rbac-proxy data: config-file.yaml: |+ excludePaths:
|
According to the configuration, the user must have access to the | |
Согласно конфигурации, у пользователя должны быть права доступа к Deployment с именем | Such permissions have the following RBAC form: |
Выглядят такие права в виде RBAC следующим образом: | yamlapiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: kube-rbac-proxy:my-app namespace: my-namespace rules:
|
All user certificates of Ingress controllers are issued for one specific group.
| |
yamlapiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: kube-rbac-proxy:my-app namespace: my-namespace rules:
| For the Ingress resource, add parameters: |
Все пользовательские сертификаты ingress-контроллеров выписаны для одной конкретной группы.
| yaml nginx.ingress.kubernetes.io/backend-protocol: HTTPS nginx.ingress.kubernetes.io/configuration-snippet: | proxy_ssl_certificate /etc/nginx/ssl/client.crt; proxy_ssl_certificate_key /etc/nginx/ssl/client.key; proxy_ssl_protocols TLSv1.2; proxy_ssl_session_reuse on; |
Для Ingress-ресурса добавьте параметры: | Here you can read more about how certificate authentication works. |
yaml nginx.ingress.kubernetes.io/backend-protocol: HTTPS nginx.ingress.kubernetes.io/configuration-snippet: | proxy_ssl_certificate /etc/nginx/ssl/client.crt; proxy_ssl_certificate_key /etc/nginx/ssl/client.key; proxy_ssl_protocols TLSv1.2; proxy_ssl_session_reuse on; | How do I configure an external load balancer to check if IngressNginxController is available? |
Подробнее о том, как работает аутентификация по сертификатам, можно прочитать в документации Kubernetes. | In case an |
Как сконфигурировать балансировщик нагрузки для проверки доступности IngressNginxController? |
|
В ситуации, когда | How do I configure MetalLB to be accessible from the internal network only? |
| Below is an example of a MetalLB config with access from the internal network only: |
Как настроить работу через MetalLB с доступом только из внутренней сети? | yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: “nginx” inlet: “LoadBalancer” loadBalancer: sourceRanges:
|
Пример MetalLB с настройками доступа только из внутренней сети: | The |
yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: “nginx” inlet: “LoadBalancer” loadBalancer: sourceRanges:
| How to add extra log fields to a nginx-controller? |
Для работы необходимо включить параметр | Example of adding extra fields: |
Как добавить дополнительные поля для логирования в nginx-controller? | yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: “nginx” inlet: “LoadBalancer” additionalLogFields: my-cookie: “$cookie_MY_COOKIE” |
Пример добавления дополнительных полей: | How to enable HorizontalPodAutoscaling for IngressNginxController? |
yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: “nginx” inlet: “LoadBalancer” additionalLogFields: my-cookie: “$cookie_MY_COOKIE” | HPA mode is possible only for controllers with inlet: |
Как включить HorizontalPodAutoscaling для IngressNginxController? | HPA mode is possible only for |
Режим HPA возможен только для контроллеров с инлетом | HPA is set with attributes |
Режим HPA возможен только при | The IngressNginxController is deployed using DaemonSet. DaemonSet does not provide horizontal scaling capabilities, so |
Для включения HPA используйте атрибуты |
|
IngressNginxController разворачивается с помощью DaemonSet. DaemonSet не предоставляет возможности горизонтального масштабирования, поэтому создается дополнительный deployment | Notes: |
Deployment |
|
How to use IngressClass with IngressClassParameters? | |
| Since version 1.1 IngressNginxController Deckhouse creates an IngressClass object. If you want to use your own IngressClass
with your customized IngressClassParameters, you need to add the label |
yaml apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: labels: ingress-class.deckhouse.io/external: “true” name: my-super-ingress spec: controller: ingress-nginx.deckhouse.io/my-super-ingress parameters: apiGroup: elbv2.k8s.aws kind: IngressClassParams name: awesome-class-cfg | |
Как использовать IngressClass с установленными IngressClassParameters? | In this case Deckhouse will not create an IngressClass object and will use your own. |
Начиная с версии 1.1 IngressNginxController, Deckhouse создает объект IngressClass самостоятельно. Если вы хотите использовать свой IngressClass с установленными IngressClassParameters, достаточно добавить к нему label | How to disable the collection of detailed Ingress resources statistics? |
yaml apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: labels: ingress-class.deckhouse.io/external: “true” name: my-super-ingress spec: controller: ingress-nginx.deckhouse.io/my-super-ingress parameters: apiGroup: elbv2.k8s.aws kind: IngressClassParams name: awesome-class-cfg | By default, Deckhouse collects detailed statistics from all Ingress resources in the cluster, which generates a high load on the monitoring system. |
В этом случае, при указании данного IngressClass в CRD IngressNginxController, Deckhouse не будет создавать объект, а использует существующий. | To disable statistics collection, add label |
Как отключить сборку детализированной статистики Ingress-ресурсов? | Example of disabling statistics (metrics) collection for all Ingress resources in the |
По умолчанию Deckhouse собирает подробную статистику со всех Ingress-ресурсов в кластере. Этот процесс может приводить к высокой нагрузке системы мониторинга. | shell kubectl label ns review-1 ingress.deckhouse.io/discard-metrics=true |
Для отключения сбора статистики добавьте лейбл | Example of disabling statistics (metrics) collection for all |
Пример отключения сбора статистики (метрик) для всех Ingress-ресурсов в пространстве имен | shell kubectl label ingress test-site -n development ingress.deckhouse.io/discard-metrics=true |
shell kubectl label ns review-1 ingress.deckhouse.io/discard-metrics=true | How do I correctly drain a node running an IngressNginxController’s pods? |
Пример отключения сбора статистики (метрик) для всех Ingress-ресурсов | There are two ways to gracefully drain a node running IngressNginxController. |
shell kubectl label ingress test-site -n development ingress.deckhouse.io/discard-metrics=true |
|
Как корректно вывести из эксплуатации (drain) узел с запущенным IngressNginxController? | The annotation will be automatically removed after the operation completes. |
Доступно два способа корректного вывода из эксплуатации узла, на котором запущен IngressNginxController. | shell
kubectl annotate node |
|
|
Аннотация будет автоматически удалена после завершения операции. | When using the standard kubectl drain command, you must specify the |
shell
kubectl annotate node | shell
kubectl drain |
| How to enable Web Application Firewall (WAF)? |
При использовании стандартной команды kubectl drain необходимо указать флаг | Software known as a Web Application Firewall (WAF) is used to protect web applications from Layer 7 attacks. Ingress-nginx controller has a built-in WAF called `ModSecurity’ (The Open Worldwide Application Security Project). |
shell
kubectl drain | ModSecurity is disabled by default. |
Как включить Web Application Firewall (WAF)? | Enabling ModSecurity |
Для защиты веб-приложений от L7-атак используется программное обеспечение известное как Web Application Firewall (WAF).
В ingress-nginx контроллер встроен WAF под названием | To enable ModSecurity, you must specify the following parameters in the |
По умолчанию ModSecurity выключен. | yaml
apiVersion: deckhouse.io/v1
kind: IngressNginxController
metadata:
name: |
Включение ModSecurity | After applying the settings, ModSecurity will start working for all traffic passing through this Ingress nginx controller.
This uses the audit mode ( |
Для включения ModSecurity необходимо задать параметры в кастомном ресурсе IngressNginxController, в секции | Setting up ModSecurity |
yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: <имя_контроллера> spec: config: enable-modsecurity: "true" modsecurity-snippet: | Include /etc/nginx/modsecurity/modsecurity.confимя_контроллера> | You can configure ModSecurity in two ways:
|
После применения настроек ModSecurity начнет работать для всего трафика, проходящего через данный ingress-nginx контроллер.
При этом используется режим аудита ( | To enable the execution of rules (and not just logging), add the |
Настройка ModSecurity | yaml
apiVersion: deckhouse.io/v1
kind: IngressNginxController
metadata:
name: |
ModSecurity можно настраивать двумя способами:
| A full list and description of the directives can be found in the official documentation. |
Чтобы включить выполнение правил (а не только логирование), добавьте директиву | Currently, the OWASP Core Rule Set (CRS) is not available. |
yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: <имя_контролера> spec: config: enable-modsecurity: "true" modsecurity-snippet: | Include /etc/nginx/modsecurity/modsecurity.conf SecRuleEngine Onимя_контролера> | |
Полный перечень и описание директив вы можете найти в официальной документации. | |
На данный момент использование набора правил OWASP Core Rule Set (CRS) недоступно. |