Как интегрировать Kubernetes Dashboard с Azure AD

Вопрос или проблема

У меня есть кластер Azure Kubernetes, и я развернул панель управления Kubernetes, используя документацию GitHub ниже: https://github.com/kubernetes/dashboard

ниже приведен values.yaml, который я использовал:



auth:
  role: auth
  image:
    repository: kubernetesui/dashboard-auth
    tag: 1.2.2
  scaling:
    replicas: 1
    revisionHistoryLimit: 10
  containers:
    ports:
      - name: auth
        containerPort: 8000
        protocol: TCP
    volumeMounts:
      - mountPath: /tmp
        name: tmp-volume
    # TODO: Validate configuration
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 250m
        memory: 400Mi
  automountServiceAccountToken: true
  volumes:
    # Create on-disk volume to store exec logs (required)
    - name: tmp-volume
      emptyDir: {}
  nodeSelector: {}
  # Labels & annotations for Auth related resources
  labels: {}
  annotations: {}
  serviceLabels: {}
  serviceAnnotations: {}


# API deployment configuration
api:
  role: api
  image:
    repository: kubernetesui/dashboard-api
    tag: 1.10.1
  scaling:
    replicas: 1
    revisionHistoryLimit: 10
  containers:
    ports:
      - name: api
        containerPort: 8000
        protocol: TCP
    volumeMounts:
      - mountPath: /tmp
        name: tmp-volume
    # TODO: Validate configuration
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 250m
        memory: 400Mi
  automountServiceAccountToken: true
  # Additional volumes
  # - name: dashboard-kubeconfig
  #   secret:
  #     defaultMode: 420
  #     secretName: dashboard-kubeconfig
  volumes:
    # Create on-disk volume to store exec logs (required)
    - name: tmp-volume
      emptyDir: {}
  nodeSelector: {}
  # Labels & annotations for API related resources
  labels: {}
  annotations: {}
  serviceLabels: {}
  serviceAnnotations: {}

# WEB UI deployment configuration
web:
  role: web
  image:
    repository: kubernetesui/dashboard-web
    tag: 1.6.0
  scaling:
    replicas: 1
    revisionHistoryLimit: 10
  containers:
    ports:
      - name: web
        containerPort: 8000
        protocol: TCP
    # Additional container arguments
    # Full list of arguments: https://github.com/kubernetes/dashboard/blob/master/docs/common/arguments.md
    # args:
    # - --system-banner="Welcome to the Kubernetes Dashboard"
    args: []
    # Additional container environment variables
    # env:
    # - name: SOME_VAR
    #   value: 'some value'
    env: []
    # Additional volume mounts
    # - mountPath: /kubeconfig
    #   name: dashboard-kubeconfig
    #   readOnly: true
    volumeMounts:
      # Create volume mount to store logs (required)
      - mountPath: /tmp
        name: tmp-volume
    # TODO: Validate configuration
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 250m
        memory: 400Mi
  automountServiceAccountToken: true
  volumes:
    # Create on-disk volume to store exec logs (required)
    - name: tmp-volume
      emptyDir: {}
  nodeSelector: {}
  # Labels & annotations for WEB UI related resources
  labels: {}
  annotations: {}
  serviceLabels: {}
  serviceAnnotations: {}

### Metrics Scraper
### Container to scrape, store, and retrieve a window of time from the Metrics Server.
### refs: https://github.com/kubernetes/dashboard/tree/master/modules/metrics-scraper
metricsScraper:
  enabled: true
  role: metrics-scraper
  image:
    repository: kubernetesui/dashboard-metrics-scraper
    tag: 1.2.1
  scaling:
    replicas: 1
    revisionHistoryLimit: 10
  containers:
    ports:
      - containerPort: 8000
        protocol: TCP
    args: []
    # Additional container environment variables
    # env:
    # - name: SOME_VAR
    #   value: 'some value'
    env: []
    # Additional volume mounts
    # - mountPath: /kubeconfig
    #   name: dashboard-kubeconfig
    #   readOnly: true
    volumeMounts:
      # Create volume mount to store logs (required)
      - mountPath: /tmp
        name: tmp-volume
    # TODO: Validate configuration
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 250m
        memory: 400Mi
    livenessProbe:
      httpGet:
        scheme: HTTP
        path: /
        port: 8000
      initialDelaySeconds: 30
      timeoutSeconds: 30
  automountServiceAccountToken: true
  # Additional volumes
  # - name: dashboard-kubeconfig
  #   secret:
  #     defaultMode: 420
  #     secretName: dashboard-kubeconfig
  volumes:
    - name: tmp-volume
      emptyDir: {}
  nodeSelector: {}
  # Labels & annotations for Metrics Scraper related resources
  labels: {}
  annotations: {}
  serviceLabels: {}
  serviceAnnotations: {}

## Optional Metrics Server sub-chart configuration
## Enable this if you don't already have metrics-server enabled on your cluster and
## want to use it with dashboard metrics-scraper
## refs:
##  - https://github.com/kubernetes-sigs/metrics-server
##  - https://github.com/kubernetes-sigs/metrics-server/tree/master/charts/metrics-server
metrics-server:
  enabled: false
  args:
    - --kubelet-preferred-address-types=InternalIP
    - --kubelet-insecure-tls

## Required Kong sub-chart with DBless configuration to act as a gateway
## for our all containers.
kong:
  enabled: true
  image:
    repository: kong
    tag: "3.6"
  ## Configuration reference: https://docs.konghq.com/gateway/3.6.x/reference/configuration
  env:
    dns_order: LAST,A,CNAME,AAAA,SRV
    plugins: 'off'
    nginx_worker_processes: 1
  ingressController:
    enabled: false
  manager:
    enabled: false
  dblessConfig:
    configMap: kong-dbless-config
  proxy:
    type: ClusterIP
    http:
      enabled: false

## Optional Cert Manager sub-chart configuration
## Enable this if you don't already have cert-manager enabled on your cluster.
cert-manager:
  enabled: false
  installCRDs: true

## Optional Nginx Ingress sub-chart configuration
## Enable this if you don't already have nginx-ingress enabled on your cluster.
nginx:
  enabled: false
  controller:
    electionID: ingress-controller-leader
    ingressClassResource:
      name: internal-nginx
      default: false
      controllerValue: k8s.io/internal-ingress-nginx
    service:
      type: ClusterIP

## Extra configurations:
## - manifests
## - predefined roles
## - prometheus
## - etc...
extras:
  # Extra Kubernetes manifests to be deployed
  # manifests:
  # - apiVersion: v1
  #   kind: ConfigMap
  #   metadata:
  #     name: additional-configmap
  #   data:
  #     mykey: myvalue
  manifests: []
  serviceMonitor:
    # Whether to create a Prometheus Operator service monitor.
    enabled: false
    # Here labels can be added to the serviceMonitor
    labels: {}
    # Here annotations can be added to the serviceMonitor
    annotations: {}
    # metrics.serviceMonitor.metricRelabelings Specify Metric Relabelings to add to the scrape endpoint
    # ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#relabelconfig
    metricRelabelings: []
    # metrics.serviceMonitor.relabelings [array] Prometheus relabeling rules
    relabelings: []
    # ServiceMonitor connection scheme. Defaults to HTTPS.
    scheme: https
    # ServiceMonitor connection tlsConfig. Defaults to {insecureSkipVerify:true}.
    tlsConfig:
      insecureSkipVerify: true

Панель управления работает нормально. Я проверил это, установив для службы kong-proxy Kubernetes параметры LoadBalancer. Затем я добавил общедоступный DNS https://arjun-test-k8s-dashboard-2.eastus.cloudapp.azure.com, и я смог получить доступ к панели управления.

Проблема заключалась в том, что каждый раз мне нужно было входить в систему, используя токен службы.

Я хочу войти в систему, используя Azure AD. Затем я следовал документации ниже:
https://github.com/weinong/k8s-dashboard-with-aks-aad

Я следовал точно таким же шагам. Я использовал тот же публичный DNS фронтального IP-адреса.
Ниже приведены файлы, которые я использовал:

