Вопрос или проблема
У меня есть кластер 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/
, я не получаю ничего.
- Я вернул службу kong-proxy обратно к ClusterIP.
- Добавил правило балансировки нагрузки Azure, указывающее на порт и резервный порт TCP/443.
- Добавил проверку работоспособности, указывающую на TCP/443.
- Конфигурация фронтального IP указывала на IP-адрес, где я настроил DNS FQDN
arjun-test-k8s-dashboard-2.eastus.cloudapp.azure.com
. - Разрешил весь трафик отовсюду в 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
определяют пути, которые следует использовать для аутентификации.
Применение настройки и устранение неполадок
Теперь, когда мы понимаем теоретическую часть и имеем пример настройки, рассмотрим основные практические шаги и возможные проблемы, с которыми вы можете столкнуться.
-
Проверка DNS и TLS-сертификатов: Убедитесь, что доменное имя
arjun-test-k8s-dashboard-2.eastus.cloudapp.azure.com
действительно указывает на ваш кластер. Проверьте, что сертификаты генерируются корректно и совпадают с вашим доменом. Например, используйтеopenssl
для проверки сертификатов:openssl x509 -in tls.crt -noout -text
-
Проверка конфигурации Ingress и Nginx: Убедитесь, что Ingress и Nginx настроены правильно. Проверьте, что аннотации корректно обрабатываются и что Nginx может корректно перенаправлять трафик на OAuth2 Proxy.
-
Проверка OAuth2 Proxy: Убедитесь, что OAuth2 Proxy получает правильные идентификаторы клиента и секреты из Azure AD. Проверьте логи OAuth2 Proxy на предмет ошибок, связанных с доступом или аутентификацией.
-
Узлы кластера и роль LoadBalancer: Убедитесь, что Azure Load Balancer настроен правильно. Проверьте правила баланса нагрузки и правила безопасности сети (NSG), чтобы убедиться, что трафик на порту 443 корректно пропускается и перенаправляется на ваш кластер.
-
Проверка Health Probe: Проверьте, что Health Probe настроен правильно и что он успешно проходит на всех целевых узлах.
-
Тестирование доступа: Попробуйте вручную вызвать некоторые конечные точки через
curl
или другой HTTP-клиент, чтобы проверить, корректно ли обрабатывается трафик и возвращаются ли ожидаемые ответы. -
Обновление документации и параметров: Убедитесь, что вы следуете последним изменениям и рекомендациям в документации на GitHub по интеграции Kubernetes Dashboard с Azure AD.
Если после выполнения всех проверок проблема остается нерешенной, может быть полезно обратиться к специалистам по Kubernetes или Azure либо задать вопрос в более детализированном формате на профессиональных форумах, таких как Stack Overflow или GitHub Discussions.
Итогом будет надежное и удобное решение для аутентификации, которое позволит управлять доступом к Kubernetes Dashboard через Azure AD, обеспечивая безопасность и эффективность вашей инфраструктуры.