安装开发环境

本指南提供逐步的安装说明,与 s2aio.sh 脚本执行的操作等效。目的是让读者更熟悉在 Swift 之上安装 Storlets 所涉及的内容。

以下步骤必须使用无密码 sudoer 用户执行。

使用 devstack 安装 Swift 和 Keystone

克隆 devstack

git clone https://opendev.org/openstack/devstack.git

在 devstack 仓库的根目录下创建一个 localrc 文件

ENABLED_SERVICES=key,swift,mysql
HOST_IP=127.0.0.1
ADMIN_PASSWORD=admin
MYSQL_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD

OS_IDENTITY_API_VERSION=3
OS_AUTH_URL="http://$KEYSTONE_IP/identity/v3"
OS_USERNAME=$ADMIN_USER
OS_USER_DOMAIN_ID=default
OS_PASSWORD=$ADMIN_PASSWORD
OS_PROJECT_NAME=$ADMIN_USER
OS_PROJECT_DOMAIN_ID=default
OS_REGION_NAME=RegionOne

SERVICE_HOST=$SWIFT_IP
SWIFT_SERVICE_PROTOCOL=${SWIFT_SERVICE_PROTOCOL:-http}
SWIFT_DEFAULT_BIND_PORT=${SWIFT_DEFAULT_BIND_PORT:-8080}
# service local host is used for ring building
SWIFT_SERVICE_LOCAL_HOST=$HOST_IP
# service listen address for prox
SWIFT_SERVICE_LISTEN_ADDRESS=$HOST_IP
SWIFT_LOOPBACK_DISK_SIZE=20G
SWIFT_MAX_FILE_SIZE=5368709122
SWIFT_HASH=1234567890
IDENTITY_API_VERSION=3

运行 stack.sh 脚本。在继续之前,我们需要停止由 stack.sh 脚本执行的 swift 实例。从同一目录执行

source functions
source lib/swift
stop_swift

最后,将 swift 设备添加到 fstab

sudo sh -c 'echo "/opt/stack/data/swift/drives/images/swift.img /opt/stack/data/swift/drives/sdb1 xfs loop" >> /etc/fstab'

在 Keystone 中配置用户和项目

我们使用 openstack cli 配置 storlets 功能测试使用的用户和项目。我们首先定义一些环境变量

export OS_IDENTITY_API_VERSION=3
export OS_AUTH_URL="http://$KEYSTONE_IP/identity/v3"
export OS_USERNAME=$ADMIN_USER
export OS_USER_DOMAIN_ID=default
export OS_PASSWORD=$ADMIN_PASSWORD
export OS_PROJECT_NAME=$ADMIN_USER
export OS_PROJECT_DOMAIN_ID=default
export OS_REGION_NAME=RegionOne

现在我们使用 Keystone 创建项目和用户。

openstack project create test
openstack user create --project test --password testing tester
openstack role add --user tester --project test admin
openstack user create --project test --password member tester_member
openstack role add --user tester --project test _member_

现在我们通过让用户‘tester’ stat 账户‘test’来测试设置。我们使用 Swift 客户端 cli。一种方便的方法是编辑用户的 .bashrc 文件,添加以下行

export OS_USERNAME=tester
export OS_PASSWORD=testing
export OS_TENANT_NAME=test
export OS_AUTH_URL=http://127.0.0.1/identity/v3

现在执行

source .bashrc
swift stat

安装 Storlets

安装依赖项

Java 部分需要以下内容

sudo apt-get install openjdk-11-jdk ant

Docker 需要以下内容

sudo apt-get install docker.io
ln -sf /usr/bin/docker.io /usr/local/bin/docker
sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker
update-rc.d docker defaults

此外,将 swift 用户添加到 docker 组,以便用户无需 sudo 即可管理 docker 容器

sudo usermod -aG docker swift

获取并安装 storlets 代码

cd $HOME
git clone https://opendev.org/openstack/storlets.git
cd storlets
sudo ./install_libs.sh
sudo python setup.py install
cd -

注意

在将 storlets 包安装到你的 python virtualenv 中时,你不需要 sudo 来执行 ‘python setup.py install’。

构建用于运行 storlets 的 Docker 镜像

步骤 1:创建一个用于构建 docker 镜像的工作空间,例如:

mkdir -p $HOME/docker_repos
sudo docker pull ubuntu:22.04

步骤 2:使用 Java 创建一个 Docker 镜像

mkdir -p $HOME/docker_repos/ubuntu_22.04_jre11

创建文件:$HOME/docker_repos/ubuntu_22.04_jre11/Dockerfile,内容如下

FROM ubuntu:22.04
MAINTAINER root

# The following operations should be defined in one line
# to prevent docker images from including apt cache file.
RUN apt-get update && \
apt-get install python3 && \
apt-get install software-properties-common && \
apt-get install openjdk-11-jre-headless ant  && \
apt-get clean

构建镜像并将其命名为 storlet_engine_image

cd $HOME/docker_repos/ubuntu_22.04_jre11
sudo docker build -t storlet_engine_image .
cd -