oauth2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: oauth2-proxy
  template:
    metadata:
      labels:
        k8s-app: oauth2-proxy
    spec:
      containers:
      - args:
        - --provider=azure
        - --oidc-issuer-url=https://sts.windows.net/44444444-3333-222222-1111111111/
        - --email-domain=*
        - --http-address=0.0.0.0:4180
        - --azure-tenant=44444444-3333-222222-1111111111
        - --client-id=44444444-3333-222222-1111111111
        - --client-secret=44444444-3333-222222-1111111111
        - --cookie-secret=N5dG88dXYxzI7fgjgsM8tJWxaXZ9Zw==
        - --pass-access-token=true
        - --resource=6dae42f8-4368-4678-94ff-3960e28e3630
        - --set-xauthrequest=true
        image: docker.io/weinong/oauth2-proxy:v6.1.1-109-g49746b8
        imagePullPolicy: Always
        name: oauth2-proxy
        ports:
        - containerPort: 4180
          protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
  namespace: kubernetes-dashboard
spec:
  ports:
  - name: http
    port: 4180
    protocol: TCP
    targetPort: 4180
  selector:
    k8s-app: oauth2-proxy

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
    nginx.ingress.kubernetes.io/auth-response-headers: 'X-Auth-Request-Access-Token'
    nginx.ingress.kubernetes.io/configuration-snippet: |
      auth_request_set $token $upstream_http_x_auth_request_access_token;
      proxy_set_header Authorization "Bearer $token";
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  name: external-auth-oauth2
  namespace: kubernetes-dashboard
spec:
  rules:
  - host: arjun-test-k8s-dashboard-2.eastus.cloudapp.azure.com  # Replace with your valid FQDN
    http:
      paths:
      - path: /login
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard-kong-proxy
            port:
              number: 443
  tls:
  - hosts:
    - arjun-test-k8s-dashboard-2.eastus.cloudapp.azure.com  # Replace with your valid FQDN
    secretName: k8s-dashboard-ingress-tls-secret
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: oauth2-proxy
  namespace: kubernetes-dashboard
  annotations:
    nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
    nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
spec:
  rules:
  - host: arjun-test-k8s-dashboard-2.eastus.cloudapp.azure.com  # Replace with your valid FQDN
    http:
      paths:
      - path: /oauth2
        pathType: Prefix
        backend:
          service:
            name: oauth2-proxy
            port:
              number: 4180
  tls:
  - hosts:
    - arjun-test-k8s-dashboard-2.eastus.cloudapp.azure.com  # Replace with your valid FQDN
    secretName: k8s-dashboard-ingress-tls-secret

Чтобы создать secretName, я следовал следующим шагам:

openssl req -x509 -newkey rsa:4096 -keyout tls.key -out tls.crt -days 365
openssl rsa -in tls.key -out tls.decrypted.key
kubectl create secret tls k8s-dashboard-ingress-tls-secret --cert=tls.crt --key=tls.decrypted.key --namespace=kubernetes-dashboard

Теперь, когда я пытаюсь зайти на https://arjun-test-k8s-dashboard-2.eastus.cloudapp.azure.com/, я не получаю ничего.

  1. Я вернул службу kong-proxy обратно к ClusterIP.
  2. Добавил правило балансировки нагрузки Azure, указывающее на порт и резервный порт TCP/443.
  3. Добавил проверку работоспособности, указывающую на TCP/443.
  4. Конфигурация фронтального IP указывала на IP-адрес, где я настроил DNS FQDN arjun-test-k8s-dashboard-2.eastus.cloudapp.azure.com.
  5. Разрешил весь трафик отовсюду в NSG.

Ниже приведен скриншот служб k8s:
введите описание изображения здесь

Ниже приведена конфигурация описанного Ingress:
введите описание изображения здесь

Кто-нибудь знает, как решить эту проблему? Я просто хочу войти в панель управления Kubernetes, сначала аутентифицировавшись через Azure AD.

.

Ответ или решение

