(Утратил силу) Развертывание кластера Milvus на EC2
В этой теме описывается, как развернуть кластер Milvus на Amazon EC2 с помощью Terraform и Ansible.
Эта тема устарела и скоро будет удалена. Вместо нее рекомендуем обратиться к разделу Развертывание кластера Milvus на EKS.
Создание кластера Milvus
В этом разделе описывается, как использовать Terraform для создания кластера Milvus.
Terraform - это программный инструмент "инфраструктура как код" (IaC). С помощью Terraform вы можете создавать инфраструктуру, используя декларативные файлы конфигурации.
Необходимые условия
Подготовьте конфигурацию
Шаблонные файлы конфигурации можно скачать на 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}" } }
Применение конфигурации
Откройте терминал и перейдите в папку, в которой хранится
main.tf.Чтобы инициализировать конфигурацию, выполните команду
terraform init.Чтобы применить конфигурацию, запустите
terraform applyи введитеyes, когда появится запрос.
Теперь вы создали кластер Milvus с помощью Terraform.
Запуск кластера Milvus
В этом разделе описывается, как с помощью Ansible запустить созданный вами кластер Milvus.
Ansible - это инструмент управления конфигурацией, используемый для автоматизации предоставления облака и управления конфигурацией.
Необходимые условия
- УстановленAnsible Controller.
Загрузите учебник 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. Запустите
terraform destroyи введитеyes, когда появится запрос.В случае успеха все экземпляры узлов будут остановлены.
Что дальше
Если вы хотите узнать, как развернуть Milvus в других облаках: