NSO 나노 서비스

1. 나노 서비스

나노 서비스의 필요성

  • 복잡한 서비스를 설계할 때는 여러 측면(매핑 로직, 다양한 서비스 매개변수 최적화 방법 등)을 고려
  • 다른 시스템과의 통합 요구 사항
    • 서비스가 외부시스템과 연동되어야 하는 경우
  • 서비스 인스턴스 생성 시 정보 가용성
    • 서비스 생성 시점에 필요한 모든 정보가 준비되지 않을 수 있는 경우
  • 단계별 구성 또는 제거 요구 사항
    • 최종 서비스 구성이 여러 단계에 걸쳐 이루어지거나 제거도 단계별로 진행되어야 하는 경우
  • 서비스 매핑 코드의 부수 효과(Side effects)
    • 서비스 로직이 의도치 않거나 외부적인 변경을 유발할 수 있는 경우

통합 요구 사항

  • 서비스의 일반적인 요구 사항 중 하나는 다른 시스템과의 통합
  • 트랜잭션 모델에서 서비스 코드는 NSO 시스템의 전반적인 처리량을 유지하기 위해 빠르게 실행
    • 나노 서비스를 사용하면 서비스 처리를 상태 단계로 나누고, 각 상태는 별도의 트랜잭션 내에서 처리됨

서비스 생성 시 사용할 수 없는 정보

  • 나노 서비스는 서비스 인스턴스가 생성될 때 모든 정보를 사용할 수 없는 시나리오에 유용

단계별 구성 또는 제거

  • 일부 시나리오의 경우 최종 서비스 구성의 첫 번째 단계가 다른 구성 작업보다 일찍 이루어져야 됨.
    • 프로비저닝의 첫 번째 단계에서 네트워크 액세스를 구성하고 두 번째 단계에서 액세스 권한을 얻은 후 장치 구성을 수행하는 경우
    • 가상 네트워크 기능(VNF)에 대한 VM을 요청하는 경우
      • 가상 관리자가 VM을 시작하고 관리 인터페이스에 접속할 수 있게 되기 까지 시간이 걸릴 때, 다른 서비스 요청 수행

다단계 서비스 예시

  1. 서비스 사용자는 구성된 IP 주소를 가진 루프백 인터페이스를 원함
  2. 장치가 구성되기 전에 IP prefix가 할당되어야 한다는 전제 조건 필요
  3. 운영자가 루프백 서비스 인스턴스에 대한 IP prefix 할당
  4. 전제 조건이 충족된 후, 루프백 구성이 생성되어 장치로 푸시 가능

2. NSO 트랜잭션 모델

  • NSO는 네트워크 전반의 트랜잭션 방식으로 설정 변경 사항을 적용
    • 서비스 프로비저닝의 어떤 단계에서든 문제가 발생하면, NSO는 설정을 마지막으로 양호한 상태로 되돌린다.
    • 설정이 생성되어 장치로 전송될 때, 이 작업은 트랜잭션 내부에서 발생
    • 관련된 장치 중 하나라도 수신된 설정을 거부하면, NSO는 모든 관련 장치의 설정을 마지막 양호한 상태로 롤백
    • NSO는 confirmed commit 기능을 지원하는 장치뿐 아니라 지원하지 않은 장치에서도 설정을 되돌릴 수 있다.
  • NSO 트랜잭션 모델은 서비스 개발을 간소화 함
    • 모든 구성 요청은 Queue에 저장되어 순차적으로 실행
    • 장점
      • 서비스 개발자가 데이터 무결성이나 잠재적인 경쟁 상태에 대해 걱정할 필요가 없다는 것
    • 단점
      • NSO 시스템 처리량이 낮아 주어진 시간 내에 처리할 수 있는 서비스 요청 수가 줄어든다는 것

모델 작동 방식

  1. 처리 중인 다른 트랜잭션이 있는 경우 새로운 서비스 구성 요청이 수신되어 대기열에 추가되며 트랜잭션 잠금이 획득 됨. 잠금이 해제될 때까지 다른 구성 변경은 허용하지 않음
  2. 서비스에서 장치 모델로의 매핑이 발생
  3. 장치 구성은 NED를 사용해 생성되어 장치에 푸시
  4. 장치가 구성을 수락하거나 트랜잭션을 중단. 관련 장치 중 하나에서 중단이 발생하면 NSO는 해당 장치와 CDB의 변경 사항을 롤백함. 잠금이 해제되고 다른 트랜잭션을 시작할 수 있음.

Python 코드 예제

  • Python 코드 또한 잠금 상태에서 실행되므로 빠르게 실행 되는 것이 중요
  • create_cb()에서 외부 시스템과 통신하거나 복잡하고 오래 실행되는 로직이 포함되어 있으면 아래를 고려
    • 서비스 로직을 여러 단계로 구현하는 나노 서비스(nano service) 사용
    • 장기 실행 작업에 대해 구성을 잠그지 않는 사후 작업(post actions) 사용
    • 구성 잠금 외부에서 호출되는 pre_lock_create_cb() Python 콜백을 사용
  • 코드 샘플
    class MyService(Service):
        @Service.pre_lock_create
        def cb_pre_lock_create(self, tctx, root, service, proplist):
            # 여기에 오래 실행되는 작업을 수행합니다.


출처: https://developer.cisco.com/learning/tracks/get_started_with_nso/nso-service-dev/service-dev-301/introduction-to-nano-services/