マルチノードセットアップにおけるCEPHの探索



導入
CAPHはデータストレージの未来であり、オブジェクトかブロックかファイルシステムであるか.それはファイルシステムの領域でGlusterfsのような自己ホストされた解決に大きな代わるものを提供します、そして、オブジェクト・ストレージとしてAWS S 3のような管理されたサービスにそれがあなた自身のデータを主催するためにより多くの意味をするように、あなたは私的な雲にそれを保存しなければならないか、または、S 3コストが時々きれいになるので、単にコストを減らすために、より多くの意味をします.

環境設定
私は私の環境の宣言的な構成を作成するために放浪を使用しました.
私のセットアップはubuntu 20.04と3つの仮想マシンで構成されています.CEPHドキュメンテーションは最小のディスクサイズが5ギブであると言います、しかし、私は過去10 GB未満の保管で働いている過去に問題を抱えていました.
私はadminホストに他のものより多くの記憶を与えました、それは私が主に相互作用するものであるので、私はそれをできるだけ速くて円滑にしたかったです.
# Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  num_of_nodes = 3
  (0..(num_of_nodes - 1)).each do |node|

    node_name = "ceph-#{node + 1}"

    config.vm.define node_name do |ceph_node|
      ceph_node.vm.box = "ubuntu/focal64"
      ceph_node.vm.hostname = node_name
      ceph_node.vm.network "private_network", type: "dhcp"

      ceph_node.vm.disk :disk, size: "10GB", name: "ceph_storage"

      # CephFS
      ceph_node.vm.disk :disk, size: "10GB", name: "ceph_storage_extra" if node == 0

      ceph_node.vm.provision "shell", path: "install-docker.sh"
      ceph_node.vm.provision "shell", inline: "timedatectl set-ntp on"

      ceph_node.vm.provider "virtualbox" do |vb|
        vb.memory = node == 0 ? "3072" : "2048"
      end
    end
  end
end
使用するcephadm 私のcephクラスタを作成するには、docker(またはpodman)をマシンにインストールする必要がありますinstall-docker.sh すべての仮想マシンでそれを作成しますが、私は私のニーズに合わせてそれを編集しました.
# install-docker.sh

#!/bin/sh

set -o errexit
set -o nounset

IFS=$(printf '\n\t')

apt remove --yes docker docker-engine docker.io containerd runc || true
apt update
apt --yes --no-install-recommends install apt-transport-https ca-certificates
wget --quiet --output-document=- https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository --yes "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release --codename --short) stable"
apt update
apt --yes --no-install-recommends install docker-ce docker-ce-cli containerd.io
systemctl enable docker
printf '\nDocker installed successfully\n\n'
私も、すべてのホストの時間同期を活性化しましたVagrantfile 何らかの理由で無効になっていたので、cephは活性化する必要があります.
$ timedatectl set-ntp on
アフターランニングvagrant up このようなホストマシンからもアクセスできるプライベートネットワーク上に3つの仮想マシンが必要です.
ceph-1 (admin)
IPv4 address for enp0s8: 172.28.128.7


ceph-2
IPv4 address for enp0s8: 172.28.128.8


ceph-3
IPv4 address for enp0s8: 172.28.128.9

クラスタの作成
ホストマシンで
vagrant ssh ceph-1
CEPHクラスタを作成するにはcephadm 管理者ホストマシンでgithubからスクリプトをダウンロードし、実行可能にします.
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/pacific/src/cephadm/cephadm

chmod +x cephadm
スクリプト自体はクラスタをブートストラップするのに十分ですが、システム上のパッケージとしてインストールするのはより便利です.
./cephadm add-repo --release pacific
./cephadm install
その後、安全にクラスタをブートできます.
cephadm bootstrap --mon-ip 172.28.128.7 --ssh-user vagrant
明らかに172.28.128.7 は管理ホスト(現在のホスト)のIPです.
cephドキュメントから:

