설치 프로세스를 시작하기 전에 Salt가 무엇이며 어떻게 작동하는지 이해하는 것이 대부분의 사용자에게 유용합니다. Salt는 Salt 마스터가 클라이언트에 명령을 내리고 클라이언트는 명령을 실행하는 마스터-클라이언트 모델을 사용합니다.

참고: 문제가 되는 용어를 제거하려는 VMware 이니셔티브의 일환으로 Salt 마스터라는 용어는 SaltStack Config 및 관련 제품과 문서에서 더 나은 용어로 대체될 예정입니다. 용어 업데이트가 완전히 완료되기까지 몇 번의 릴리스 주기를 거칠 수 있습니다.

Salt란?

SaltStack Config는 Python 기반 오픈 소스 원격 실행 프레임워크인 Salt로 구동되며 다음과 같은 용도에 사용됩니다.

  • 구성 관리
  • 자동화
  • 프로비저닝
  • 오케스트레이션

Salt는 SaltStack Config 핵심 기능의 기반이 되는 기술입니다. SaltStack Config는 사용 편의성을 높이는 기능 및 추가 기능을 제공하여 Salt를 향상시키고 확장합니다. SaltStack Config 인프라에 대한 요약은 SaltStack Config 시스템 아키텍처를 참조하십시오.

다음 다이어그램은 기본적인 Salt 아키텍처의 기본 구성 요소를 보여줍니다.


Salt 아키텍처

다음 섹션에서는 SaltStack Config 설치와 관련된 Salt 아키텍처의 핵심 구성 요소 중 일부를 설명합니다.

Salt 마스터 및 Salt 미니언

Salt는 Salt 마스터가 클라이언트에 명령을 내리고 클라이언트는 명령을 실행하는 마스터-클라이언트 모델을 사용합니다. Salt 에코시스템에서 Salt 마스터는 Salt 마스터 서비스를 실행하는 서버입니다. 미니언 서비스를 실행하고 특정 Salt 마스터에 등록된 노드인 하나 이상의 Salt 미니언에 명령을 내립니다.

Salt를 설명하는 다른 방식은 게시자-구독자 모델입니다. Salt 마스터는 실행해야 하는 작업을 게시하고 미니언은 이 작업을 구독합니다. 특정 작업이 이 미니언에 적용되면 해당 작업이 실행됩니다.

미니언이 작업 실행을 마치면 작업 반환 데이터를 다시 Salt 마스터에 보냅니다. Salt에는 미니언이 Salt 마스터와 통신하는 데 기본적으로 사용되는 두 개의 포트가 있습니다. 이러한 포트는 함께 작동하여 데이터를 수신하고 메시지 버스로 전달합니다. Salt의 메시지 버스는 ZeroMQ이며, 가능한 가장 빠른 통신을 제공하기 위해 비동기 네트워크 토폴로지를 생성합니다.

대상 및 입자

Salt 마스터는 대상을 정의하여 작업을 실행해야 하는 미니언을 나타냅니다. 대상은 작업의 Salt 명령이 적용되는 미니언 그룹(하나 또는 여러 Salt 마스터에 걸쳐 있음)입니다.

참고:

Salt 마스터는 미니언처럼 관리될 수 있으며 미니언 서비스를 실행하는 경우 대상이 될 수도 있습니다.

다음은 Salt 마스터가 미니언에 내릴 수 있는 여러 종류의 명령 중 하나의 예입니다. 이 명령은 모든 미니언이 Vim 애플리케이션을 설치해야 한다고 나타냅니다.

salt -v '*' pkg.install vim

이 경우 glob '*'는 대상이며 모든 미니언이 이 명령을 실행해야 한다는 의미입니다. 대상을 지정하는 옵션은 이 외에도 다양합니다. 여기에는 ID를 사용하여 특정 미니언을 대상으로 지정하거나 공유 특성 또는 특징(Salt의 입자라고 함)을 통해 미니언을 대상으로 지정하는 방법이 있습니다.

Salt는 기본 시스템에 대한 정보를 파생하는 인터페이스와 함께 제공됩니다. 이것을 입자 인터페이스라고 합니다. Salt에 정보의 입자를 제공하기 때문입니다. 입자는 운영 체제, 도메인 이름, IP 주소, 커널, OS 유형, 메모리 및 기타 여러 시스템 속성에 대해 수집됩니다. 사용자 지정 입자 데이터를 직접 생성할 수도 있습니다.

입자 데이터는 상대적으로 정적입니다. 하지만 시스템 정보(예: 네트워크 설정)가 변경되거나 사용자 지정 입자에 새 값이 할당되면 입자 데이터가 새로 고쳐집니다.

