La documentazione per questo prodotto è stata redatta cercando di utilizzare un linguaggio senza pregiudizi. Ai fini di questa documentazione, per linguaggio senza di pregiudizi si intende un linguaggio che non implica discriminazioni basate su età, disabilità, genere, identità razziale, identità etnica, orientamento sessuale, status socioeconomico e intersezionalità. Le eventuali eccezioni possono dipendere dal linguaggio codificato nelle interfacce utente del software del prodotto, dal linguaggio utilizzato nella documentazione RFP o dal linguaggio utilizzato in prodotti di terze parti a cui si fa riferimento. Scopri di più sul modo in cui Cisco utilizza il linguaggio inclusivo.
Cisco ha tradotto questo documento utilizzando una combinazione di tecnologie automatiche e umane per offrire ai nostri utenti in tutto il mondo contenuti di supporto nella propria lingua. Si noti che anche la migliore traduzione automatica non sarà mai accurata come quella fornita da un traduttore professionista. Cisco Systems, Inc. non si assume alcuna responsabilità per l’accuratezza di queste traduzioni e consiglia di consultare sempre il documento originale in inglese (disponibile al link fornito).
Questo documento funge da guida di configurazione supplementare per High Availability versione 2 (HAv2) in Azure. Per ulteriori informazioni, vedere la Guida alla distribuzione di Cisco CSR 1000v per Microsoft Azure. HAv2 è supportato per la prima volta in Cisco IOS-XE® Denali 16.9.1s.
In HAv2, l'implementazione di HA è stata spostata dal codice Cisco IOS XE ed eseguita nel contenitore di shell guest. Per ulteriori informazioni sulla shell guest, vedere la sezione Guest Shell nella Guida alla configurazione della programmabilità. In HAv2, la configurazione dei nodi di ridondanza viene eseguita nella shell guest con un set di script Python.
Cisco raccomanda la conoscenza dei seguenti argomenti:
Le informazioni di questo documento si basano su Cisco IOS-XE® Denali 16.9.1s distribuito in modo nativo da Azure Marketplace.
Le risorse distribuite in Azure dai passaggi di questo documento potrebbero sostenere un costo.
Le informazioni discusse in questo documento fanno riferimento a dispositivi usati in uno specifico ambiente di emulazione. Su tutti i dispositivi menzionati nel documento la configurazione è stata ripristinata ai valori predefiniti. Se la rete è operativa, valutare attentamente eventuali conseguenze derivanti dall'uso dei comandi.
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: Le nuove istanze distribuite da Azure Marketplace potrebbero avere iox preconfigurato.
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
Eseguire il comando curl per verificare che i metadati siano recuperabili. L'interfaccia esterna deve essere Gig1 (eth0). In caso contrario, controllare i gruppi di sicurezza, il routing o altre funzionalità di Azure che potrebbero bloccare 169.254.169.254. 169.254.169.254 non è un indirizzo su cui è possibile eseguire il 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: Non utilizzare la modalità sudo per installare i pacchetti. Assicuratevi di utilizzare l'opzione —user. Se non si eseguono tutti e tre i passaggi, i pacchetti verranno installati nella cartella errata. È possibile che si verifichino errori di importazione. Per correggere i pacchetti installati in modo errato, potrebbe essere necessario eseguire il comando IOS guestshell delete e ricominciare.
[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
Esistono 2 metodi per consentire a CSR1000v di effettuare chiamate API ad Azure.
Nota: La chiave app utilizzata in HAv1 è la chiave codificata. La chiave app utilizzata in HAv2 è la chiave non codificata. Se non si è annotata la chiave non codificata, potrebbe essere necessario crearne una nuova, poiché le chiavi non sono recuperabili.
Passaggio 1. Abilitare MSI per ciascuna delle macchine virtuali CSR1000v. Passare alla macchina virtuale nel portale di Azure. Passare a Identità e fare clic su Sistema assegnato > Attivo > Salva.
Passaggio 2. In Subnet Route Table, per consentire le chiamate API dal router CSR1000v, selezionare Access Control (IAM) e fare clic su Add.
Passaggio 3. Scegliere Ruolo - Collaboratore di rete. Scegliere Assegna accesso a - Macchina virtuale. Scegliere la sottoscrizione corretta. Selezionare dall'elenco la VM per la quale MSI è attivato.
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=
Utilizzate set_params.py per aggiungere o modificare singoli parametri.
set_params.py -i 100 [option1] [option2]
Utilizzate clear_params.py per cancellare i singoli parametri.
clear_params.py -i 100 [option1] [option2]
Utilizzare delete_node.py per eliminare il nodo.
delete_node.py -i 100
Lo script node_event.py con l'opzione peerFail illustra come HAv2 attiva un failover e aggiorna la tabella di route di Azure. È qui che si ha la flessibilità di programmare la propria logica. È possibile utilizzare EEM in IOS per eseguire node_event.py o scrivere uno script python in guestshell.
Ad esempio, per attivare node_event.py è necessario attivare lo stato di disattivazione di un'interfaccia con EEM.
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"
È possibile eseguire manualmente node_event.py in guestshell per verificare un failover reale.
[guestshell@guestshell ~]$ node_event.py -i 100 -e peerFail
HAv2 può inoltre ripristinare il percorso al router originale con l'opzione revert. Si tratta di una configurazione opzionale che simula i diritti di priorità. Il flag -m primary in create_node.py deve essere impostato sul router primario. Questo è un esempio che utilizza il BFD per monitorare lo stato dell'interfaccia.
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
Assicurarsi che tutti e tre i processi siano attivi.
systemctl status auth-token systemctl status azure-ha systemctl status waagent
Riavviare gli eventuali errori.
sudo systemctl start waagent sudo systemctl start azure-ha sudo systemctl start auth-token
Due metodi per verificare la configurazione aggiunta da 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'}
Soft per simulare un failover sul router di standby. In questo modo non viene eseguito un failover, ma viene verificata la validità della configurazione. Controllare i registri nel passaggio 6.
node_event.py -i 100 -e verify
Attivare un evento di failover reale sul router di standby. In Azure, verificare se la tabella di route ha aggiornato la route al nuovo hop. Controllare i log nel passaggio 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
Passaggio 1. I pacchetti Python sono installati in /usr/lib/python2.7/site-packages/ in modo errato. Eliminare guestshell e seguire i passaggi di configurazione.
[guestshell@guestshell ~]$ create_node.py -h bash: create_node.py: command not found [guestshell@guestshell ~]$ ls /usr/lib/python2.7/site-packages/
Il percorso di installazione corretto è ~/.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
Passaggio 2. Se l'autenticazione non è stata configurata o non è stata configurata correttamente nel passaggio 3, è possibile che vengano generati errori di token. Per l'autenticazione AAD, se la chiave dell'app utilizzata non è valida o è codificata tramite URL, è possibile che si verifichino errori di autenticazione dopo l'attivazione di node_event.py.
[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
Passaggio 3. Se l'ID tenant o l'ID app non è corretto.
[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"}
Passaggio 4. Durante l'installazione del pacchetto potrebbe essere stata utilizzata la modalità sudo, —non è stato incluso l'utente o non è stata eseguita l'origine ~/.bashrc. In questo modo, create_node.py non riesce o genera 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
Passaggio 5. Controllare la cronologia di installazione del pacchetto.
[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
Passaggio 6. Controllare i log di configurazione 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
Passaggio 6. Eseguire lo script debug_ha.sh per raccogliere tutti i file di log in un unico file tar.
[guestshell@guestshell ~]$ bash ~/azure/HA/debug_ha.sh
Il file viene inserito in bootflash, accessibile sia da guestshell che da 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