The --ssh-user option makes it possible to choose which ssh user cephadm will use to connect to hosts. The associated ssh key will be added to /home//.ssh/authorized_keys. The user that you designate with this option must have passwordless sudo access.


これはわずかにオフのトピックですが、デフォルトでの違反は、作成する仮想マシンへのパスレスのsudoとpassslessなSSHアクセスを作成し、sshのアクセスは、それが作成し、配置する秘密キーを介して可能です.vagrant/machines/*<machine name>*/virtualbox/private_key を返します.Grarantfileディレクトリも/vagrant ゲスト仮想マシンでは、例えばceph-3 ホスト秘密のsshキーはceph-1 ディレクトリのホスト/vagrant/.vagrant/machines/ceph-3/virtualbox/private_keyとにかく、cephに戻ると、ブートストラップコマンドを実行した後にダッシュボードの資格情報を取得します.

その後、ホストマシンからceph-1 ダッシュボードにアクセスするには、管理者ホストの仮想マシンのIPアドレスを使用します.ダッシュボードは、新しいものにパスワードを変更するように依頼し、正常にダッシュボードにアクセスできることを確認します.
すべてが順調に動くならば、我々は現在クラスタに新しいホストを加えることができます.
最初に走るssh-agent
eval $(ssh-agent)
次に、他の仮想マシンの秘密キーを追加します.ceph-2 and ceph-3 ) 我々はクラスタに追加したい.
ssh-add /vagrant/.vagrant/machines/ceph-2/virtualbox/private_key

ssh-add /vagrant/.vagrant/machines/ceph-3/virtualbox/private_key
ここでCEPHの公開鍵をコピーしますauthorized_keys 他の仮想マシンでは、CEPHをそれらのマシンにアクセスでき、クラスタに追加することができます.
ssh-copy-id -f -i /etc/ceph/ceph.pub [email protected]
ssh-copy-id -f -i /etc/ceph/ceph.pub [email protected]
それらをクラスタに追加します.
sudo ceph orch host add ceph-2 172.28.128.8
sudo ceph orch host add ceph-3 172.28.128.9
ホスト名がそれらのマシンのホスト名と一致することに注意してください.
CEPHのためにすべてのイメージをプルして、クラスタに加えられるためにそれらの機械上のすべてのコンテナを走らせる若干の時間(私の場合は数分)かかるかもしれません.
他のすべてのホストが追加されたことを確認してダッシュボードを開き、次のようにします.

クラスタの健康が黄色であることに注意してください.
最後に添付したディスクを追加するためにOSDサービスを展開しなければなりません.
sudo ceph orch apply osd --all-available-devices
つのホストで繁殖して、彼らの付属のディスクを加えるまで、それは若干の時間(数分も)かかるかもしれません.
クラスタの状態は健康でなければなりません、そして、あなたはクラスタでオブジェクト記憶サービスとファイルシステムサービスを走らせることができます.


オブジェクトストレージ
オブジェクトゲートウェイを使用するには、RGWサービスを実行しなければなりません.
ceph orch apply rgw s3
また、radosgw オブジェクトゲートウェイサービスにアクセスするには、ユーザーがAPIかCEPHダッシュボードからのかどうかを確認します.
ceph dashboard set-rgw-credentials

radosgw-admin user create --uid="ahmed" --display-name="Ahmed Khaled" --system
次のような結果を得る必要があります.
{
    "user_id": "ahmed",
    "display_name": "Ahmed Khaled",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "ahmed",
            "access_key": "05LT3KPECW7E30X2P4UO",
            "secret_key": "bBEJBxiM6JkRDUzCpGzN7EkGaVr9qSjqlDdNZWMp"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "system": "true",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}
The access_key and secret_key 我々は、結果の中で最も気にするものです.
ダッシュボードからオブジェクトゲートウェイにアクセスするには、アクセスキーと秘密キーをインポートする必要があります.
echo 05LT3KPECW7E30X2P4UO > /tmp/access_key
echo bBEJBxiM6JkRDUzCpGzN7EkGaVr9qSjqlDdNZWMp > /tmp/secret_key