오픈 이벤트 시스템(이벤트 버스)

이벤트 시스템은 Salt 마스터와 미니언 사이의 프로세스 간 통신에 사용됩니다. 이벤트 시스템에서:

  • 이벤트는 Salt 마스터와 미니언 모두에게 표시됩니다.
  • 둘 다 이벤트를 모니터링하고 평가할 수 있습니다.

이벤트 버스는 오케스트레이션 및 실시간 모니터링의 기반이 됩니다.

모든 미니언은 이벤트 시스템에 게시된 이벤트를 구독하여 작업과 결과를 볼 수 있습니다. Salt는 다음 두 계층이 있는 플러그형 이벤트 시스템을 사용합니다.

  • ZeroMQ(0MQ) - 유연한 전송 계층을 제공하는 현재 기본 소켓 수준 라이브러리입니다.
  • 토네이도 - 전체 TCP 기반 전송 계층 이벤트 시스템입니다.

Salt의 가장 큰 장점 중 하나는 실행 속도입니다. 이벤트 시스템의 통신 버스는 높은 수준의 웹 서비스(http)를 실행하는 것보다 더 효율적입니다. 원격 실행 시스템은 모든 구성 요소의 기반이 되는 구성 요소이며, 분산된 원격 실행이 리소스 전체에 로드를 분산할 수 있도록 합니다.

Salt 상태

원격 실행 외에도 Salt는 미니언을 구성하는 또 다른 방법을 제공하는 데, 이 방법은 미니언이 어떤 상태여야 하는지 선언하는 방식으로, Salt 상태라고도 합니다. Salt 상태를 통해 구성 관리가 가능합니다. Salt 상태를 사용하면 간단한 YAML 파일로 인프라를 배포하고 관리할 수 있습니다. 상태를 사용하면 사용자 입력 없이 구현할 Salt 작업을 대기열에 추가하여 반복적이고 예측 가능한 작업을 자동화할 수 있습니다. Jinja를 사용하여 상태 파일에 더 복잡한 조건부 논리를 추가할 수도 있습니다.

원격 실행과 구성 관리 사이의 미묘한 차이점을 설명하기 위해 Salt가 모든 미니언에 애플리케이션 Vim을 설치한 대상 및 입자에 대해 이전 섹션에서 참조한 명령을 살펴보겠습니다.

방법론

구현

결과

원격 실행

  • 터미널에서 salt-v'*'pkg.installvim 실행
  • 대상 미니언에 원격으로 Vim 설치

구성 관리

  • Vim 설치 여부를 확인하는 YAML 상태 파일 작성
  • 이 상태 파일은 대상 미니언에 적용됩니다.
  • Vim이 대상 미니언에 항상 설치되도록 보장
  • Salt는 상태 파일을 분석하고 미니언이 상태 선언을 준수하도록 하기 위해 수행해야 하는 작업을 결정합니다.
  • Vim이 설치되지 않은 경우 Vim을 대상 미니언에 설치하는 프로세스를 자동화합니다.

Vim이 설치되었는지 확인하는 상태 파일은 다음 예시와 유사합니다.

# File:/srv/salt/vim_install.sls
install_vim_now:
  pkg.installed:
     -pkgs:
         -vim

이 상태를 미니언에 적용하려면 다음 예와 같이 state.apply 모듈을 사용합니다.

salt '*' state.apply vim_install

이 명령은 모든 미니언에 vim_install 상태를 적용합니다.

공식은 미니언 또는 애플리케이션을 구성하기 위해 함께 작동하는 상태의 모음입니다. 예를 들어 한 상태가 다른 상태를 트리거할 수 있습니다.

top 파일

매번 특정 미니언을 대상으로 각 상태를 수동으로 실행하는 것은 실용적이지 않습니다. 일부 환경에는 수천 개의 미니언을 대상으로 하는 수백 개의 상태 파일이 있습니다.

Salt에는 이러한 스케일링 문제에 유용한 두 가지 기능이 제공됩니다.

  • top.sls 파일 - Salt 상태를 해당되는 미니언에 매핑합니다.
  • highstate 실행 - 한 번의 실행으로 top.sls에 설명된 모든 Salt 상태를 실행합니다.

top 파일은 특정 환경에서 서로 다른 미니언에 적용해야 하는 상태를 매핑합니다. 다음은 간단한 top 파일의 예입니다.

# File: /srv/salt/top.sls
base:
  '*':
    - all_server_setup
  
  '01webserver':
    - web_server_setup

