El conjunto de documentos para este producto aspira al uso de un lenguaje no discriminatorio. A los fines de esta documentación, "no discriminatorio" se refiere al lenguaje que no implica discriminación por motivos de edad, discapacidad, género, identidad de raza, identidad étnica, orientación sexual, nivel socioeconómico e interseccionalidad. Puede haber excepciones en la documentación debido al lenguaje que se encuentra ya en las interfaces de usuario del software del producto, el lenguaje utilizado en función de la documentación de la RFP o el lenguaje utilizado por un producto de terceros al que se hace referencia. Obtenga más información sobre cómo Cisco utiliza el lenguaje inclusivo.
Cisco ha traducido este documento combinando la traducción automática y los recursos humanos a fin de ofrecer a nuestros usuarios en todo el mundo contenido en su propio idioma. Tenga en cuenta que incluso la mejor traducción automática podría no ser tan precisa como la proporcionada por un traductor profesional. Cisco Systems, Inc. no asume ninguna responsabilidad por la precisión de estas traducciones y recomienda remitirse siempre al documento original escrito en inglés (insertar vínculo URL).
Este documento sirve como guía de configuración complementaria para High Availability Version 2 (HAv2) en Azure. Encontrará detalles completos en la Guía de implementación de Cisco CSR 1000v para Microsoft Azure. HAv2 se soporta primero en Cisco IOS-XE® Denali 16.9.1s.
En HAv2, la implementación de HA se ha movido fuera del código Cisco IOS XE y se ejecuta en el contenedor del shell de invitado. Para obtener más información sobre el shell de invitado, vea la sección Shell de invitado en la Guía de Configuración de Programabilidad. En HAv2, la configuración de nodos de redundancia se realiza en el shell de invitado con un conjunto de scripts Python.
Cisco recomienda que tenga conocimiento sobre estos temas:
La información de este documento se basa en Cisco IOS-XE® Denali 16.9.1s implementado nativamente desde Azure Marketplace.
Los recursos implementados en Azure a partir de los pasos de este documento pueden incurrir en un costo.
The information in this document was created from the devices in a specific lab environment. All of the devices used in this document started with a cleared (default) configuration. Si tiene una red en vivo, asegúrese de entender el posible impacto de cualquier comando.
vrf definition GS
!
iox
app-hosting appid guestshell
app-vnic gateway1 virtualportgroup 0 guest-interface 0
guest-ipaddress 192.168.35.102 netmask 255.255.255.0
app-default-gateway 192.168.35.101 guest-interface 0
name-server0 8.8.8.8
!
interface VirtualPortGroup0
vrf forwarding GS
ip address 192.168.35.101 255.255.255.0
ip nat inside
!
interface GigabitEthernet1
ip nat outside
!
ip access-list standard GS_NAT_ACL
permit 192.168.35.0 0.0.0.255
!
ip nat inside source list GS_NAT_ACL interface GigabitEthernet1 vrf GS overload
!
! The static route points to the gig1 private ip address gateway
ip route vrf GS 0.0.0.0 0.0.0.0 GigabitEthernet1 10.1.0.1 global
Nota: Las nuevas instancias implementadas desde Azure Marketplace pueden tener iox preconfigurado.
csr-1#guestshell enable csr-1#guestshell
[guestshell@guestshell ~]$ ping www.google.com PING www.google.com (172.217.14.228) 56(84) bytes of data. 64 bytes from sea30s02-in-f4.1e100.net (172.217.14.228): icmp_seq=1 ttl=51 time=4.89 ms 64 bytes from sea30s02-in-f4.1e100.net (172.217.14.228): icmp_seq=2 ttl=51 time=5.02 ms
Ejecute curl para verificar que los metadatos se puedan recuperar. La interfaz de cara externa debe ser Gig1 (eth0). De lo contrario, verifique los grupos de seguridad de Azure, el enrutamiento u otras características que podrían bloquear 169.254.169.254. 169.254.169.254 no es una dirección que se puede hacer ping.
[guestshell@guestshell ~]$ curl -H Metadata:true "http://169.254.169.254/metadata/instance?api-version=2018-04-02" {"compute":{"location":"westus2","name":"csr-david-2","offer":"cisco-csr-1000v","osType":"Linux","placementGroupId":"","plan":{"name":"16_7","product":"cisco-csr-1000v","publisher":"cisco"},"platformFaultDomain":"0","platformUpdateDomain":"0","publicKeys":[],"publisher":"cisco","resourceGroupName":"RG-David-2","sku":"16_7","subscriptionId":"09e13fd4-def2-46aa-a056-xxxxxxxxxxx","tags":"","version":"16.7.120171201","vmId":"f8f32b48-daa0-4053-8ba4-xxxxxxxxxxxxx","vmScaleSetName":"","vmSize":"Standard_DS2_v2","zone":""},"network":{"interface":[{"ipv4":{"ipAddress":[{"privateIpAddress":"10.3.0.5","publicIpAddress":"21.53.135.210"}],"subnet":[{"address":"10.3.0.0","prefix":"24"}]},"ipv6":{"ipAddress":[]},"macAddress":"000D3A93F"},{"ipv4":{"ipAddress":[{"privateIpAddress":"10.3.1.5","publicIpAddress":""}],"subnet":[{"address":"10.3.1.0","prefix":"24"}]},"ipv6":{"ipAddress":[]},"macAddress":"000D3A961"}]}}[
Nota: No utilice el modo sudo para instalar paquetes. Asegúrese de utilizar la opción —user. Si no se realizan los tres pasos, se instalarán los paquetes en la carpeta incorrecta. Esto puede dar lugar a ImportErrors. Para reparar paquetes instalados incorrectamente, puede que necesite ejecutar el comando IOS guestshell detect y comenzar de nuevo.
[guestshell@guestshell ~]$ pip install csr_azure_guestshell~=1.1 --user [guestshell@guestshell ~]$ pip install csr_azure_ha~=1.0 --user [guestshell@guestshell ~]$ source ~/.bashrc
[guestshell@guestshell ~]$ which show_node.py ~/.local/lib/python2.7/site-packages/csr_azure_ha/client_api/show_node.py
Hay dos métodos para permitir que el CSR1000v realice llamadas de API a Azure.
Nota: La clave de aplicación utilizada en HAv1 es la clave codificada. La clave de aplicación utilizada en HAv2 es la clave no codificada. Si no ha anotado la clave no codificada, es posible que deba crear una nueva, ya que las claves no se pueden recuperar.
Paso 1. Habilite MSI para cada una de las máquinas virtuales CSR1000v. Navegue hasta la VM en Azure Portal. Navegue hasta Identidad y haga clic en Sistema asignado > En > Guardar.
Paso 2. En Subnet Route Table, para permitir llamadas de API desde el router CSR1000v, elija Access Control (IAM) y haga clic en Add.
Paso 3. Elija Role - Network Contributor. Elija Asignar acceso a - Máquina virtual. Elija la suscripción adecuada. Seleccione la VM de la lista que tiene su MSI activado.
create_node.py -i 100 -p azure -s 09e13fd4-def2-46aa-a056-xxxxxxxxxx -g RG-David -t subnet2-david-CSR-RouteTable -r 8.8.8.8/32 -n 10.3.1.4 -a 1e0f69c3-b6aa-46cf-b5f9-xxxxxxxxx -d ae49849c-2622-4d45-b95e-xxxxxxxxx -k bDEN1k8batJqpeqjAuUvaUCZn5Md6rWEi=
Utilice set_params.py para agregar o cambiar parámetros individuales.
set_params.py -i 100 [option1] [option2]
Utilice clear_params.py para borrar parámetros individuales.
clear_params.py -i 100 [option1] [option2]
Utilice delete_node.py para eliminar el nodo.
delete_node.py -i 100
La opción node_event.py con peerFail es cómo HAv2 activa una conmutación por fallas y actualiza la Azure Route Table. Aquí es donde tiene la flexibilidad para programar su propia lógica. Puede utilizar EEM dentro del IOS para ejecutar node_event.py, o escribir una secuencia de comandos python dentro del shell de invitado.
Un ejemplo es detectar un estado inactivo de una interfaz con EEM para activar node_event.py.
event manager applet HAv2_interface_flap event syslog pattern "Interface GigabitEthernet2, changed state to down" action 1 cli command "enable" action 2 cli command "guestshell run node_event.py -i 100 -e peerFail"
Puede ejecutar manualmente node_event.py en el shell de invitado para probar un failover real.
[guestshell@guestshell ~]$ node_event.py -i 100 -e peerFail
El HAv2 también puede revertir la ruta nuevamente al router original con la opción revert. Esta es una configuración opcional que simula la prevención. El indicador -m primario en create_node.py se requiere para ser configurado en el router primario. Este es un ejemplo que utiliza BFD para monitorear el estado de la interfaz.
event manager applet bfd_session_up event syslog pattern ".*BFD_SESS_UP.*" action 1 cli command "enable" action 2 cli command "guestshell run node_event.py -i 100 -e revert"
[guestshell@guestshell ~]$ set_params.py -i 100 -m
Asegúrese de que los tres procesos estén activos.
systemctl status auth-token systemctl status azure-ha systemctl status waagent
Reinicie los que hayan fallado.
sudo systemctl start waagent sudo systemctl start azure-ha sudo systemctl start auth-token
Dos métodos para verificar la configuración agregada por create_node.py.
show_node.py -i 100
[guestshell@guestshell ~]$ cat azure/HA/node_file {'appKey': 'bDEN1k8batJqWEiGXAxSR4Y=', 'index': '100', 'routeTableName': 'subnet2-david-CSR-RouteTable', 'route': '8.8.8.8/32', 'nextHop': '10.3.1.4', 'tenantId': 'ae49849c-2622-4d45-b95e-xxxxxxxxxx', 'resourceGroup': 'RG-David', 'appId': '1e0f69c3-b6aa-46cf-b5f9-xxxxxxxxxx', 'subscriptionId': '09e13fd4-def2-46aa-a056-xxxxxxxxxxx', 'cloud': 'azure'}
Simula un failover en el router en espera. Esto en realidad no causa una conmutación por fallas pero verifica que la configuración sea válida. Verifique los registros en el paso 6.
node_event.py -i 100 -e verify
Activa un evento de failover real en el router en espera. En Azure, verifique si la tabla de rutas actualizó la ruta al nuevo salto. Verifique los registros en el paso 6.
node_event.py -i 100 -e peerFail
[guestshell@guestshell ~]$ ls -latr /home/guestshell/azure/HA/events/ total 5 drwxr-xr-x 3 guestshell root 1024 Sep 18 23:01 .. drwxr-xr-x 2 guestshell root 1024 Sep 19 19:40 . -rw-r--r-- 1 guestshell guestshell 144 Sep 19 19:40 routeTableGetRsp -rw-r--r-- 1 guestshell guestshell 390 Sep 19 19:40 event.2018-09-19 19:40:28.341616 -rw-r--r-- 1 guestshell guestshell 541 Sep 18 23:09 event.2018-09-18 23:09:58.413523
Paso 1. Los paquetes Python se instalan erróneamente en /usr/lib/python2.7/site-packages/. Destruya el shell de invitado y siga los pasos de configuración.
[guestshell@guestshell ~]$ create_node.py -h bash: create_node.py: command not found [guestshell@guestshell ~]$ ls /usr/lib/python2.7/site-packages/
La trayectoria de instalación correcta es ~/.local/lib/python2.7/site-packages/.
[guestshell@guestshell ~]$ which show_node.py ~/.local/lib/python2.7/site-packages/csr_azure_ha/client_api/show_node.py
Paso 2. Si la autenticación no se configuró correctamente en el paso 3, se pueden generar errores de token. Para la autenticación AAD, si la clave de aplicación utilizada no es válida, o la URL codificada, se pueden ver errores de autenticación después de que node_event.py se active.
[guestshell@guestshell ~]$ cat /home/guestshell/azure/HA/events/routeTableGetRsp {"error":{"code":"AuthenticationFailedMissingToken","message":"Authentication failed. The 'Authorization' header is missing the access token."}} [guestshell@guestshell ~]$ cat /home/guestshell/azure/HA/events/event.2018-09-19\ 23\:02\:55.581684 Event type is verify appKey zGuYMyXQha5Kqe8xdufhUJ9eX%2B1zIhLsuw%3D index 100 routeTableName subnet2-david-CSR-RouteTable route 8.8.8.8/32 nextHop 10.3.1.4 tenantId ae49849c-2622-4d45-b95e-xxxxxxxxxx resourceGroup RG-David appId 1e0f69c3-b6aa-46cf-b5f9-xxxxxxxxxx subscriptionId 09e13fd4-def2-46aa-a056-xxxxxxxxxx cloud azure All required parameters have been provided Requesting token using Azure Active Directory Token= Failed to obtain token Reading route table Route GET request failed with code 401
Paso 3. Si el ID de arrendatario o app-id es incorrecto.
[guestshell@guestshell ~]$ cat azure/tools/TokenMgr/token_get_rsp {"error":"invalid_request","error_description":"AADSTS90002: Tenant 1e0f69c3-b6aa-46cf-b5f9-xxxxxxxxxx not found. This may happen if there are no active subscriptions for the tenant. Check with your subscription administrator.\r\nTrace ID: 8bc80efc-f086-46ec-83b9-xxxxxxxxxxx\r\nCorrelation ID: 2c6062f8-3a40-4b0e-83ec-xxxxxxxxxxx\r\nTimestamp: 2018-09-19 23:58:02Z","error_codes":[90002],"timestamp":"2018-09-19 23:58:02Z","trace_id":"8bc80efc-f086-46ec-83b9-xxxxxxxxxxxx","correlation_id":"2c6062f8-3a40-4b0e-83ec-xxxxxxxxxxx"}
Paso 4. Durante la instalación del paquete, se pudo haber utilizado el modo sudo, —el usuario no estaba incluido o origen ~/.bashrc no se ejecutó. Esto hace que create_node.py falle o genere un ImportError.
[guestshell@guestshell ~]$ create_node.py -i 1 -p azure -s d91490ec -g RG -t RT -r 10.12.0.0/11 -n 10.2.0.31 -m secondary
/usr/lib64/python2.7/site-packages/cryptography/hazmat/primitives/constant_time.py:26: CryptographyDeprecationWarning: Support for your Python version is deprecated. The next version of cryptography will remove support. Please upgrade to a 2.7.x release that supports hmac.compare_digest as soon as possible.
utils.DeprecatedIn23,
create_node -i 1 -p azure -s d91490ec -g RG -t RT -r 10.12.0.0/11 -n 10.2.0.31 -m secondary failed
[guestshell@guestshell ~]$ create_node.py -i 1 -p azure -s d91490ec -g RG -t RT -r 10.1.0.0/18 -n 10.2.0.31 -m secondary Traceback (most recent call last): File "/usr/bin/create_node.py", line 5, in import ha_api ImportError: No module named ha_api
Paso 5. Verifique el historial de instalación del paquete.
[guestshell@guestshell ~]$ cat azure/HA/install.log Installing the Azure high availability package Show the current PATH /usr/local/bin:/usr/bin:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_ha/client_api Show the current PYTHONPATH :/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_guestshell:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_guestshell/TokenMgr:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_guestshell/MetadataMgr:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_guestshell/bin:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_ha/client_api:/home/guestshell/.local/lib/python2.7/site-packages/csr_azure_ha/server
Paso 6. Verifique los registros de configuración de HA.
[guestshell@guestshell ~]$ cat azure/HA/azha.log 2018-09-24 16:56:29.215743 High availability server started with pid=7279 2018-09-24 17:03:20.602579 Server processing create_node command 2018-09-24 17:03:20.602729 Created new node with index 100
Paso 6. Ejecute el script debug_ha.sh para recopilar todos los archivos de registro en un único archivo .tar.
[guestshell@guestshell ~]$ bash ~/azure/HA/debug_ha.sh
El archivo se coloca en la memoria flash de inicialización a la que se puede acceder desde el shell de invitado y desde el IOS.
[guestshell@guestshell ~]$ ls /bootflash/ha_debug.tar /bootflash/ha_debug.tar
csr-david-2#dir | i debug 28 -rw- 92160 Sep 27 2018 22:42:54 +00:00 ha_debug.tar