milvus-logo
LFAI
홈페이지

(더 이상 사용되지 않음) EC2에 Milvus 클러스터 배포하기

이 항목에서는 Terraform 및 Ansible을 사용하여 Amazon EC2에 Milvus 클러스터를 배포하는 방법에 대해 설명합니다.

이 항목은 오래되었으며 곧 삭제될 예정입니다. 대신 EKS에 Milvus 클러스터 배포를 참조하시기 바랍니다.

Milvus 클러스터 프로비저닝

이 섹션에서는 Terraform을 사용하여 Milvus 클러스터를 프로비저닝하는 방법을 설명합니다.

Terraform은 코드형 인프라(IaC) 소프트웨어 도구입니다. Terraform을 사용하면 선언적 구성 파일을 사용하여 인프라를 프로비저닝할 수 있습니다.

전제 조건

구성 준비

Google 드라이브에서 템플릿 구성 파일을 다운로드할 수 있습니다.

  • main.tf

    이 파일에는 Milvus 클러스터를 프로비저닝하기 위한 구성이 포함되어 있습니다.

  • variables.tf

    이 파일을 통해 Milvus 클러스터를 설정하거나 업데이트하는 데 사용되는 변수를 빠르게 편집할 수 있습니다.

  • output.tfinventory.tmpl

    이 파일에는 Milvus 클러스터의 메타데이터가 저장됩니다. 이 항목에서 사용되는 메타데이터는 각 노드 인스턴스에 대한 public_ip, 각 노드 인스턴스에 대한 private_ip 및 모든 EC2 인스턴스 ID입니다.

variables.tf 준비

이 섹션에서는 variables.tf 파일에 포함된 구성에 대해 설명합니다.

  • 노드 수

    다음 템플릿은 인덱스 노드 수를 설정하는 데 사용되는 index_count 변수를 선언합니다.

    index_count 값은 1보다 크거나 같아야 합니다.
    variable "index_count" {
      description = "Amount of index instances to run"
      type        = number
      default     = 5
    }
    
  • 노드 유형에 대한 인스턴스 유형

    다음 템플릿은 인덱스 노드의 인스턴스 유형을 설정하는 데 사용되는 index_ec2_type 변수를 선언합니다.

    variable "index_ec2_type" {
      description = "Which server type"
      type        = string
      default     = "c5.2xlarge"
    }
    
  • 액세스 권한

    다음 템플릿은 key_name 변수와 my_ip 변수를 선언합니다. key_name 변수는 AWS 액세스 키를 나타냅니다. my_ip 변수는 보안 그룹의 IP 주소 범위를 나타냅니다.

    variable "key_name" {
      description = "Which aws key to use for access into instances, needs to be uploaded already"
      type        = string
      default     = ""
    }
    
    variable "my_ip" {
      description = "my_ip for security group. used so that ansible and terraform can ssh in"
      type        = string
      default     = "x.x.x.x/32"
    }
    

main.tf 준비

