在 EC2 部署 Milvus 集群
本文介绍如何使用 Terraform 和 Ansible 在 Amazon EC2 上部署 Milvus 集群。
预置集群
介绍如何使用 Terraform 预置 Milvus 集群。Terraform 是一个基础架构即代码 (IaC) 软件工具。使用 Terraform ,你可以通过使用声明性配置文件来预置基础设施。
先决条件
准备配置
你可以在 Google 云端硬盘 下载模板配置文件。
-
main.tf
这个文件包含了用于预置 Milvus 集群的配置。 -
variables.tf
这个文件允许快速编辑用于设置或更新 Milvus 集群的变量。 -
output.tf
和inventory.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. txt
文件包含的配置。
-
云提供商和区域
下面的模板使用
us-east-2
区域。更多信息请参见可用区域。provider "aws" { profile = "default" region = "us-east-2" }
-
安全组
下面的模板声明了一个安全组,该安全组允许来自 CIDR 地址范围的流量,该地址范围由在
variables.tf
中声明的my_ip
表示。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" } }
-
虚拟私有云
下面的模板在 Milvus 集群中指定里 CIDR 块为10.0.0.0/24的虚拟私有云。
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 块大小相同。
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 集群。
启动集群
本节描述如何使用 Ansible 启动你预置完的 Milvus 集群。Ansible 是一个配置管理工具,用于自动化云配置和配置管理。
先决条件
- 安装和配置 Ansible
准备配置
你可以在 Google 云端硬盘下载模板配置文件。
yaml_files
文件夹中的文件
这个文件夹存储每个节点类型的 Jinja2 文件。Ansible 使用了 Jinja2 模板。有关 Jinja2 的更多信息请参见介绍。
playbook.yaml
该文件在特定的节点集上执行一组任务。该模板首先在 Milvus 集群的所有节点实例上安装 Docker 和 Docker Compose。
- name: All Servers
hosts: etcd_ips_public:pulsar_ips_public:minio_ips_public:data_ips_public:index_ips_public:query_ips_public:proxy_ips_public:root_coordinator_ips_public:data_coordinator_ips_public:query_coordinator_ips_public:index_coordinator_ips_public
remote_user: ec2-user
become: true
tags:
- start
tasks:
- name: Install docker
ansible.builtin.yum:
name: docker
state: present
- name: Run docker
ansible.builtin.service:
name: docker
state: started
- name: Install or upgrade docker-compose
get_url:
url : "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64"
dest: /usr/local/bin/docker-compose
mode: 'a+x'
force: yes
- name: Create symbolic link for docker-compose
file:
src: "/usr/local/bin/docker-compose"
dest: "/usr/bin/docker-compose"
state: link
在所有节点实例上安装 Docker 和 Docker Compose 后,playbook.yaml
按顺序启动所有节点实例的容器。
- name: etcd
hosts: etcd_ips_public
remote_user: ec2-user
become: true
tags:
- start
tasks:
- name: Copy etcd config
ansible.builtin.template:
src: ./yaml_files/etcd.j2
dest: /home/ec2-user/docker-compose.yml
owner: ec2-user
group: wheel
mode: '0644'
- name: Run etcd node
shell: docker-compose up -d
args:
chdir: /home/ec2-user/
应用配置
- 打开终端,导航到存放
playbook.yaml
的文件夹。 - 运行
ansible-playbook -i inventory playbook.yaml --tags "start"
。 - 如果成功,将启动所有节点实例。
现在你已经使用 Ansible 启动了一个 Milvus 集群。
停止节点
当不再需要 Milvus 集群时,可以停止所有节点。
terraform
二进制文件在你的 PATH
上可用。- 运行
terraform destroy
并在提示时输入yes
。 - 如果成功,则停止所有节点实例。
更多内容
如果你想学习如何在其他云上部署 Milvus: