• О Милвусе
  • Начать
  • Концепции
  • Руководство пользователя
  • Импорт данных
  • Инструменты искусственного интеллекта
  • Руководство по администрированию
  • Инструменты
  • Интеграции
  • Учебники
  • Вопросы и ответы
  • API Reference

(Утратил силу) Развертывание кластера Milvus на EC2

В этой теме описывается, как развернуть кластер Milvus на Amazon EC2 с помощью Terraform и Ansible.

Эта тема устарела и скоро будет удалена. Вместо нее рекомендуем обратиться к разделу Развертывание кластера Milvus на EKS.

Создание кластера Milvus

В этом разделе описывается, как использовать Terraform для создания кластера Milvus.

Terraform - это программный инструмент "инфраструктура как код" (IaC). С помощью Terraform вы можете создавать инфраструктуру, используя декларативные файлы конфигурации.

Необходимые условия

  • Установите и настройте Terraform

  • Установка и настройка AWS CLI

Подготовьте конфигурацию

Шаблонные файлы конфигурации можно скачать на Google Drive.

  • main.tf

    Этот файл содержит конфигурацию для инициализации кластера Milvus.

  • variables.tf

    Этот файл позволяет быстро редактировать переменные, используемые для настройки или обновления кластера Milvus.

  • output.tf и inventory.tmpl

    В этих файлах хранятся метаданные кластера Milvus. Метаданные, используемые в этой теме, - это public_ip для каждого экземпляра узла, private_ip для каждого экземпляра узла и все идентификаторы экземпляров EC2.

Подготовка переменных.tf

В этом разделе описывается конфигурация, которую содержит файл variables.tf.

  • Количество узлов

    В следующем шаблоне объявлена переменная index_count, используемая для установки количества узлов индекса.

    Значение index_count должно быть больше или равно единице.
    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"
    }
    
  • Группа безопасности

    В следующем шаблоне объявлена группа безопасности, которая разрешает входящий трафик из диапазона адресов CIDR, представленного в my_ip, объявленном в variables.tf.

    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

    Следующий шаблон определяет VPC с блоком CIDR 10.0.0.0/24 на кластере Milvus.

    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-блока подсети равен размеру CIDR-блока VPC.

    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, Ephemeral и Root Block Devices.

    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, когда появится запрос.

Теперь вы создали кластер Milvus с помощью Terraform.

Запуск кластера Milvus

В этом разделе описывается, как с помощью Ansible запустить созданный вами кластер Milvus.

Ansible - это инструмент управления конфигурацией, используемый для автоматизации предоставления облака и управления конфигурацией.

Необходимые условия

Загрузите учебник Ansible Milvus node deployment Playbook

Клонируйте репозиторий Milvus с GitHub, чтобы загрузить учебник Ansible Milvus node deployment Playbook.

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

Настройте файлы установки

Файлы inventory.ini и ansible.cfg используются для управления переменными окружения и методами проверки входа в систему в плейбуке Ansible. В файле inventory.ini секция dockernodes определяет все серверы движков docker. Секция ansible.cfg определяет все серверы координаторов Milvus. В секции node определены все серверы узлов Milvus.

Укажите локальный путь к Playbook и настройте файлы установки.

$ 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-ключ на хостах docker. В противном случае подключение 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

Добавьте в команду -i, чтобы указать путь к файлу инвентаризации, если вы не указали его в ansible.cfg, иначе 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"
}

Проверка синтаксиса плейбука

Проверьте синтаксис Playbook.

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

Обычно терминал выдает следующее сообщение:

playbook: deploy-docker.yml

Установить Docker

Установите Docker с помощью Playbook.

$ 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
  • Для хостов, не являющихся root-хостами:
$ 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.

Убедитесь, что двоичный файл terraform доступен на вашем компьютере PATH.
  1. Запустите terraform destroy и введите yes, когда появится запрос.

  2. В случае успеха все экземпляры узлов будут остановлены.

Что дальше

Если вы хотите узнать, как развернуть Milvus в других облаках:

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?