(非推奨) EC2にMilvusクラスタをデプロイする
このトピックでは、TerraformとAnsibleを使用してAmazon EC2にMilvusクラスタをデプロイする方法について説明します。
このトピックは古く、すぐに削除される予定です。代わりにEKS上でのMilvusクラスタのデプロイを参照することをお勧めします。
Milvusクラスタのプロビジョニング
このセクションでは、Terraformを使用してMilvusクラスタをプロビジョニングする方法について説明します。
TerraformはInfrastructure as Code (IaC) ソフトウェアツールです。Terraformを利用することで、宣言型の設定ファイルを利用してインフラストラクチャをプロビジョニングすることができます。
前提条件
Terraformのインストールと設定
AWS CLIのインストールと設定
設定の準備
Google Driveでテンプレート設定ファイルをダウンロードできます。
main.tf
このファイルにはMilvusクラスタをプロビジョニングするための設定が含まれています。
variables.tf
このファイルにより、Milvusクラスタの設定や更新に使用する変数を素早く編集することができます。
output.tf
およびinventory.tmpl
これらのファイルにはMilvusクラスタのメタデータが格納されています。このトピックで使用されるメタデータは、各ノードインスタンスの
public_ip
、各ノードインスタンスのprivate_ip
、すべてのEC2インスタンスIDです。
変数.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}" } }
設定の適用
ターミナルを開き、
main.tf
を格納するフォルダに移動します。構成を初期化するには、
terraform init
を実行します。構成を適用するには、
terraform apply
を実行し、プロンプトが表示されたらyes
を入力します。
これでTerraformによるMilvusクラスタのプロビジョニングが完了しました。
Milvusクラスタの起動
このセクションでは、Ansibleを使用してプロビジョニングしたMilvusクラスタを起動する方法について説明します。
Ansibleはクラウドのプロビジョニングと構成管理を自動化するための構成管理ツールです。
前提条件
- Ansible Controllerがインストールされている。
Ansible MilvusノードデプロイメントPlaybookをダウンロードする。
GitHubからMilvusリポジトリをクローンし、Ansible MilvusノードデプロイメントPlaybookをダウンロードします。
git clone https://github.com/milvus-io/milvus.git
インストールファイルの設定
inventory.ini
とansible.cfg
ファイルは、Ansible playbook の環境変数とログイン確認方法を制御するために使用します。inventory.ini
ファイルでは、dockernodes
セクションで docker エンジンの全サーバを定義する。ansible.cfg
セクションは、Milvus コーディネータの全サーバを定義します。node
セクションには、Milvus ノードのすべてのサーバを定義します。
Playbookのローカルパスを入力し、インストールファイルを設定します。
$ cd ./milvus/deployments/docker/cluster-distributed-deployment
inventory.ini
ホストをMilvusシステム内の役割に従ってグループに分割するためにinventory.ini
を設定します。
ホスト名を追加し、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キーなど、playbookのアクションを制御します。docker ホストでは SSH 鍵経由でパスフレーズを設定しないでください。さもないと、Ansible の SSH 接続に失敗します。3つのホストで同じユーザー名とSSHキーを設定し、新しいユーザーアカウントはパスワードなしでsudoを実行するように設定することをお勧めします。そうしないと、Ansible playbookの実行時に、ユーザー名がパスワードと一致しない、または昇格権限が付与されていないというエラーが発生します。
[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
/etc/ansible/hosts
でインベントリファイルのパスを指定していない場合は、 をコマンドに追加し、インベントリファイルのパスを指定します。-i
ターミナルは以下のように返される:
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の構文の確認
Playbookの構文をチェックします。
$ ansible-playbook deploy-docker.yml --syntax-check
通常、ターミナルは次のように返します:
playbook: deploy-docker.yml
Dockerのインストール
Playbookを使ってDockerをインストールする。
$ ansible-playbook deploy-docker.yml
Dockerが3つのホストに正常にインストールされると、以下のように表示される:
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キーで3つのホストにログインし、ホストへのインストールを確認します。
- rootホストの場合:
$ 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
これで3つのホストにMilvusがデプロイされた。
ノードの停止
Milvusクラスタが不要になったら、すべてのノードを停止します。
PATH
にterraform
のバイナリがあることを確認してください。 terraform destroy
を実行し、プロンプトが表示されたらyes
を入力します。成功すると、すべてのノードインスタンスが停止します。
次のステップ
他のクラウドにMilvusをデプロイする方法を学びたい場合は、次の手順に進んでください: