안녕하세요. 

이번 포스팅은 ACI에서 공용 서비스를 구성하기 위한 방법 중의 하나가 될 수 있는 내용입니다.

ACI에서 Tenant 간의 통신 시에도 Border Leaf을 통한 외부를 통해서 통신하지 않고, ACI 내부 간에 통신을 하기 위한 방법입니다.

공용으로 제공하게 될 서비스를 다른 테넌트에서도 직접 통신하도록 하여, 불필요하게 트래픽이 외부로 나가지 않고

또한 공용 서비스가 아닌 서비스 간에는 서비스를 분리할 수 있게 됩니다. 


실제 구성에 있어서는 어떤 대역을 어떻게 구성하여 기존 라우팅 테이블과의 이슈가 없이 할 수 있을지에 대한 고민은 필요할 것입니다.










 

먼저 공용으로 사용 하게 될 서비스가 있는 테넌트의 EPG를 선택합니다.

이 EPG가 실제 다른 테넌트에서 공용으로 사용하게 될 서비스 그룹이 됩니다.

이제 EPG에서 서브넷을 생성합니다.

 

 

 

 

 

해당 EPG에서 생성되는 서브넷은 다른 테넌트에서 접근하기 위한 네트워크로 설정하게 됩니다.

마지막에 라우팅 테이블을 확인해보겠지만, 이 EPG에서 추가한 서브넷은 다른 VRF에서 Attatch된 네트워크로 인식됩니다.

그리고 다른 VRF에서도 이 서브넷을 사용하여야 하기 때문에 Scope를 'Shared between VRFs' 로 선택합니다.

ACI 버전에 따라서, Shared Subnet 이라는 옵션일 수도 있습니다.

 

 

 

 

다음은 이 EPG를 다른 곳에서 사용할 수 있도록 하기 위해서 Contract을 생성합니다.

다른 테넌트에서도 공용으로 사용하게 될 Contract이기 때문에 ContractScopeGlobal 이 됩니다.

 

 

 

 

 

만들어진 Global Contract은 Common EPG의 Contract에 Provided로 추가(Add)를 합니다.  

 

 

 

 

 

Global Contract이 다른 Tenant에서도 사용될 수 있도록 Export 합니다.

다른 Tenant에서 보이는 이름은 여기서 지정한 Name으로 됩니다.

 

 

 

 

 

 


 

이제 Common EPG에 대한 설정은 완료되었습니다.

다음은 Common EPG를 사용하고자 하는 EPG에서 Export된 Contract을 추가하면 됩니다. 

 

이제 모든 설정 과정이 끝났습니다.

 

이제 라우팅 테이블을 확인해 보면, 아래와 같이

Tenant-ZIGI에서는 Tenant-SPACE 의 BD에 대한 네트워크 대역이 라우팅 테이블로 보이고,

Tenant-SPACE에서는 Tenant-ZIGI의 EPG에 선언된 네트워크 대역이 라우팅 테이블로 보이게 됩니다.

 

 

 

ZIGI_LEAF# show ip route vrf  DEV:SPACE-VRF
IP Route Table for VRF "DEV:SPACE-VRF"

..전략..
192.168.254.192/29, ubest/mbest: 1/0, attached, direct, pervasive
    *via 10.0.56.64%overlay-1, [1/0], 01w10d, static
192.168.254.193/32, ubest/mbest: 1/0, attached, pervasive
    *via 192.168.254.193, vlan129, [1/0], 01w10d, local, local
192.168.254.200/29, ubest/mbest: 1/0, attached, direct, pervasive
    *via 10.0.56.64%overlay-1, [1/0], 01w10d, static

...후략...

 

 

ZIGI_LEAF# show ip route vrf  Service_Admin:ZIGI-VRF
IP Route Table for VRF "Service_Admin:ZIGI-VRF"

...전략...
192.168.254.192/29, ubest/mbest: 1/0, attached, direct, pervasive
    *via 10.0.56.64%overlay-1, [1/0], 01w10d, static
192.168.254.200/29, ubest/mbest: 1/0, attached, direct, pervasive
    *via 10.0.56.64%overlay-1, [1/0], 01w10d, static
192.168.254.201/32, ubest/mbest: 1/0, attached, pervasive
    *via 192.168.254.201, vlan83, [1/0], 01w10d, local, local

...후략...

 

 


Posted by 네떡지기
분류없음2016.12.29 10:21

Last Update : 16.12.30

   * MMM으로는 기본 VIP 전환 시에, GARP 를 발생하여 Table 갱신이 되지는 않는 것으로 보입니다. 
     우선 조치할 수 있을만한 방법은 VIP에 대해서 VIP 전환 시점에 Source-Ping을 하던지,
     아니면 주기적으로 동일 대역 내에서 VIP에 PIng을 쳐서, 지속적으로 갱신을 해야 할 것 같습니다.
     주기적으로 VIP 전환 시 Ping을 체크하는 경우도 아래의 설정은 필요로 합니다.

     추가적으로 확인되는 사항은 업데이트 하도록 하겠습니다.

 



오랜만에 하는 포스팅은 Cisco ACI에 대한 관련 이슈 공유 내용입니다.

Bridge Domain에서의 기본 설정인 Hardware Proxy와 관련한 이슈 사항입니다.

앞으로 아마도 ACI에 대한 포스팅을 시작하게 될 듯 싶은 데... 우선 정리 포스팅 전에..

어쩌다보니.. 간단한 이슈 포스팅을 먼저하게 되었습니다 ^^;

물론 ACI 이외에도 기존처럼 다양한 포스팅 들도 함께 할 수 있도록 노력하겠습니다. ^^

즐거운 연말되세요!

 


Cisco ACI Bridge Domain 관련

 

○ 현상 

  ㆍ MySQL DB Clustering을 위한 MMM(Multi Master Replication Manager) 을 서버에서 사용 중.(Active-Standby)

  ㆍVIP가 Active 서버에서 Standby 서버로 전환될 경우에 정상적으로 통신이 되지 않음.

 

 

○ 확인 및 원인 분석

  ㆍACI 내에서 VIP에 대한 정보(IP/Mac Address)가 갱신되지 않음.

  ㆍMMM에서 VIP가 Active-Standby로 전환되면서, IP에 대한 MAC이 변경되었기 때문에 GARP를 보내서,

     Table이 갱신되어야 하나, 정상적으로 이뤄지지 않은 것으로 추정

  ㆍBridge Domain의 L2 Unknown Unicast 설정이 Hardware Proxy이고, ARP Flooding은 비활성화

  ㆍBridge Domain의 설정으로 GARP 패킷이 Drop되어서, 정상적으로 Table 갱신이 되지는 않는 것으로 추정.

 

 

○ 조치 및 결과

  ㆍBridge Domain의 ARP Flooding 설정을 활성화 상태로 변경 후, DB VIP가 Standby로 넘어감에 따라
     Table이 정상적으로 갱신되는 것을 확인

 

○ Bridge Domain 관련 내용 

  ㆍBridge Domain은 기존의 전통적인 네트워크의 VLAN 컨셉과 유사. Brocast와 Flooding Domain으로 동작 가능
       - 물론 관련 설정이 활성화 되어 있어야 하며, 완전하게 동일하지는 않음.

  ㆍBridge Domain의 Unknwon Unicast 프레임에 대해서, 아래의 2가지 모드로 동작 가능.

       - Optimized mode : Hardware Proxy

           Mapping Database 사용하여 처리

       - Flood mode : Flood

           Bridge Domain의 Multicast Tree를 이용해서 L2 Unknown unicast가 Flood됨.

  ㆍBridge Domain의 기본 L2 Unknown Unicast의 동작 방식은 Hardware Proxy임.

  ㆍBridge Domain의 ARP Flooding은 Default Disable 상태.  

  ㆍHardware Proxy의 기본동작은 L2 Unknown Unicast에 대해서 Spine으로 보내게 되고, Spine의 Mapping Database에

      해당 정보가 없을 경우, 패킷이 Drop 됨.

  

 

○ 정리하면..

ㆍDB서버에서 Active가 Standby로 Failover되면서, VIP가 DB2번기에서 올라오면서 GARP를 발생 시키는 데 기존 Hardware proxy/ARP Flooding Disable에서는 해당 패킷을 Drop시켜서 정상적으로 Table이 갱신되지 않았고, Hardware Proxy  설정을 Flood로 전환하게 되면, ARP Flooding이 같이 Enable되지만, 이 경우에는 해당 BD에 연결이 일시적으로 끊기기 때문에 (Test 시에 Ping 3개정도 빠짐), Hardware Proxy 설정은 유지한 채, ARP Flooding만 Enable로 변경 후, 정상 동작 확인

  

  

※ 참조 : Cisco Application Centric Infrastructure Release 2.0 Design Guide

 

 ARP Flooding
If ARP flooding is disabled, a Layer 3 lookup occurs for the target IP address of the ARP packet. ARP behaves like a Layer 3 unicast packet until it reaches the destination leaf switch.
ARP flooding is required when you need Gratuitous ARP (GARP) requests to update host ARP caches or router ARP caches. This is the case when an IP address may have a different MAC address (for example, with clustering of failover of load balancers and firewalls).

 

.  

 

Bridge Domain 관련 설정

 

 

 

 

 

 

* Bridge Domain 설정에서 ARP Flooding 설정을 활성화하게 되면, L3 설정에 아래와 같은 설정이 가능.  

  우선 해당 설정까지는 하지 않은 상태였으나, MMM VIP가 전환되는 데에는 문제가 없었음.

  아래 설정은 어느 경우에 사용되는지는 추가로 확인 필요.

 

 

 

 

GARP

   - Source / Destination IP는 모두 패킷을 보내는 시스템 IP로 설정

   - Destination MAC은 Broadcast MAC 으로 설정 (ff:ff:ff:ff:ff:ff)

   - 일반적으로 GARP는 Request만 발생하고, Response는 발생하지 않음.

   - IP 충돌을 감지하거나, 다른 시스템의 ARP 테이블을 갱신하기 위해서 사용(특히나, Clustering Solution에서 Active가 전환되는 경우에 동일한 IP에 대한 Mac 주소가 변경되기  때문에 필요)

 

※ 참조 : https://wiki.wireshark.org/Gratuitous_ARP

Posted by 네떡지기
DevOps/Programmability2015.02.17 20:35

NX-API

 

기존의 Python for Networker라는 주제로 포스팅하던 것을, 주제를 넓혀보고자..

Programmability for Networker로 이름을 변경하고 지속해서 시작합니다. ^^;

이번 포스팅은 Cisco의 Programmability를 지원하는 NX-API에 대한 포스팅입니다.  


 

NX-API  - Cisco Programmability

 

◈ NX-API

    - HTTP/HTTPS의 RPC 기반의 API 기능 수행

    - 'show', 'configuration', 'Linux Bash' 지원

    - JSON-RPC를 지원

    - Cisco Nexus 9000 platform 적용

 

 

◈ NX-API 동작

    - HTTP/HTTPS로 전송되며, 해당 CLI는 HTTP/HTTPS의 POST body로 encode된다.

    - Nexus 장비에서는 이러한 NX-API를 위해서 Nginx HTTP Server를 사용한다.

    - Nginx와 모든 하위 Process는 Linux cgroup의 메모리 제한 값을 초과하면, Process가 재시작 되도록 하여, 본 장비 리소스를 보호한다.

 

 

◈ NX-API 명령 포맷

    - Nexus 9000의 향상된 NX-OS CLI

    -  XML 출력,JSON 형태 출력

 

 

◈ NX-API 기능 활성화

    - NX-API feature 활성화 필요 ( Default : Disable)

NX-OS#(config)# feature nxapi

 

 

◈ NX-API Sandbox

    - HTTP/HTTPS를 사용하여, 사용자가 Cli 명령을 특정 Command Type, Output Type을 지정해서 사용할 수 있는 웹기반 인터페이스

    - NX-API Feature를 활성화 후, nxapi sandbox를 사용 할 수 있다.

NX-OS#(config)# nxapi sandbox

     - 접속 방법 : Web 브라우저에서 http://mgmt-ip  로 접속

 

 

◈ NX-API Request Element

    ○ Input

         - 1개 이상의 명령어 입력 가능. (단, 동일한 Messaage Type이어야 함 : Show, Configuration, bash)

         - Show와 Conf의 경우에는 다수의 명령어 입력 시, ';'(세미콜론)을 사용하며, 명령어와 세미콜론 사이는 1칸의 공백 필요

              ex) show interface brief ; show version  or  interface eth2/1 ; switchport ; no shut

         - Bash의 경우에는 다수의 명령어 입력 시, 마찬가지로 ';'(세미콜론)을 사용하지만, 명령어와 세미콜론 사이의 공백이 없어야 함.

             ex) cd /bootflash;mkdir zigi_dir

     

 

    ○ Type

        - cli_show : 구조화 된 결과값을 나타냄. 만약 XML을 지원하지 않는 명령 입력 시에는 error 메시지를 리턴

                              즉, 특정 명령어에 대해서만 구조화된 결과값을 나타내도록 지원. 

        - cli_show_ascii : ASCII 값으로 결과 출력.

        - cli_conf : Configuraion 명령 사용 시 사용

        - bash : Bash 명령 사용 ( NX-API에서는 non-interacitve Bash 명령을 지원)

        * 최대 10개의 Show 명령을 동시에 지원. (10개 이상 입력 시, 11번째부터는 무시 됨.)

        * ASCII의 경우에는 '|' (Pipe) 가 지원 됨. (XML의 경우에는 미 지원)

 

    ○ output_format 

        -  XML / JSON 포맷을 지원

        -  N9K는 XML을 지원하며, JSON은 XML을 전환하여 결과 값을 만든다.

   

 

◈ NX-API Response Element

     ○ version

         - NX-API Version (현재 1.0 / dCloud에서는 0.1 Version 지원)

     ○ type

         - 명령 실행 타입 (cli_show, cli_show_ascii, cli_conf, bash)

     ○ sid

         - 응답에 대한 Session ID.

         - 응답메시지가 chunked인 경우에만 유효함.

    ○ outputs

         - 요청한 전체 명령에 대한 출력 값을 감싸고 있는 Tag

         - cli_show, cli_show_ascii 의 경우에 다수의 명령어를 요청한 경우 각 개별 명령은 output tag가 붙는다.

    ○ output

         - 요청한 개별 명령에 대한 출력 값을 감싸고 있는 Tag

    ○ intput

         - 요청한 명령어

    ○ body

         - 요청한 명령어에 대한 응답

    ○ msg

         - 요청에 대한 응답의 처리 결과 메세지. code Element의 내용으로 확인 가능.

    ○ code

         - 요청에 의한 응답의 결과에 따른 Code번호.

         - NX-API에서는 표준 HTTP의 Status Code값을 사용한다.  

 

[ NX-API SandBox 실행화면 ]

 

 

◈ NX-API Sandbox 화면 구성

     ○ 상단 화면

 

 

         - 실행행하고자 하는 Command 와 Meassage format, Command Type을 지정할 수 있다.

            - POST 버튼은 위에서 지정한 Command와 Format/Type에 맞춰서 Request 코드가 만들어면서, Request가 이뤄진다.

 

    ○ 하단 좌측

 

 

 

 

            - 상단화면에서 지정한 내용에 따라서 만들어진 Request 내용을 출력

            - Python 버튼을 누르면, 해당 Request를 사용 할 수 있는 Python 코드로 생성 됨.

 

      ○ 하단 우측

 

 

         - 상단화면에서 요청한 내용에 대한 결과 값을 출력.

 

 

 

 NX-API Sandbox 실행 예제 -  JSON - cli_show

    

 

 

 NX-API Sandbox 실행 예제 -  JSON - bash

 

 

 NX-API Sandbox 실행 예제  -  Request를 Python Code로 변경

 

 

◈ NX-API Response Code

 

NX-API Response

Code

Message

SUCCESS

200

Success.      

CUST_OUTPUT_PIPED

204

Output is piped elsewhere due to request.

BASH_CMD_ERR

400

Input Bash command error.   

CHUNK_ALLOW_ONE_CMD_ERR

400

Chunking only allowed to one command. 

CLI_CLIENT_ERR

400

CLI execution error.    

CLI_CMD_ERR

400

Input CLI command error.   

IN_MSG_ERR

400

Request message is invalid.   

NO_INPUT_CMD_ERR

400

No input command.    

PERM_DENY_ERR

401

Permission denied.     

CONF_NOT_ALLOW_SHOW_ERR

405

Configuration mode does not allow show .

SHOW_NOT_ALLOW_CONF_ERR

405

Show mode does not allow configuration. 

EXCEED_MAX_SHOW_ERR

413

Maximum number of consecutive show
commands exceeded. The maximum is 10.

MSG_SIZE_LARGE_ERR

413

Response size too large.   

BACKEND_ERR

500

Backend processing error.    

FILE_OPER_ERR

500

System internal file operation error.  

LIBXML_NS_ERR

500

System internal LIBXML NS error.  

LIBXML_PARSE_ERR

500

System internal LIBXML parse error.  

LIBXML_PATH_CTX_ERR

500

System internal LIBXML path context error. 

MEM_ALLOC_ERR

500

System internal memory allocation error.  

USER_NOT_FOUND_ERR

500

User not found from input or cache.

XML_TO_JSON_CONVERT_ERR

500

XML to JSON conversion error.  

BASH_CMD_NOT_SUPPORTED_ERR

501

Bash command not supported.   

CHUNK_ALLOW_XML_ONLY_ERR

501

Chunking allows only XML output.

JSON_NOT_SUPPORTED_ERR

501

JSON not supported due to large amount of output.

MSG_TYPE_UNSUPPORTED_ERR

501

Message type not supported.   

PIPE_OUTPUT_NOT_SUPPORTED_ERR

501

Pipe operation not supported.   

PIPE_XML_NOT_ALLOWED_IN_INPUT

501

Pipe XML is not allowed in input.

RESP_BIG_JSON_NOT_ALLOWED_ERR

501

Response has large amount of output. JSON not
supported.

STRUCT_NOT_SUPPORTED_ERR

501

Structured output unsupported.    

 

 

※ 참고

http://www.google.co.kr/url?url=http://www.jedelman.com/home/introduction-to-using-cisco-nx-api&rct=j&frm=1&q=&esrc=s&sa=U&ei=R2HhVIi2Ioqa8QXqtYAw&ved=0CDMQFjAF&usg=AFQjCNE6Udq_iqse1vYQpq12BtIIiKVOXA

http://keepingitclassless.net/2014/02/cisco-aci-nexus-9000-nxapi/

http://jeffostermiller.blogspot.kr/2015/01/my-first-python-script.html#!/2015/01/my-first-python-script.html

 

Posted by 네떡지기

티스토리 툴바