이 섹션에서는 main.tf 파일에 포함된 구성에 대해 설명합니다.

  • 클라우드 공급자 및 리전

    다음 템플릿은 us-east-2 리전을 사용합니다. 자세한 내용은 사용 가능한 리전을 참조하세요.

    provider "aws" {
      profile = "default"
      region  = "us-east-2"
    }
    
  • 보안 그룹

    다음 템플릿은 variables.tf 에 선언된 my_ip 로 표시되는 CIDR 주소 범위에서 들어오는 트래픽을 허용하는 보안 그룹을 선언합니다.

    resource "aws_security_group" "cluster_sg" {
      name        = "cluster_sg"
      description = "Allows only me to access"
      vpc_id      = aws_vpc.cluster_vpc.id
    
      ingress {
        description      = "All ports from my IP"
        from_port        = 0
        to_port          = 65535
        protocol         = "tcp"
        cidr_blocks      = [var.my_ip]
      }
    
      ingress {
        description      = "Full subnet communication"
        from_port        = 0
        to_port          = 65535
        protocol         = "all"
        self             = true
      }
    
      egress {
        from_port        = 0
        to_port          = 0
        protocol         = "-1"
        cidr_blocks      = ["0.0.0.0/0"]
        ipv6_cidr_blocks = ["::/0"]
      }
    
      tags = {
        Name = "cluster_sg"
      }
    }
    
  • VPC

    다음 템플릿은 Milvus 클러스터에서 10.0.0.0/24 CIDR 블록이 있는 VPC를 지정합니다.

    resource "aws_vpc" "cluster_vpc" {
      cidr_block = "10.0.0.0/24"
      tags = {
        Name = "cluster_vpc"
      }
    }
    
    resource "aws_internet_gateway" "cluster_gateway" {
      vpc_id = aws_vpc.cluster_vpc.id
    
      tags = {
        Name = "cluster_gateway"
      }
    }
    
  • 서브넷(선택 사항)

    다음 템플릿은 트래픽이 인터넷 게이트웨이로 라우팅되는 서브넷을 선언합니다. 이 경우 서브넷의 CIDR 블록 크기는 VPC의 CIDR 블록과 동일합니다.

    resource "aws_subnet" "cluster_subnet" {
      vpc_id                  = aws_vpc.cluster_vpc.id
      cidr_block              = "10.0.0.0/24"
      map_public_ip_on_launch = true
    
      tags = {
        Name = "cluster_subnet"
      }
    }
    
    resource "aws_route_table" "cluster_subnet_gateway_route" {
      vpc_id       = aws_vpc.cluster_vpc.id
    
      route {
        cidr_block = "0.0.0.0/0"
        gateway_id = aws_internet_gateway.cluster_gateway.id
      }
    
      tags = {
        Name = "cluster_subnet_gateway_route"
      }
    }
    
    resource "aws_route_table_association" "cluster_subnet_add_gateway" {
      subnet_id      = aws_subnet.cluster_subnet.id
      route_table_id = aws_route_table.cluster_subnet_gateway_route.id
    }
    
    
  • 노드 인스턴스(노드)

    다음 템플릿은 MinIO 노드 인스턴스를 선언합니다. main.tf 템플릿 파일은 11개 노드 유형의 노드를 선언합니다. 일부 노드 유형의 경우 root_block_device 을 설정해야 합니다. 자세한 내용은 EBS, 임시 및 루트 블록 디바이스를 참조하세요.

    resource "aws_instance" "minio_node" {
      count         = var.minio_count
      ami           = "ami-0d8d212151031f51c"
      instance_type = var.minio_ec2_type
      key_name      = var.key_name
      subnet_id     = aws_subnet.cluster_subnet.id 
      vpc_security_group_ids = [aws_security_group.cluster_sg.id]
    
      root_block_device {
        volume_type = "gp2"
        volume_size = 1000
      }
      
      tags = {
        Name = "minio-${count.index + 1}"
      }
    }
    

구성 적용하기

  1. 터미널을 열고 main.tf 파일이 저장된 폴더로 이동합니다.

  2. 구성을 초기화하려면 terraform init 을 실행합니다.

  3. 구성을 적용하려면 terraform apply 을 실행하고 메시지가 표시되면 yes 을 입력합니다.

이제 Terraform으로 Milvus 클러스터를 프로비저닝했습니다.

Milvus 클러스터 시작

이 섹션에서는 프로비저닝한 Milvus 클러스터를 시작하기 위해 Ansible을 사용하는 방법을 설명합니다.

Ansible은 클라우드 프로비저닝 및 구성 관리를 자동화하는 데 사용되는 구성 관리 도구입니다.

전제 조건

Ansible Milvus 노드 배포 플레이북 다운로드

GitHub에서 Milvus 리포지토리를 복제하여 Ansible Milvus 노드 배포 플레이북을 다운로드합니다.

git clone https://github.com/milvus-io/milvus.git

설치 파일 구성

inventory.iniansible.cfg 파일은 Ansible 플레이북에서 환경 변수 및 로그인 확인 방법을 제어하는 데 사용됩니다. inventory.ini 파일에서 dockernodes 섹션은 도커 엔진의 모든 서버를 정의합니다. ansible.cfg 섹션은 Milvus 코디네이터의 모든 서버를 정의합니다. node 섹션은 Milvus 노드의 모든 서버를 정의합니다.