Интеграция Kubernetes Dashboard с Azure Active Directory (Azure AD) — это важный шаг для обеспечения безопасного доступа к вашему кластеру Kubernetes. Она позволяет избежать использования статических токенов и обеспечивает более надежную аутентификацию через Azure AD. Рассмотрим, как вы можете осуществить эту интеграцию, используя предоставленные ресурсы и настройки, а также разберем наиболее вероятные проблемы, которые могут возникнуть в процессе.

Теоретическая основа

Kubernetes Dashboard часто используется для наблюдения и управления ресурсами в кластере Kubernetes. По умолчанию, доступ к Dashboard осуществляется через токены сервисных аккаунтов, однако это не всегда безопасно и удобно. Интеграция с Azure AD позволяет использовать уже существующую инфраструктуру аутентификации и управлять доступом на основе ролей (RBAC).

OAuth2 Proxy играет ключевую роль в этой интеграции, выполняя роль посредника между пользователем и Dashboard. OAuth2 Proxy перенаправляет запросы на авторизацию в Azure AD и затем предоставляет доступ на основе полученных токенов.

Пример настройки

Предоставленный вами YAML-файл для OAuth2 Proxy показывает, как настроить это приложение для работы с Azure AD. Vаш OAuth2 Proxy настроен с использованием правильных параметров: provider=azure, oidc-issuer-url, azure-tenant, client-id и client-secret. Эти параметры позволяют прокси-серверу взаимодействовать с Azure AD для проведения аутентификации пользователей.

Кроме того, вы настроили два объекта Ingress, используя аннотации для интеграции с nginx. Аннотации auth-url и auth-signin определяют пути, которые следует использовать для аутентификации.

Применение настройки и устранение неполадок

Теперь, когда мы понимаем теоретическую часть и имеем пример настройки, рассмотрим основные практические шаги и возможные проблемы, с которыми вы можете столкнуться.

  1. Проверка DNS и TLS-сертификатов: Убедитесь, что доменное имя arjun-test-k8s-dashboard-2.eastus.cloudapp.azure.com действительно указывает на ваш кластер. Проверьте, что сертификаты генерируются корректно и совпадают с вашим доменом. Например, используйте openssl для проверки сертификатов:

    openssl x509 -in tls.crt -noout -text
  2. Проверка конфигурации Ingress и Nginx: Убедитесь, что Ingress и Nginx настроены правильно. Проверьте, что аннотации корректно обрабатываются и что Nginx может корректно перенаправлять трафик на OAuth2 Proxy.

  3. Проверка OAuth2 Proxy: Убедитесь, что OAuth2 Proxy получает правильные идентификаторы клиента и секреты из Azure AD. Проверьте логи OAuth2 Proxy на предмет ошибок, связанных с доступом или аутентификацией.

  4. Узлы кластера и роль LoadBalancer: Убедитесь, что Azure Load Balancer настроен правильно. Проверьте правила баланса нагрузки и правила безопасности сети (NSG), чтобы убедиться, что трафик на порту 443 корректно пропускается и перенаправляется на ваш кластер.

  5. Проверка Health Probe: Проверьте, что Health Probe настроен правильно и что он успешно проходит на всех целевых узлах.

  6. Тестирование доступа: Попробуйте вручную вызвать некоторые конечные точки через curl или другой HTTP-клиент, чтобы проверить, корректно ли обрабатывается трафик и возвращаются ли ожидаемые ответы.

  7. Обновление документации и параметров: Убедитесь, что вы следуете последним изменениям и рекомендациям в документации на GitHub по интеграции Kubernetes Dashboard с Azure AD.

Если после выполнения всех проверок проблема остается нерешенной, может быть полезно обратиться к специалистам по Kubernetes или Azure либо задать вопрос в более детализированном формате на профессиональных форумах, таких как Stack Overflow или GitHub Discussions.

Итогом будет надежное и удобное решение для аутентификации, которое позволит управлять доступом к Kubernetes Dashboard через Azure AD, обеспечивая безопасность и эффективность вашей инфраструктуры.

Оцените материал
Добавить комментарий

Капча загружается...