Share via


Configuración de un nombre de dominio personalizado y un certificado SSL con el complemento de enrutamiento de aplicaciones

Una entrada es un objeto de API que define reglas, que permiten el acceso externo a los servicios en un clúster de Azure Kubernetes Service (AKS). Cuando se crea un objeto de entrada que usa las clases de entrada nginx del complemento de enrutamiento de aplicaciones, el complemento crea, configura y administra uno o varios controladores de entrada en el clúster de AKS.

En este artículo se muestra cómo definir una configuración avanzada de entrada para cifrar el tráfico con certificados SSL/TLS almacenados en Azure Key Vault y usar Azure DNS para administrar zonas DNS.

Complemento de enrutamiento de aplicaciones con características de nginx

El complemento de enrutamiento de aplicaciones con nginx ofrece lo siguiente:

  • Configuración sencilla de controladores de entrada nginx administrados.
  • Integración con un DNS externo como Azure DNS para la administración de zonas globales y privadas
  • Terminación SSL con certificados almacenados en un almacén de claves, como Azure Key Vault.

Requisitos previos

Conectarse al clúster AKS

Para conectarse al clúster de Kubernetes desde su equipo local, use kubectl, el cliente de la línea de comandos de Kubernetes. Lo puede instalar localmente. Para ello debe usar el comando az aks install-cli. Si usa Azure Cloud Shell, kubectl ya está instalado.

Configure kubectl para conectarse al clúster de Kubernetes usando el comando az aks get-credentials.

az aks get-credentials --resource-group <ResourceGroupName> --name <ClusterName>

Finalización del tráfico HTTPS con certificados de Azure Key Vault

Para habilitar la compatibilidad con el tráfico HTTPS, consulte los siguientes requisitos previos:

Creación de una instancia de Azure Key Vault para almacenar el certificado

Nota:

Si ya tiene una clave en Azure Key Vault, puede omitir este paso.

Cree una instancia de Azure Key Vault mediante el comando az keyvault create.

az keyvault create --resource-group <ResourceGroupName> --location <Location> --name <KeyVaultName> --enable-rbac-authorization true

Crear y exportar un certificado SSL autofirmado

Para las pruebas, puede usar un certificado público autofirmado en lugar de un certificado firmado por la entidad de certificación (CA). Si ya tiene un certificado, puede omitir este paso.

Precaución

Los certificados autofirmados son certificados digitales que no están firmados por una entidad de certificación de terceros de confianza. Los certificados autofirmados son creados, emitidos y firmados por la empresa o el desarrollador responsable del sitio web o el software que se firma. Este es el motivo por el que los certificados autofirmados se consideran no seguros para las aplicaciones y sitios web orientados al público. Azure Key Vault tiene una asociación de confianza con algunas entidades de certificación.

  1. Cree un certificado SSL autofirmado para usarlo con la entrada mediante el comando openssl req. Asegúrese de reemplazar <Hostname> por el nombre DNS que está usando.

    openssl req -new -x509 -nodes -out aks-ingress-tls.crt -keyout aks-ingress-tls.key -subj "/CN=<Hostname>" -addext "subjectAltName=DNS:<Hostname>"
    
  2. Exporte el certificado SSL y omita el símbolo del sistema con el comando openssl pkcs12 -export.

    openssl pkcs12 -export -in aks-ingress-tls.crt -inkey aks-ingress-tls.key -out aks-ingress-tls.pfx
    

Importación del certificado a Azure Key Vault

Importe el certificado SSL en Azure Key Vault mediante el comando az keyvault certificate import. Si el certificado está protegido con contraseña, puede pasar la contraseña a través de la marca --password.

az keyvault certificate import --vault-name <KeyVaultName> --name <KeyVaultCertificateName> --file aks-ingress-tls.pfx [--password <certificate password if specified>]

Importante

Para permitir que el complemento vuelva a cargar los certificados desde Azure Key Vault cuando cambien, debe habilitar la característica de rotación automática de secretos del controlador CSI de almacén de secretos con el argumento --enable-secret-rotation. Cuando se habilita la rotación automática, el controlador actualiza el montaje del pod y el secreto de Kubernetes mediante el sondeo periódico de los cambios, en función del intervalo de sondeo de rotación que puede definir. El intervalo de sondeo de rotación predeterminado es de dos minutos.

Habilitación de la integración de Azure Key Vault

En un clúster con el complemento de enrutamiento de aplicaciones habilitado, use el comando az aks approuting update mediante los argumentos --enable-kv y --attach-kv para habilitar el proveedor de Azure Key Vault para el controlador CSI del Almacén de secretos y aplicar las asignaciones de roles necesarias.

Azure Key Vault ofrece dos sistemas de autorización: control de acceso basado en roles de Azure (RBAC de Azure), que funciona en el plano de administración y en el modelo de directiva de acceso, que funciona tanto en el plano de administración como en el plano de datos. La operación --attach-kv elegirá el modelo de acceso adecuado que se va a usar.

Nota:

El comando az aks approuting update --attach-kv usa los permisos del usuario que ejecuta el comando para crear la asignación de roles de Azure Key Vault. Este rol se asigna a la identidad administrada del complemento. Para obtener más información sobre las identidades administradas de AKS, consulte Resumen de identidades administradas.

Recupere el identificador de recurso de Azure Key Vault.

KEYVAULTID=$(az keyvault show --name <KeyVaultName> --query "id" --output tsv)

A continuación, actualice el complemento de enrutamiento de aplicaciones para habilitar el controlador CSI del almacén de secretos de Azure Key Vault y aplicar la asignación de roles.

az aks approuting update --resource-group <ResourceGroupName> --name <ClusterName> --enable-kv --attach-kv ${KEYVAULTID}

Habilitación de la integración de Azure DNS

Para habilitar la compatibilidad con las zonas DNS, revise los siguientes requisitos previos:

  • El complemento de enrutamiento de aplicaciones se puede configurar para crear registros automáticamente en una o varias zonas DNS globales y privadas de Azure para los hosts definidos en los recursos de entrada. Todas las zonas globales de Azure DNS deben estar en el mismo grupo de recursos y todas las zonas privadas de Azure DNS deben estar en el mismo grupo de recursos. Si no tiene una zona de Azure DNS, puede crear una.

Crear una zona Azure DNS pública

Nota:

Si ya tiene una clave en la zona de Azure DNS, puede omitir este paso.

  1. Creación de una zona de Azure DNS mediante el comando az network dns zone create.

    az network dns zone create --resource-group <ResourceGroupName> --name <ZoneName>
    

Asociación de una zona de Azure DNS al complemento de enrutamiento de aplicaciones

Nota:

El comando az aks approuting zone add usa los permisos del usuario que ejecuta el comando para crear la asignación de roles zona de Azure DNS. Este rol se asigna a la identidad administrada del complemento. Para obtener más información sobre las identidades administradas de AKS, consulte Resumen de identidades administradas.

  1. Recupere el id. de recurso de la zona DNS mediante el comando az network dns zone show y establezca la salida en una variable denominada ZONEID.

    ZONEID=$(az network dns zone show --resource-group <ResourceGroupName> --name <ZoneName> --query "id" --output tsv)
    
  2. Actualice el complemento para habilitar la integración con Azure DNS mediante el comando az aks approuting zone. Puede pasar una lista separada por comas de identificadores de recursos de zona DNS.

    az aks approuting zone add --resource-group <ResourceGroupName> --name <ClusterName> --ids=${ZONEID} --attach-zones
    

Creación de la entrada que usa un nombre de host y un certificado de Azure Key Vault

El complemento de enrutamiento de aplicaciones web crea una clase de entrada en el clúster denominada webapprouting.kubernetes.azure.com. Al crear un objeto de entrada de esta clase, se activa el complemento.

  1. Obtenga el identificador URI del certificado para utilizarlo en la entrada desde Azure Key Vault mediante el comando az keyvault certificate show.

    az keyvault certificate show --vault-name <KeyVaultName> --name <KeyVaultCertificateName> --query "id" --output tsv
    

    En la salida de ejemplo siguiente se muestra el URI de certificado devuelto desde el comando:

    https://KeyVaultName.vault.azure.net/certificates/KeyVaultCertificateName/ea62e42260f04f17a9309d6b87aceb44
    
  2. Copie el siguiente manifiesto YAML en un nuevo archivo denominado ingress.yaml y guarde el archivo en el equipo local.

    Actualice <Hostname> con el nombre del host DNS y <KeyVaultCertificateUri> con el URI devuelto desde el comando para consultar Azure Key Vault en el paso 1 anterior. El valor de cadena de *<KeyVaultCertificateUri>* solo debe incluir https://yourkeyvault.vault.azure.net/certificates/certname. Se debe omitir la versión del certificado al final de la cadena de URI para obtener la versión actual.

    La clave secretName de la sección tls define el nombre del secreto que contiene el certificado para este recurso de entrada. Este certificado se presenta en el explorador cuando un cliente vaya a la dirección URL especificada en la clave <Hostname>. Asegúrese de que el valor de secretName es igual a keyvault- seguido del valor del nombre del recurso de entrada (de metadata.name). En el ejemplo de YAML, secretName debe ser igual a keyvault-<your Ingress name>.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.azure.com/tls-cert-keyvault-uri: <KeyVaultCertificateUri>
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: webapprouting.kubernetes.azure.com
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - <Hostname>
        secretName: keyvault-<your ingress name>
    
  3. Cree los recursos del clúster mediante el comando kubectl apply.

    kubectl apply -f ingress.yaml -n hello-web-app-routing
    

    En la siguiente salida de ejemplo se muestran los recursos creados:

    Ingress.networking.k8s.io/aks-helloworld created
    

Comprobación de que se creó la entrada administrada

Compruebe que la entrada administrada se ha creado con el comando kubectl get ingress.

kubectl get ingress -n hello-web-app-routing

En la siguiente salida de ejemplo se muestra la entrada administrada creada:

NAME             CLASS                                HOSTS               ADDRESS       PORTS     AGE
aks-helloworld   webapprouting.kubernetes.azure.com   myapp.contoso.com   20.51.92.19   80, 443   4m

Pasos siguientes

Obtenga información sobre la supervisión de las métricas del controlador de ingress-nginx incluidas con el complemento de enrutamiento de aplicaciones con Prometheus en Grafana como parte del análisis del rendimiento y el uso de la aplicación.