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
- Un clúster de AKS con el complemento de enrutamiento de aplicaciones.
- Azure Key Vault si desea configurar la terminación SSL y almacenar certificados en el almacén hospedado en Azure.
- Azure DNS si desea configurar la administración de zonas globales y privadas y hospedarlas en Azure.
- Para adjuntar una instancia de Azure Key Vault o una zona de Azure DNS, necesita el rol Propietario, Administrador de cuentas de Azureo Coadministrador de Azure en la suscripción de Azure.
- Todas las zonas DNS públicas deben estar en la misma suscripción y grupo de recursos.
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:
- Un certificado SSL. Si no tiene ninguno, puede crear un certificado.
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.
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>"
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.
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.
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)
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.
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
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 incluirhttps://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óntls
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 desecretName
es igual akeyvault-
seguido del valor del nombre del recurso de entrada (demetadata.name
). En el ejemplo de YAML,secretName
debe ser igual akeyvault-<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>
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.
Azure Kubernetes Service