milvus-logo
LFAI
フロントページへ

(非推奨) EC2にMilvusクラスタをデプロイする

このトピックでは、TerraformとAnsibleを使用してAmazon EC2にMilvusクラスタをデプロイする方法について説明します。

このトピックは古く、すぐに削除される予定です。代わりにEKS上でのMilvusクラスタのデプロイを参照することをお勧めします。

Milvusクラスタのプロビジョニング

このセクションでは、Terraformを使用してMilvusクラスタをプロビジョニングする方法について説明します。

TerraformはInfrastructure as Code (IaC) ソフトウェアツールです。Terraformを利用することで、宣言型の設定ファイルを利用してインフラストラクチャをプロビジョニングすることができます。

前提条件

設定の準備

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}"
      }
    }
    

設定の適用

  1. ターミナルを開き、main.tf を格納するフォルダに移動します。

  2. 構成を初期化するには、terraform init を実行します。

  3. 構成を適用するには、terraform apply を実行し、プロンプトが表示されたらyes を入力します。

これでTerraformによるMilvusクラスタのプロビジョニングが完了しました。

Milvusクラスタの起動

このセクションでは、Ansibleを使用してプロビジョニングしたMilvusクラスタを起動する方法について説明します。

Ansibleはクラウドのプロビジョニングと構成管理を自動化するための構成管理ツールです。

前提条件

Ansible MilvusノードデプロイメントPlaybookをダウンロードする。

GitHubからMilvusリポジトリをクローンし、Ansible MilvusノードデプロイメントPlaybookをダウンロードします。

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

インストールファイルの設定

inventory.iniansible.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クラスタが不要になったら、すべてのノードを停止します。

PATHterraform のバイナリがあることを確認してください。
  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
フィードバック

このページは役に立ちましたか ?