How do I limit access to the application in the cluster to ingress controllers only? | Как разрешить доступ к приложению внутри кластера только от ingress controller? |
Add the kube-rbac-proxy container to the application Pod to allow only ingress Pods to access your application in the cluster: | Если необходимо ограничить доступ к вашему приложению внутри кластера исключительно от подов ingress, необходимо в под с приложением добавить контейнер с kube-rbac-proxy: |
An example of the corresponding Kubernetes Deployment | Пример Deployment для защищенного приложения |
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? | Как дать минимальные права для Service Account? |
The proxy needs permissions to create | Чтобы аутентифицировать и авторизовывать пользователей с помощью kube-apiserver, у прокси должны быть права на создание |
The DKP clusters have a built-in ClusterRole called d8-rbac-proxy that is ideal for this kind of situation. You don’t need to create it yourself! It needs to be attached to the ServiceAccount of your Deployment. | В кластерах DKP уже есть готовая ClusterRole — d8-rbac-proxy. Создавать ее самостоятельно не нужно! Необходимо прикрепить ее к Service Account’у вашего 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 | Согласно конфигурации, у пользователя должны быть права доступа к 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:
| 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
| Все пользовательские сертификаты ingress-контроллеров выписаны для одной конкретной группы.
|
You also need to add the following parameters to the ingress of the resource: | Для 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; | 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; |
Here you can read more about how certificate authentication works. | Подробнее о том, как работает аутентификация по сертификатам, можно прочитать в документации Kubernetes. |
How do I configure an external load balancer to check if IngressNginxController is available? | Как сконфигурировать балансировщик нагрузки для проверки доступности IngressNginxController? |
In case an | В ситуации, когда |
|
|
How do I configure MetalLB to be accessible from the internal network only? | Как настроить работу через MetalLB с доступом только из внутренней сети? |
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:
| yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: “nginx” inlet: “LoadBalancer” loadBalancer: sourceRanges:
|
The | Для работы необходимо включить параметр |
How to add extra log fields to a nginx-controller? | Как добавить дополнительные поля для логирования в nginx-controller? |
yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: “nginx” inlet: “LoadBalancer” additionalLogFields: my-cookie: “$cookie_MY_COOKIE” | 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? | Как включить HorizontalPodAutoscaling для IngressNginxController? |
HPA mode is possible only for controllers with inlet: | Режим HPA возможен только для контроллеров с инлетом |
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 | IngressNginxController разворачивается с помощью DaemonSet. DaemonSet не предоставляет возможности горизонтального масштабирования, поэтому создается дополнительный deployment |
| Deployment |
Notes: | |
|
|
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 | Как использовать IngressClass с установленными IngressClassParameters? |
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 | Начиная с версии 1.1 IngressNginxController, Deckhouse создает объект IngressClass самостоятельно. Если вы хотите использовать свой IngressClass с установленными IngressClassParameters, достаточно добавить к нему label |
In this case Deckhouse will not create an IngressClass object and will use your own. | 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 |
How to disable the collection of detailed Ingress resources statistics? | В этом случае, при указании данного IngressClass в CRD IngressNginxController, Deckhouse не будет создавать объект, а использует существующий. |
By default, Deckhouse collects detailed statistics from all Ingress resources in the cluster, which generates a high load on the monitoring system. | Как отключить сборку детализированной статистики Ingress-ресурсов? |
To disable statistics collection, add label | По умолчанию Deckhouse собирает подробную статистику со всех Ingress-ресурсов в кластере. Этот процесс может приводить к высокой нагрузке системы мониторинга. |
Example of disabling statistics (metrics) collection for all Ingress resources in the | Для отключения сбора статистики добавьте лейбл |
shell kubectl label ns review-1 ingress.deckhouse.io/discard-metrics=true | Пример отключения сбора статистики (метрик) для всех Ingress-ресурсов в пространстве имен |
Example of disabling statistics (metrics) collection for all | shell kubectl label ns review-1 ingress.deckhouse.io/discard-metrics=true |
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 ingress test-site -n development ingress.deckhouse.io/discard-metrics=true |
There are two ways of draining such a node correctly - either by annotating the node (the annotation will be deleted once the node is drained): | Как корректно вывести из эксплуатации (drain) узел с запущенным IngressNginxController? |
shell
kubectl annotate node | Доступно два способа вывода такого узла из эксплуатации - или с помощью аннотации узла (аннотация будет удалена после завершения операции): |
or by using kubectl drain functionality (it’s worth mentioning that –force flag is required despite having –ignore-daemonsets flag set, as IngressNginxControllers are backed by Advanced DaemonSets): | shell
kubectl annotate node |
shell
kubectl drain | или с помощью базового функционала kubectl drain (тут стоит отметить, что необходимо указать флаг –force, несмотря на то, что указан флаг –ignore-daemonsets, так как IngressNginxController разворачивается с помощью Advanced DaemonSet): |
shell
kubectl drain |