플레이북의 로컬 경로를 입력하고 설치 파일을 구성합니다.

$ cd ./milvus/deployments/docker/cluster-distributed-deployment

inventory.ini

inventory.ini 을 구성하여 Milvus 시스템에서 역할에 따라 호스트를 그룹으로 나눕니다.

호스트 이름을 추가하고 docker 그룹 및 vars 을 정의합니다.

[dockernodes] #Add docker host names.
dockernode01
dockernode02
dockernode03

[admin] #Add Ansible controller name.
ansible-controller

[coords] #Add the host names of Milvus coordinators.
; Take note the IP of this host VM, and replace 10.170.0.17 with it.
dockernode01

[nodes] #Add the host names of Milvus nodes.
dockernode02

[dependencies] #Add the host names of Milvus dependencies.
; dependencies node will host etcd, minio, pulsar, these 3 roles are the foundation of Milvus. 
; Take note the IP of this host VM, and replace 10.170.0.19 with it.
dockernode03

[docker:children]
dockernodes
coords
nodes
dependencies

[docker:vars]
ansible_python_interpreter= /usr/bin/python3
StrictHostKeyChecking= no

; Setup variables to control what type of network to use when creating containers.
dependencies_network= host
nodes_network= host

; Setup varibale to control what version of Milvus image to use.
image= milvusdb/milvus-dev:master-20220412-4781db8a

; Setup static IP addresses of the docker hosts as variable for container environment variable config.
; Before running the playbook, below 4 IP addresses need to be replaced with the IP of your host VM
; on which the etcd, minio, pulsar, coordinators will be hosted.
etcd_ip= 10.170.0.19
minio_ip= 10.170.0.19
pulsar_ip= 10.170.0.19
coords_ip= 10.170.0.17

; Setup container environment which later will be used in container creation.
ETCD_ENDPOINTS= {{etcd_ip}}:2379 
MINIO_ADDRESS= {{minio_ip}}:9000
PULSAR_ADDRESS= pulsar://{{pulsar_ip}}:6650
QUERY_COORD_ADDRESS= {{coords_ip}}:19531
DATA_COORD_ADDRESS= {{coords_ip}}:13333
ROOT_COORD_ADDRESS= {{coords_ip}}:53100
INDEX_COORD_ADDRESS= {{coords_ip}}:31000

ansible.cfg

ansible.cfg 는 플레이북의 동작을 제어합니다(예: SSH 키 등). 도커 호스트에서 SSH 키를 통해 패스프레이즈를 설정하지 마세요. 그렇지 않으면 Ansible SSH 연결이 실패합니다. 세 호스트에서 동일한 사용자 이름과 SSH 키를 설정하고 새 사용자 계정이 비밀번호 없이 sudo를 실행하도록 설정하는 것이 좋습니다. 그렇지 않으면 사용자 이름이 비밀번호와 일치하지 않거나 상승된 권한이 부여되지 않았다는 오류가 발생하여 Ansible 플레이북을 실행할 때 오류가 발생합니다.

[defaults]
host_key_checking = False
inventory = inventory.ini # Specify the Inventory file
private_key_file=~/.my_ssh_keys/gpc_sshkey # Specify the SSH key that Ansible uses to access Docker host

deploy-docker.yml

deploy-docker.yml 는 Docker 설치 중 작업을 정의합니다. 자세한 내용은 파일의 코드 주석을 참조하세요.

---
- name: setup pre-requisites # Install prerequisite
  hosts: all
  become: yes
  become_user: root
  roles:
    - install-modules
    - configure-hosts-file

- name: install docker
  become: yes
  become_user: root
  hosts: dockernodes
  roles:
    - docker-installation

Ansible 연결 테스트

Ansible에 대한 연결을 테스트합니다.

$ ansible all -m ping

ansible.cfg 에서 지정하지 않은 경우 명령에 -i 을 추가하여 인벤토리 파일의 경로를 지정하고, 그렇지 않으면 Ansible에서 /etc/ansible/hosts 을 사용합니다.

터미널은 다음과 같이 반환합니다:

dockernode01 | SUCCESS => {
"changed": false,
"ping": "pong"
}
ansible-controller | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
dockernode03 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
dockernode02 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

플레이북 구문 확인

플레이북의 구문을 확인합니다.

$ ansible-playbook deploy-docker.yml --syntax-check

일반적으로 터미널은 다음과 같이 반환됩니다:

playbook: deploy-docker.yml

Docker 설치

플레이북으로 Docker를 설치합니다.

$ ansible-playbook deploy-docker.yml

세 호스트에 Docker가 성공적으로 설치되면 터미널은 다음과 같이 반환합니다:

TASK [docker-installation : Install Docker-CE] *******************************************************************
ok: [dockernode01]
ok: [dockernode03]
ok: [dockernode02]

TASK [docker-installation : Install python3-docker] **************************************************************
ok: [dockernode01]
ok: [dockernode02]
ok: [dockernode03]

TASK [docker-installation : Install docker-compose python3 library] **********************************************
changed: [dockernode01]
changed: [dockernode03]
changed: [dockernode02]

PLAY RECAP *******************************************************************************************************
ansible-controller         : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
dockernode01               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
dockernode02               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
dockernode03               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

설치 확인

SSH 키를 사용하여 세 호스트에 로그인하고 호스트에서 설치를 확인합니다.

  • 루트 호스트의 경우:
$ docker -v
  • 루트 호스트가 아닌 호스트의 경우:
$ sudo docker -v

일반적으로 터미널은 다음과 같이 반환합니다:

Docker version 20.10.14, build a224086

컨테이너의 실행 상태를 확인합니다.

$ docker ps

구문 확인

deploy-milvus.yml 의 구문을 확인합니다.

$ ansible-playbook deploy-milvus.yml --syntax-check

일반적으로 터미널은 다음과 같이 반환합니다:

playbook: deploy-milvus.yml

Milvus 컨테이너 생성

Milvus 컨테이너 생성 작업은 deploy-milvus.yml 에 정의되어 있습니다.

$ ansible-playbook deploy-milvus.yml

터미널이 반환됩니다:

PLAY [Create milvus-etcd, minio, pulsar] *****************************************************************

TASK [Gathering Facts] ********************************************************************************************
ok: [dockernode03]

TASK [etcd] *******************************************************************************************************
changed: [dockernode03]

TASK [pulsar] *****************************************************************************************************
changed: [dockernode03]

TASK [minio] ******************************************************************************************************
changed: [dockernode03]

PLAY [Create milvus nodes] ****************************************************************************************

TASK [Gathering Facts] ********************************************************************************************
ok: [dockernode02]

TASK [querynode] **************************************************************************************************
changed: [dockernode02]

TASK [datanode] ***************************************************************************************************
changed: [dockernode02]

TASK [indexnode] **************************************************************************************************
changed: [dockernode02]

PLAY [Create milvus coords] ***************************************************************************************

TASK [Gathering Facts] ********************************************************************************************
ok: [dockernode01]

TASK [rootcoord] **************************************************************************************************
changed: [dockernode01]

TASK [datacoord] **************************************************************************************************
changed: [dockernode01]

TASK [querycoord] *************************************************************************************************
changed: [dockernode01]

TASK [indexcoord] *************************************************************************************************
changed: [dockernode01]

TASK [proxy] ******************************************************************************************************
changed: [dockernode01]

PLAY RECAP ********************************************************************************************************
dockernode01               : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
dockernode02               : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
dockernode03               : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

이제 세 개의 호스트에 Milvus가 배포되었습니다.

노드 중지

Milvus 클러스터가 더 이상 필요하지 않은 경우 모든 노드를 중지할 수 있습니다.

PATH 에서 terraform 바이너리를 사용할 수 있는지 확인합니다.
  1. terraform destroy 을 실행하고 메시지가 표시되면 yes 을 입력합니다.

  2. 성공하면 모든 노드 인스턴스가 중지됩니다.

다음 단계

다른 클라우드에 Milvus를 배포하는 방법을 배우려면 다음과 같이 하세요:

번역DeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?