步骤 3:创建特定租户的镜像。引擎查找名称为 <tenand id> 的镜像。首先,我们获取租户 id。使用 Swift cli 和上述创建用户执行

swift --os-auth-url http://127.0.0.1/identity/v3 --os-project-name test --os-project-domain-name default --os-username tester --os-password testing stat

上述响应包含 account 行,例如:

Account: AUTH_719caee804974c14a8632a760a7f85f7

account id 是 ‘AUTH_’ 前缀后面的数字。

接下来,创建文件 $HOME/docker_repos/storlet_engine_image_<account id>/Dockerfile,内容如下

FROM storlet_engine_image
MAINTAINER root

构建镜像

cd $HOME/docker_repos/storlet_engine_image_<account id>
sudo docker build -t <account id> .
cd -

创建 storlets 运行时环境

创建运行时目录

export STORLETS_HOME=/var/lib/storlets
sudo mkdir -p $STORLETS_HOME
sudo chmod 777 $STORLETS_HOME
稍后,中间件将用以下内容填充运行时目录:
  1. storlets - 映射的 Docker 容器目录,用于保存 storlet jar 文件

  2. pipe - 映射的 Docker 容器目录,用于保存中间件和容器之间共享的命名管道。

  3. logs - docker 容器内运行的 storlets 的日志

  4. cache - storlet jar 文件的本地缓存

配置 Swift 以与中间件组件一起工作

步骤 1:编辑代理服务器配置文件 /etc/swift/proxy-server.conf 并执行以下操作

  1. 如以下所示,将 storlet_handler 添加到代理服务器管道,紧接在 slo 中间件之前

pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk tempurl ratelimit authtoken keystoneauth container-quotas account-quotas storlet_handler slo dlo versioned_writes proxy-logging proxy-server
  1. 在文件底部添加以下配置块

[filter:storlet_handler]
use = egg:storlets#storlet_handler
storlet_container = storlet
storlet_dependency = dependency
storlet_gateway_module = docker
storlet_gateway_conf = /etc/swift/storlet_docker_gateway.conf
storlet_execute_on_proxy_only = false
execution_server = proxy

步骤 2:编辑对象服务器配置文件。在 SAIO 环境中,这些将是:/etc/swift/object-server/1.conf 到 /etc/swift/object-server/4.conf,否则文件通常是 /etc/swift/object-server.conf

  1. 如以下所示,将 storlet_handler 添加到对象服务器管道,紧接在 slo 对象服务器之前

pipeline = recon storlet_handler object-server
  1. 在文件底部添加以下配置块

[filter:storlet_handler]
use = egg:storlets#storlet_handler
storlet_container = storlet
storlet_dependency = dependency
storlet_gateway_module = docker
storlet_gateway_conf = /etc/swift/storlet_docker_gateway.conf
storlet_execute_on_proxy_only = false
execution_server = object

步骤 3:添加 Docker 网关配置文件。在 /etc/swift 下创建一个名为 storlet_docker_gateway.conf 的文件,内容如下

[DEFAULT]
storlet_logcontainer = storletlog
host_root = /var/lib/storlets
storlet_timeout = 40
container_image_namespace =
restart_linux_container_timeout = 3

步骤 4:重启 swift

sudo swift-init all restart

为 storlets 启用账户

我们使用上述创建的相同测试账户和 tester 用户。要为 storlets 启用账户,我们需要在账户上设置适当的用户元数据,并在账户内创建引擎假定的各种 Swift 容器。

我们使用 swift cli 如下

swift post \
--os-auth-url=http://127.0.0.1/identity/v3 \
--os-username=tester \
--os-password=testing \
--os-project-name=test \
--os-project-domain-name default \
--meta "Storlet-Enabled:True"


swift post \
--os-auth-url=http://127.0.0.1/identity/v3 \
--os-username=tester \
--os-password=testing \
--os-project-name=test \
--os-project-domain-name default \
--read-acl test:tester_member \
storlet

swift post \
--os-auth-url=http://127.0.0.1/identity/v3 \
--os-username=tester \
--os-password=testing \
--os-project-name=test \
--os-project-domain-name default \
--read-acl test:tester_member \
dependency

swift post \
--os-auth-url=http://127.0.0.1/identity/v3 \
--os-username=tester \
--os-password=testing \
--os-project-name=test \
--os-project-domain-name default \
storletlog

运行功能测试

功能测试会上传各种 storlets 并执行它们。成功运行功能测试证明安装已成功完成。

功能测试设计为在集群安装上运行(即非一体化安装)。因此,运行测试需要集群配置文件。

步骤 1:创建文件 $HOME/storlets/test.conf,内容如下。

[general]
region = RegionOne
storlets_default_project_member_password = member
storlets_default_project_member_user = tester_member
storlets_default_project_user_password = testing
storlets_default_project_user_name = tester
storlets_default_project_name = test
keystone_public_url = http://127.0.0.1/identity/v3
keystone_default_domain = default

步骤 2:运行功能测试

cd $HOME/storlets
ant build_storlets
tox -e func