이 예에서 base는 기본값인 Salt 환경을 말합니다. 필요에 따라 둘 이상의 환경(예: 운영, 개발, QA 등)을 지정할 수 있습니다.

미니언 그룹은 환경 아래에 지정되며 각 미니언 세트에 대한 상태가 나열됩니다. 이 top 파일은 all_server_setup이라는 상태가 모든 미니언 '*'에 적용되어야 하며, web_server_setup이라는 상태가 01webserver 미니언에 적용되어야 한다는 것을 나타냅니다.

Salt 명령을 실행하려면 state.highstate 함수를 사용합니다.

salt \* state.highstate

이 명령은 top 파일을 대상 미니언에 적용합니다.

Salt pillar

Salt의 pillar 기능은 Salt 마스터에 정의된 데이터를 가져다가 필요한 따라 미니언에 배포합니다. pillar는 주로 비밀 또는 기타 중요 데이터(예: 계정 자격 증명, 암호화 키 또는 암호)를 저장하는 데 사용됩니다. pillar는 상태 파일에 직접 배치하지 않으려는 비밀이 아닌 데이터(예: 구성 데이터)를 저장하는 데에도 유용합니다.

Salt pillar는 입자와 반대 방향에서 데이터를 클러스터로 가져옵니다. 입자는 미니언에서 생성된 데이터이지만, pillar는 Salt 마스터에서 생성된 데이터입니다.

pillar는 pillar 상태 트리의 상태와 유사하게 구성되며, 여기서 top.sls는 pillar 데이터를 데이터에 접근할 수 있는 미니언 및 환경에 맞게 조정하는 역할을 합니다. pillar를 사용하여 전송된 정보에는 대상 미니언에 대해 생성되고 안전한 데이터 전송을 위해 이 미니언의 키로 암호화된 사전이 있습니다. pillar 데이터는 미니언 단위로 암호화되기 때문에 특정 미니언과 관련된 중요 데이터를 저장하는 데 유용합니다.

비콘 및 리액터

비콘 시스템은 미니언의 다양한 시스템 프로세스를 수신 대기할 수 있는 모니터링 도구입니다. 비콘은 리액터를 트리거하여 변경을 구현하거나 문제를 해결하는 데 도움을 줄 수 있습니다. 예를 들어 서비스의 응답 시간이 초과되면 리액터 시스템이 서비스를 다시 시작할 수 있습니다.

비콘은 다음을 비롯한 다양한 용도로 사용됩니다.

  • 자동화된 보고
  • 오류 로그 전달
  • 마이크로 서비스 모니터링
  • 사용자 셸 작업
  • 리소스 모니터링

하트비트와 결합하면 비콘은 인프라 및 애플리케이션 문제에 대해 미리 작성된 자동 응답을 생성할 수 있습니다. 리액터는 미리 작성된 업데이트 적용 상태를 사용하여 자동 응답으로 Salt를 확장합니다.

리액터는 다양한 시나리오에 적용할 수 있습니다.

  • 인프라 스케일링
  • 관리자에게 알리기
  • 실패한 애플리케이션 다시 시작
  • 자동 롤백

비콘과 리액터를 함께 사용하면 특정 요구에 맞게 사용자 지정된 고유한 상태를 생성할 수 있습니다.

Salt 러너 및 오케스트레이션

Salt 러너는 salt-run 명령으로 실행되는 편리한 애플리케이션입니다. Salt 러너는 Salt 실행 모듈과 유사하게 작동됩니다. 단, 미니언이 아닌 Salt 마스터에서 실행됩니다. Salt 러너는 간단한 클라이언트 호출 또는 복잡한 애플리케이션일 수 있습니다.

Salt는 엔터프라이즈 전체에서 시스템 관리 작업을 오케스트레이션할 수 있는 기능을 제공합니다. 오케스트레이션을 통해 중앙에서 여러 시스템의 활동을 조정할 수 있습니다. 특정 구성 이벤트가 발생하는 순서를 제어할 수 있다는 추가 이점이 있습니다. 오케스트레이션 상태는 상태 러너 모듈을 사용하여 Salt 마스터에서 실행됩니다.

다중 노드 설치를 실행하는 경우 실제로 오케스트레이션을 실행하여 SaltStack Config를 설치합니다. 다중 노드 설치 시나리오에서는 VMware에서 설계한 오케스트레이션 highstate를 실행합니다. highstate는 Salt 마스터에서 실행되며 다중 노드 환경을 설정합니다. PostgreSQL, Redis 및 RaaS를 호스팅할 세 개의 다른 노드에 핵심 SaltStack Config 아키텍처를 설치합니다.