Я следую документации по , как включить IAP в GKE .
Я:
- настроил экран согласия
- Создание учетных данных OAuth
- Добавление универсального URL-адреса перенаправления
- Добавьте себя как
IAP-secured Web App User
И напишите мое развертывание так:
data:
client_id: <my_id>
client_secret: <my_secret>
kind: Secret
metadata:
name: backend-iap-secret
type: Opaque
---
apiVersion: v1
kind: Service
metadata:
name: grafana
spec:
ports:
- port: 443
protocol: TCP
targetPort: 3000
selector:
k8s-app: grafana
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: grafana
spec:
replicas: 1
template:
metadata:
labels:
k8s-app: grafana
spec:
containers:
- env:
- name: GF_SERVER_HTTP_PORT
value: "3000"
image: docker.io/grafana/grafana:6.7.1
name: grafana
ports:
- containerPort: 3000
protocol: TCP
readinessProbe:
httpGet:
path: /api/health
port: 3000
---
apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
name: backend-config-iap
spec:
iap:
enabled: true
oauthclientCredentials:
secretName: backend-iap-secret
---
apiVersion: networking.gke.io/v1beta1
kind: ManagedCertificate
metadata:
name: monitoring-tls
spec:
domains:
- monitoring.foo.com
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
beta.cloud.google.com/backend-config: '{"default": "backend-config-iap"}'
kubernetes.io/ingress.global-static-ip-name: monitoring
networking.gke.io/managed-certificates: monitoring-tls
name: grafana
spec:
backend:
serviceName: grafana
servicePort: 443
Когда я смотрю на свой вход, я вижу следующее:
$ k describe ingress
Name: grafana
[...]
Annotations: beta.cloud.google.com/backend-config: {"default": "backend-config-iap"}
ingress.kubernetes.io/backends: {"k8s-blabla":"HEALTHY"}
[...]
Events: <none>
$
Я могу без проблем подключиться к веб-странице, графана включена и работает, но я также могу подключиться без проверки подлинности ( ведьма это проблема).
Так что все выглядит хорошо, но IAP не активируется, почему?
Хуже всего то, что, если я включаю его вручную, он работает, но если я повторяю kubectl apply -f monitoring.yaml
IAP отключен.
Чего мне не хватает?
Поскольку мои секретные значения хранятся в секретном менеджере (и извлекаются во время сборки), я подозревал, что у моего секрета есть некоторые глюки (пробелы) , \ n, et c.) в них, поэтому я добавил скрипт для проверки:
gcloud compute backend-services update \
--project=<my_project_id> \
--global \
$(kubectl get ingress grafana -o json | jq -r '.metadata.annotations."ingress.kubernetes.io/backends"' | jq -r 'keys[0]') \
--iap=enabled,oauth2-client-id=$(gcloud --project="<my_project_id>" beta secrets versions access latest --secret=Monitoring_client_id),oauth2-client-secret=$(gcloud --project="<my_project_id>" beta secrets versions access latest --secret=Monitoring_secret)
И теперь IAP работает правильно включен с правильным клиентом OAuth, поэтому мои секреты «чисты»
Кстати, я также попытался переименовать секретные переменные следующим образом (из client_id): * oauth_client_id * oauth-client-id * clientID ( как в документации бэкэнда )
Я также записал значение в бэкэнде так:
kind: BackendConfig
metadata:
name: backend-config-iap
spec:
iap:
enabled: true
oauthclientCredentials:
secretName: backend-iap-secret
clientID: <value>
clientSecret: <value>
Но тоже не работает.
Ошибка :
Тот факт, что IAP уничтожается при повторном развертывании (после включения его в веб-интерфейсе), является частью моего сценария развертывания в этом тесте (я сделал удаление kubectl ранее).
Но, тем не менее, я не могу включить IAP только с моей конфигурацией бэкэнда.
Как предложено, я подал отчет об ошибке: https://issuetracker.google.com/issues/153475658
Решение, заданное Тотем
Изменение данного yaml следующим образом:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.global-static-ip-name: monitoring
networking.gke.io/managed-certificates: monitoring-tls
name: grafana
[...]
---
apiVersion: v1
kind: Service
metadata:
name: grafana
annotations:
beta.cloud.google.com/backend-config: '{"default": "backend-config-iap"}'
[...]
Бэкэнд связан с сервис, а не Ingress ... Теперь это работает!