ceph dashboard set-rgw-api-access-key -i /tmp/access_key 
ceph dashboard set-rgw-api-secret-key -i /tmp/secret_key 


BoEを使ったCEPH S 3 APIのテスト
あなたのホストマシンセットアップでvirtualenv あなたが望む任意のディレクトリで.
virtualenv --python=python2.7 .venv
source .venv/bin/activate
pip install boto
私はPythonの2.7を使用していますので、公式ドキュメントがサポートされているのですが、Python 3とBOTO 3では問題ないと思います.
私がCEPH管理マシンのIPを私のものに加えたように、より現実の世界を作るために/etc/hosts そして、それを'オブジェクトと呼びました.ラン
プライベートネットワークとプライベートドメインの詳細については、このトピックを参照してください.
172.28.128.7    objects.lan
その後、Pythonのテストファイルを作成します.
# s3.py

import boto
import boto.s3.connection

# This is for quick demonstration purpose 
# Never write your credentials in a code
access_key = '05LT3KPECW7E30X2P4UO'
secret_key = 'bBEJBxiM6JkRDUzCpGzN7EkGaVr9qSjqlDdNZWMp'


host = 'objects.lan' # /etc/hosts

conn = boto.connect_s3(
        aws_access_key_id = access_key,
        aws_secret_access_key = secret_key,
        host = host,
        is_secure=False,               # uncomment if you are not using ssl
        calling_format = boto.s3.connection.OrdinaryCallingFormat(),
        )

# Create a new nucket
bucket = conn.create_bucket('my-new-bucket')


# List all buckets
for bucket in conn.get_all_buckets():
        print("{name}\t{created}".format(
                name = bucket.name,
                created = bucket.creation_date,
        ))


# Add object to bucket
key = bucket.new_key('hello.txt')
key.set_contents_from_string('Hello World!\n')

# Generate a presigned URL
object_key = bucket.get_key('hello.txt')

# Make the url available for 20 seconds only
object_url = object_key.generate_url(20, query_auth=True, force_http=True)
print(object_url)
それを実行し、同様の結果を得る必要があります.
$ python s3.py 
my-new-bucket   2021-10-08T13:37:03.013Z
http://objects.lan/my-new-bucket/hello.txt?Signature=4ukxcnWqcNjbRKbF1gJ8%2FQ9eJMI%3D&Expires=1633873445&AWSAccessKeyId=05LT3KPECW7E30X2P4UO
テストする
$ for i in {1..5}; do curl 'http://objects.lan/my-new-bucket/hello.txt?Signature=4ukxcnWqcNjbRKbF1gJ8%2FQ9eJMI%3D&Expires=1633873445&AWSAccessKeyId=05LT3KPECW7E30X2P4UO'; sleep 5; done

Hello World!
Hello World!
Hello World!
<?xml version="1.0" encoding="UTF-8"?><Error><Code>AccessDenied</Code><RequestId>tx000000000000000000043-006162f2c5-455c5-default</RequestId><HostId>455c5-default-default</HostId></Error><?xml version="1.0" encoding="UTF-8"?><Error><Code>AccessDenied</Code><RequestId>tx000000000000000000044-006162f2ca-455c5-default</RequestId><HostId>455c5-default-default</HostId></Error

ファイルシステム
ファイルシステムの作成とテストは非常に簡単で、より簡単です.
CFSというファイルシステムを作成するには
ceph fs volume create cfs
ファイルシステムにアクセスするクライアントを作成する
ceph fs authorize cfs client.cfs / rw > /etc/ceph/ceph.client.cfs.keyring
テストする
mkdir /mnt/mycephfs/test
ダッシュボードに


ノート
  • からのコマンドを送ることができますclient host .
  • AWSはSSDを使いますgp2 and gp3 cephでnatievlyに動作しませんが、使用するための回避策がありますceph-volume .
  • CEPHはデフォルトで設計されているので、デフォルトでは複数のノードで複数のノードを期待しますが、単一のノード環境で動作するように設定できます.