Apache Superset beschikbaar maken voor internet
In dit artikel wordt beschreven hoe u Apache Superset beschikbaar maakt op internet.
Selectie van hostnaam
Kies een hostnaam voor Superset.
Tenzij u een aangepaste DNS-naam gebruikt, moet deze hostnaam overeenkomen met het patroon:
<superset-instance-name>.<azure-region>.cloudapp.azure.com
. De superset-instance-naam moet uniek zijn in de Azure-regio.Voorbeeld:
myuniquesuperset.westus3.cloudapp.azure.com
Haal een TLS-certificaat op voor de hostnaam en plaats het in uw Key Vault en noem het
aks-ingress-tls
. Leer hoe je een certificaat in een Azure Key Vaultplaatst.
Ingress instellen
Met de volgende instructies voegt u een tweede verificatielaag toe in de vorm van een OAuth-autorisatieproxy met behulp van Oauth2Proxy. Deze laag betekent dat geen onbevoegde clients de Superset-toepassing bereiken.
Voeg de volgende geheimen toe aan uw Key Vault.
Geheime naam Beschrijving client-id De client-id van uw Azure-service-principal. Voor de OAuth-proxy moet deze id een geheim zijn. oauth2proxy-redis-password Wachtwoord voor proxycache. Het wachtwoord dat wordt gebruikt door de OAuth-proxy voor toegang tot het back-endimplementatie-exemplaar van Redis in Kubernetes. Genereer een sterk wachtwoord. oauth2proxy-cookie-secret Cookiegeheim van 32 tekens, gebruikt om de cookiegegevens te versleutelen. Dit geheim moet 32 tekens lang zijn. Voeg deze callbacks toe aan de configuratie van uw Superset Azure AD-toepassing.
https://{{superset_hostname}}/oauth2/callback
- voor OAuth2-proxy
https://{{superset_hostname}}/oauth-authorized/azure
- voor Superset
De ingangscontroller ngninx implementeren in de
default
-naamruimtehelm install ingress-nginx-superset ingress-nginx/ingress-nginx \ --namespace default \ --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \ --set controller.config.proxy-connect-timeout="60" \ --set controller.config.proxy-read-timeout="1000" \ --set controller.config.proxy-send-timeout="1000" \ --set controller.config.proxy-buffer-size="'64k'" \ --set controller.config.proxy-buffers-number="8"
Zie Azure-instructies hiervoor gedetailleerde instructies.
Notitie
De stappen van de ingress-nginx-controller maken gebruik van de Kubernetes-naamruimte
ingress-basic
. Deze moet worden gewijzigd met dedefault
naamruimte. bijvoorbeeldNAMESPACE=default
Maak TLS Secret Providerklasse.
In deze stap wordt beschreven hoe het TLS-certificaat wordt gelezen uit de Sleutelkluis en wordt omgezet in een Kubernetes-geheim dat moet worden gebruikt door inkomend verkeer:
Bijwerken in de volgende yaml:
-
{{MSI_CLIENT_ID}}
: de client-id van de beheerde identiteit die is toegewezen aan het Superset-cluster ($MANAGED_IDENTITY_RESOURCE
). -
{{KEY_VAULT_NAME}}
: de naam van de Azure Key Vault die de geheimen bevat. -
{{KEY_VAULT_TENANT_ID}}
: de id-guid van de Azure-tenant waar de Key Vault zich bevindt.
tls-secretprovider.yaml
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: azure-tls spec: provider: azure # secretObjects defines the desired state of synced K8s secret objects secretObjects: - secretName: ingress-tls-csi type: kubernetes.io/tls data: - objectName: aks-ingress-tls key: tls.key - objectName: aks-ingress-tls key: tls.crt parameters: usePodIdentity: "false" useVMManagedIdentity: "true" userAssignedIdentityID: "{{MSI_CLIENT_ID}}" # the name of the AKV instance keyvaultName: "{{KEY_VAULT_NAME}}" objects: | array: - | objectName: aks-ingress-tls objectType: secret # the tenant ID of the AKV instance tenantId: "{{KEY_VAULT_TENANT_ID}}"
-
Maak de klasse OauthProxy Secret Provider.
Werk het volgende yaml-bestand bij:
-
{{MSI_CLIENT_ID}}
: de client-id van de beheerde identiteit die is toegewezen aan het Superset-cluster ($MANAGED_IDENTITY_RESOURCE
). -
{{KEY_VAULT_NAME}}
: de naam van de Azure Key Vault die de geheimen bevat. -
{{KEY_VAULT_TENANT_ID}}
: de id-guid van de Azure-tenant waar de sleutelkluis zich bevindt.
oauth2-secretprovider.yaml
# This is a SecretProviderClass example using aad-pod-identity to access the key vault apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: oauth2-secret-provider spec: provider: azure parameters: useVMManagedIdentity: "true" userAssignedIdentityID: "{{MSI_CLIENT_ID}}" usePodIdentity: "false" # Set to true for using aad-pod-identity to access your key vault keyvaultName: "{{KEY_VAULT_NAME}}" # Set to the name of your key vault cloudName: "" # [OPTIONAL for Azure] if not provided, the Azure environment defaults to AzurePublicCloud objects: | array: - | objectName: oauth2proxy-cookie-secret objectType: secret - | objectName: oauth2proxy-redis-password objectType: secret - | objectName: client-id objectType: secret - | objectName: client-secret objectType: secret tenantId: "{{KEY_VAULT_TENANT_ID}}" # The tenant ID of the key vault secretObjects: - secretName: oauth2-secret type: Opaque data: # OauthProxy2 Secrets - key: cookie-secret objectName: oauth2proxy-cookie-secret - key: client-id objectName: client-id - key: client-secret objectName: client-secret - key: redis-password objectName: oauth2proxy-redis-password - secretName: oauth2-redis type: Opaque data: - key: redis-password objectName: oauth2proxy-redis-password
-
Maak een configuratie voor de OAuth-proxy.
Bijwerken in de volgende yaml:
-
{{superset_hostname}}
- de internetgerichte hostnaam gekozen bij hostnaamselectie -
{{tenant-id}}
: de id-guid van de Azure-tenant waar uw service-principal is gemaakt.
Optioneel: de lijst met email_domains bijwerken. Voorbeeld:
email_domains = [ "microsoft.com" ]
oauth2-values.yaml
# Force the target Kubernetes version (it uses Helm `.Capabilities` if not set). # This is especially useful for `helm template` as capabilities are always empty # due to the fact that it doesn't query an actual cluster kubeVersion: # OAuth client configuration specifics config: # OAuth client secret existingSecret: oauth2-secret configFile: |- email_domains = [ ] upstreams = [ "file:///dev/null" ] image: repository: "quay.io/oauth2-proxy/oauth2-proxy" tag: "v7.4.0" pullPolicy: "IfNotPresent" extraArgs: provider: oidc oidc-issuer-url: https://login.microsoftonline.com/<tenant-id>/v2.0 login-url: https://login.microsoftonline.com/<tenant-id>/v2.0/oauth2/authorize redeem-url: https://login.microsoftonline.com/<tenant-id>/v2.0/oauth2/token oidc-jwks-url: https://login.microsoftonline.com/common/discovery/keys profile-url: https://graph.microsoft.com/v1.0/me skip-provider-button: true ingress: enabled: true path: /oauth2 pathType: ImplementationSpecific hosts: - "{{superset_hostname}}" annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/proxy_buffer_size: 64k nginx.ingress.kubernetes.io/proxy_buffers_number: "8" tls: - secretName: ingress-tls-csi hosts: - "{{superset_hostname}}" extraVolumes: - name: oauth2-secrets-store csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: oauth2-secret-provider - name: tls-secrets-store csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: azure-tls extraVolumeMounts: - mountPath: "/mnt/oauth2_secrets" name: oauth2-secrets-store readOnly: true - mountPath: "/mnt/tls-secrets-store" name: tls-secrets-store readOnly: true # Configure the session storage type, between cookie and redis sessionStorage: # Can be one of the supported session storage cookie/redis type: redis redis: # Secret name that holds the redis-password and redis-sentinel-password values existingSecret: oauth2-secret # Can be one of sentinel/cluster/standalone clientType: "standalone" # Enables and configure the automatic deployment of the redis subchart redis: enabled: true auth: existingSecret: oauth2-secret # Enables apiVersion deprecation checks checkDeprecation: true
-
OAuth-proxybronnen implementeren.
kubectl apply -f oauth2-secretprovider.yaml kubectl apply -f tls-secretprovider.yaml helm repo add oauth2-proxy https://oauth2-proxy.github.io/manifests helm repo update helm upgrade --install --values oauth2-values.yaml oauth2 oauth2-proxy/oauth2-proxy
Werk het DNS-label bij in het bijbehorende openbare IP-adres.
Open uw Superset AKS Kubernetes-cluster in Azure Portal.
Selecteer Eigenschappen in het linkernavigatievenster.
Open de koppeling Infrastructuurresourcegroep.
Zoek het openbare IP-adres met deze tags:
{ "k8s-azure-cluster-name": "kubernetes", "k8s-azure-service": "default/ingress-nginx-controller" }
Selecteer "Configuratie" in het linkermenu van de Public IP-sectie.
Voer het DNS-naamlabel in met de
<superset-instance-name>
gedefinieerd in hostnaamselectie.
Controleer of uw ingang voor OAuth is geconfigureerd.
Voer
kubectl get ingress
uit om de twee gemaakte ingangen,azure-trino-superset
enoauth2-oauth2-proxy
, te zien. Het IP-adres komt overeen met het openbare IP-adres uit de vorige stap.Ook bij het uitvoeren van
kubectl get services
ziet u dat er aaningress-nginx-controller
eenEXTERNAL-IP
is toegewezen.Fooi
U kunt
http://{{superset_hostname}}/oauth2
openen om te testen of het OAuth-pad werkt.Definieer een ingress voor toegang tot Superset, maar leid alle niet-geautoriseerde aanroepen om naar
/oauth
.Werk bij in het volgende yaml-bestand:
-
{{superset_hostname}}
- de naar het internet gerichte hostnaam die is gekozen in hostnaamselectie
ingress.yaml-
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/auth-signin: https://$host/oauth2/start?rd=$escaped_request_uri nginx.ingress.kubernetes.io/auth-url: http://oauth2-oauth2-proxy.default.svc.cluster.local:80/oauth2/auth nginx.ingress.kubernetes.io/proxy-buffer-size: 64k nginx.ingress.kubernetes.io/proxy-buffers-number: "8" nginx.ingress.kubernetes.io/rewrite-target: /$1 generation: 1 labels: app.kubernetes.io/name: azure-trino-superset name: azure-trino-superset namespace: default spec: rules: - host: "{{superset_hostname}}" http: paths: - backend: service: name: superset port: number: 8088 path: /(.*) pathType: Prefix tls: - hosts: - "{{superset_hostname}}" secretName: ingress-tls-csi
-
Rol uw ingress uit.
kubectl apply -f ingress.yaml
Test.
Open
https://{{superset_hostname}}/
in uw browser.
Problemen met inkomend verkeer oplossen
Fooi
Voer de volgende commando's uit om de ingress-implementatie opnieuw in te stellen:
kubectl delete secret ingress-tls-csi
kubectl delete secret oauth2-secret
helm uninstall oauth2-proxy
helm uninstall ingress-nginx-superset
kubectl delete ingress azure-trino-superset
Nadat u deze resources hebt verwijderd, moet u deze instructies vanaf het begin opnieuw starten.
Ongeldig beveiligingscertificaat: Kubernetes Ingress-controller nepcertificaat
Dit veroorzaakt een tls-certificaatverificatiefout in uw browser/client. Als u deze fout wilt zien, inspecteert u het certificaat in een browser.
De gebruikelijke oorzaak van dit probleem is dat uw certificaat onjuist is geconfigureerd:
Controleer of u uw certificaat in Kubernetes kunt zien:
kubectl get secret ingress-tls-csi --output yaml
Controleer of uw CN overeenkomt met de CN die is opgegeven in uw certificaat.
De CN-mismatch wordt vastgelegd in de ingress pod. Deze logboeken kunnen worden weergegeven door
kubectl logs <ingress pod>
uit te voeren.Voorbeeld:
kubectl logs ingress-nginx-superset-controller-f5dd9ccfd-qz8wc
De CN-mismatchfout wordt beschreven met deze logregel:
SSL-certificaat 'default/ingress-tls-csi' bevat geen algemene naam of alternatieve naam voor onderwerp voor server {servernaam}: x509: certificaat is geldig voor {ongeldige hostnaam}, niet {werkelijke hostnaam}
Kan host niet oplossen
Als de hostnaam niet kan worden omgezet voor de Superset-instance, heeft het publieke IP-adres geen hostnaam toegewezen. Zonder deze toewijzing kan DNS de hostnaam niet oplossen.
Controleer de stappen in de sectie Het DNS-label bijwerken in het bijbehorende openbare IP-.
404 / nginx
De Nginx-ingangscontroller kan Superset niet vinden. Zorg ervoor dat Superset is geïmplementeerd door kubectl get services
uit te voeren en te controleren op de aanwezigheid van een superset
-service. Controleer of de back-endservice in ingress.yaml overeenkomt met de servicenaam die wordt gebruikt voor Superset.
503-service tijdelijk niet beschikbaar /nginx
De service wordt uitgevoerd, maar is niet toegankelijk. Controleer de servicepoortnummers en de servicenaam.