Delen via


Apache Superset beschikbaar maken voor internet

In dit artikel wordt beschreven hoe u Apache Superset beschikbaar maakt op internet.

Selectie van hostnaam

  1. 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

  2. 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.

  1. 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.
  2. 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
  3. De ingangscontroller ngninx implementeren in de default-naamruimte

    helm 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 de default naamruimte. bijvoorbeeld NAMESPACE=default

  4. 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}}"
    
  5. 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
    
  6. 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
    
  7. 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
    
  8. Werk het DNS-label bij in het bijbehorende openbare IP-adres.

    1. Open uw Superset AKS Kubernetes-cluster in Azure Portal.

    2. Selecteer Eigenschappen in het linkernavigatievenster.

    3. Open de koppeling Infrastructuurresourcegroep.

    4. Zoek het openbare IP-adres met deze tags:

      {
        "k8s-azure-cluster-name": "kubernetes",
        "k8s-azure-service": "default/ingress-nginx-controller"
      }
      
    5. Selecteer "Configuratie" in het linkermenu van de Public IP-sectie.

    6. Voer het DNS-naamlabel in met de <superset-instance-name> gedefinieerd in hostnaamselectie.

  9. Controleer of uw ingang voor OAuth is geconfigureerd.

    Voer kubectl get ingress uit om de twee gemaakte ingangen, azure-trino-superset en oauth2-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 aan ingress-nginx-controller een EXTERNAL-IPis toegewezen.

    Fooi

    U kunt http://{{superset_hostname}}/oauth2 openen om te testen of het OAuth-pad werkt.

  10. 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
    
  11. Rol uw ingress uit.

          kubectl apply -f ingress.yaml
    
  12. 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.