Как разрешить доступ к приложению внутри кластера только от ingress controller’ов? | How do I limit access to the application in the cluster to ingress controllers only? |
Если вы хотите ограничить доступ к вашему приложению внутри кластера ТОЛЬКО от подов ingress’а, необходимо в под с приложением добавить контейнер с kube-rbac-proxy: | Add the kube-rbac-proxy container to the application Pod to allow only ingress Pods to access your application in the cluster: |
Пример Deployment для защищенного приложения | An example of the corresponding Kubernetes 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:
|
Приложение принимает запросы на адресе 127.0.0.1, это означает, что по незащищенному соединению к нему можно подключиться только изнутри пода. Прокси же слушает на адресе 0.0.0.0 и перехватывает весь внешний трафик к поду. | 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. |
Как дать минимальные права для Service Account? | How do I provide minimum rights to the Service Account? |
Чтобы аутентифицировать и авторизовывать пользователей с помощью kube-apiserver, у прокси должны быть права на создание | The proxy needs permissions to create |
В наших кластерах уже есть готовая ClusterRole — d8-rbac-proxy. Создавать ее самостоятельно не нужно! Нужно только прикрепить ее к Service Account’у вашего Deployment’а. | Our 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! Just attach it to the ServiceAccount of your 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:
|
Конфигурация 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:
|
Согласно конфигурации, у пользователя должны быть права на доступ к Deployment с именем | According to the configuration, the user must have access to the |
Выглядят такие права в виде RBAC так: | Such permissions have the following RBAC form: |
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:
|
Все пользовательские сертификаты ingress-контроллеров выписаны для одной конкретной группы.
| 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: |
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; |
Подробнее о том, как работает аутентификация по сертификатам, можно прочитать в документации Kubernetes. | Here you can read more about how certificate authentication works. |
Как сконфигурировать балансировщик нагрузки для проверки доступности IngressNginxController? | How do I configure an external load balancer to check if IngressNginxController is available? |
В ситуации, когда
| In case an
|
Как настроить работу через MetalLB с доступом только из внутренней сети? | 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. |
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:
|
Как добавить дополнительные поля для логирования в nginx-controller? | 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” 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” |
Как включить HorizontalPodAutoscaling для IngressNginxController? | How to enable HorizontalPodAutoscaling for IngressNginxController? |
|
|
HPA выставляется с помощью аттрибутов | HPA is set with attributes |
IngressNginxController разверачивается с помощью DaemonSet. DaemonSet не предоставляет возможности горизонтального масштабирования, поэтому создается дополнительный deployment | The IngressNginxController is deployed using Daemonset. Daemonset does not provide horizontal scaling capabilities, so |
|
|
Примечания:
| Notes:
|
Как использовать IngressClass с установленными IngressClassParameters? | How to use IngressClass with IngressClassParameters? |
Начиная с версии 1.1 IngressNginxController, Deckhouse создает объект IngressClass самостоятельно. Если вы хотите использовать свой IngressClass,
например с установленными IngressClassParameters, достаточно добавить к нему label | 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 | 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 в CRD IngressNginxController, Deckhouse не будет создавать объект, а использует уже существующий. | In this case Deckhouse will not create an IngressClass object and will use your own. |
Как отключить сборку детализированной статистики Ingress-ресурсов? | How to disable the collection of detailed Ingress resources statistics? |
По умолчанию Deckhouse собирает подробную статистику со всех Ingress-ресурсов в кластере, что может генерировать высокую нагрузку на систему мониторинга. | By default, Deckhouse collects detailed statistics from all Ingress resources in the cluster. This behavior may generate high load on the monitoring system. |
Для отключения сбора статистики добавьте label | To disable statistics collection, add label |
Пример отключения сбора статистики (метрик) для всех 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 | shell kubectl label ns review-1 ingress.deckhouse.io/discard-metrics=true |
Пример отключения сбора статистики (метрик) для всех Ingress-ресурсов | Example of disabling statistics (metrics) collection for all |
shell kubectl label ingress test-site -n development ingress.deckhouse.io/discard-metrics=true | shell kubectl label ingress test-site -n development ingress.deckhouse.io/discard-metrics=true |