How do I limit access to the application in the cluster to Ingress controllers only? | Как разрешить доступ к приложению внутри кластера только от Ingress-контроллера? |
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: | Если необходимо ограничить доступ к вашему приложению внутри кластера исключительно от подов Ingress-контроллера, необходимо в под с приложением добавить контейнер с kube-rbac-proxy, как показано в примере ниже: |
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. | Приложение принимает запросы на адресе |
How do I provide minimum rights to the Service Account? | Как выдать минимальные права для ServiceAccount? |
The proxy needs permissions to create | Чтобы аутентифицировать и авторизовывать пользователей с помощью kube-apiserver, у прокси должны быть права на создание |
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. | В кластерах DKP уже есть готовая ClusterRole — d8-rbac-proxy, создавать её самостоятельно не требуется! Свяжите её с ServiceAccount вашего Deployment’а, как показано в примере ниже. |
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:
|
The Kube-RBAC-Proxy configuration | Конфигурация Kube-RBAC-Proxy |
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 | |
Such permissions have the following RBAC form: | Согласно конфигурации, у пользователя должны быть права доступа к Deployment с именем |
yamlapiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: kube-rbac-proxy:my-app namespace: my-namespace rules:
| Выглядят такие права в виде RBAC следующим образом: |
All user certificates of Ingress controllers are issued for one specific group.
| |
For the Ingress resource, add parameters: | yamlapiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: kube-rbac-proxy:my-app namespace: my-namespace rules:
|
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. | Для Ingress-ресурса добавьте параметры: |
How do I configure an external load balancer to check if IngressNginxController is available? | 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; |
In case an | Подробнее о том, как работает аутентификация по сертификатам, можно прочитать в документации Kubernetes. |
| Как сконфигурировать балансировщик нагрузки для проверки доступности 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: |
|
yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: “nginx” inlet: “LoadBalancer” loadBalancer: sourceRanges:
| Как настроить работу через MetalLB с доступом только из внутренней сети? |
The | Пример MetalLB с настройками доступа только из внутренней сети: |
How to add extra log fields to a nginx-controller? | yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: “nginx” inlet: “LoadBalancer” loadBalancer: sourceRanges:
|
Example of adding extra fields: | Для работы необходимо включить параметр |
yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: “nginx” inlet: “LoadBalancer” additionalLogFields: my-cookie: “$cookie_MY_COOKIE” | Как добавить дополнительные поля для логирования в nginx-controller? |
How to enable HorizontalPodAutoscaling for IngressNginxController? | Пример добавления дополнительных полей: |
HPA mode is possible only for controllers with inlet: | 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 | Как включить HorizontalPodAutoscaling для IngressNginxController? |
HPA is set with attributes | Режим HPA возможен только для контроллеров с инлетом |
The IngressNginxController is deployed using DaemonSet. DaemonSet does not provide horizontal scaling capabilities, so | Режим HPA возможен только при |
| Для включения HPA используйте атрибуты |
Notes: | IngressNginxController разворачивается с помощью DaemonSet. DaemonSet не предоставляет возможности горизонтального масштабирования, поэтому создается дополнительный deployment |
| 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 | |
In this case Deckhouse will not create an IngressClass object and will use your own. | Как использовать IngressClass с установленными IngressClassParameters? |
How to disable the collection of detailed Ingress resources statistics? | Начиная с версии 1.1 IngressNginxController, Deckhouse создает объект IngressClass самостоятельно. Если вы хотите использовать свой IngressClass с установленными IngressClassParameters, достаточно добавить к нему label |
By default, Deckhouse collects detailed statistics from all Ingress resources in the cluster, which generates a high load on the monitoring system. | 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 |
To disable statistics collection, add label | В этом случае, при указании данного IngressClass в CRD IngressNginxController, Deckhouse не будет создавать объект, а использует существующий. |
Example of disabling statistics (metrics) collection for all Ingress resources in the | Как отключить сборку детализированной статистики Ingress-ресурсов? |
shell kubectl label ns review-1 ingress.deckhouse.io/discard-metrics=true | По умолчанию Deckhouse собирает подробную статистику со всех Ingress-ресурсов в кластере. Этот процесс может приводить к высокой нагрузке системы мониторинга. |
Example of disabling statistics (metrics) collection for all | Для отключения сбора статистики добавьте лейбл |
shell kubectl label ingress test-site -n development ingress.deckhouse.io/discard-metrics=true | Пример отключения сбора статистики (метрик) для всех Ingress-ресурсов в пространстве имен |
How do I correctly drain a node running an IngressNginxController’s pods? | shell kubectl label ns review-1 ingress.deckhouse.io/discard-metrics=true |
There are two ways to gracefully drain a node running IngressNginxController. | Пример отключения сбора статистики (метрик) для всех Ingress-ресурсов |
| shell kubectl label ingress test-site -n development ingress.deckhouse.io/discard-metrics=true |
The annotation will be automatically removed after the operation completes. | Как корректно вывести из эксплуатации (drain) узел с запущенным IngressNginxController? |
shell
kubectl annotate node | Доступно два способа корректного вывода из эксплуатации узла, на котором запущен IngressNginxController. |
|
|
When using the standard kubectl drain command, you must specify the | Аннотация будет автоматически удалена после завершения операции. |
shell
kubectl drain | shell
kubectl annotate node |
How to enable Web Application Firewall (WAF)? |
|
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). | При использовании стандартной команды kubectl drain необходимо указать флаг |
ModSecurity is disabled by default. | shell
kubectl drain |
Enabling ModSecurity | Как включить Web Application Firewall (WAF)? |
To enable ModSecurity, you must specify the following parameters in the | Для защиты веб-приложений от L7-атак используется программное обеспечение известное как Web Application Firewall (WAF).
В ingress-nginx контроллер встроен WAF под названием |
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 |
Setting up ModSecurity | Для включения ModSecurity необходимо задать параметры в кастомном ресурсе IngressNginxController, в секции |
You can configure ModSecurity in two ways:
| yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: <имя_контроллера> spec: config: enable-modsecurity: "true" modsecurity-snippet: | Include /etc/nginx/modsecurity/modsecurity.confимя_контроллера> |
To enable the execution of rules (and not just logging), add the | После применения настроек ModSecurity начнет работать для всего трафика, проходящего через данный ingress-nginx контроллер.
При этом используется режим аудита ( |
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. | ModSecurity можно настраивать двумя способами:
|
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) недоступно. |