Ceph Object Storage を docker-registry (docker-distribution) の バックエンドに使う

今回は、Ceph Object Storage を docker-registry の バックエンドに使っていきます。

### Ceph側で ユーザーの作成

ユーザーを作ります。

~~~
# radosgw-admin user create --uid="nak3" --display-name="test admin" \
   --email=nak3@example.com --access_key="testkey" --secret="testsecret"
~~~

サブユーザーを作ります。

~~~
# radosgw-admin subuser create --uid="nak3" --subuser="nak3:swift" \
  --access_key="testkey" --secret="testsecret" --access=full
~~~

サブユーザーを作ったときのアウトプットは以下のようになります。

~~~
{
    "user_id": "nak3",
    "display_name": "test admin",
    "email": "nak3@example.com",
    "suspended": 0,
    "max_buckets": 1000,
    "auid": 0,
    "subusers": [
        {
            "id": "nak3:swift",
            "permissions": "full-control"
        }
    ],
    "keys": [
        {
            "user": "nak3",
            "access_key": "testkey",
            "secret_key": "testsecret"
        }
    ],
    "swift_keys": [
        {
            "user": "nak3:swift",
            "secret_key": "testsecret"
        }
    ],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "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"
}
~~~

### Ceph側で bucket の準備

続いて、swift コマンドを使って、bucket を作ります。

~~~
# swift -V 1.0 -A http://knakayam-ceph-c2.example.com/auth/v1 -U nak3:swift \
  -K testsecret post docker-registry
~~~

### swift API を使った ファイルアップロードの簡易テスト

寄り道になりますが、念の為、ファイルがアップロードできることを試しておきます。

~~~
# touch test-file

# swift -V 1.0 -A http://knakayam-ceph-c2.example.com/auth/v1 -U nak3:swift  -K testsecret upload docker-registry test-file
test-file
~~~

stat 確認すると、Objectsが「1」になっていますね。問題なさそうです。

~~~
# swift -V 1.0 -A http://knakayam-ceph-c2.example.com/auth/v1 -U nak3:swift  -K testsecret stat docker-registry
                      Account: v1
                    Container: docker-registry
                      Objects: 1
                        Bytes: 0
                     Read ACL:
                    Write ACL:
                      Sync To:
                     Sync Key:
                Accept-Ranges: bytes
             X-Storage-Policy: default-placement
X-Container-Bytes-Used-Actual: 0
                  X-Timestamp: 1531912241.51508
                   X-Trans-Id: tx000000000000000000aba-005b4f2041-5e31-default
                 Content-Type: text/plain; charset=utf-8
       X-Openstack-Request-Id: tx000000000000000000aba-005b4f2041-5e31-default
~~~

以上で、Ceph側の準備は終わりです。


### docker-distribution の設定

docker-distributionをインストールします。

~~~
# yum -y install docker-distribution
~~~

docker-distributionの設定は、`/etc/docker-distribution/registry/config.yml`を設定するだけです。

~~~
# vim /etc/docker-distribution/registry/config.yml
~~~

簡易的にテストするだけなので、最低限の設定にしておきます。

~~~
version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  swift:
    username: nak3:swift
    password: testsecret
    authurl: http://knakayam-ceph-c2.example.com/auth/v1.0
    insecureskipverify: false
    container: docker-registry
    rootdirectory: /registry
http:
    addr: :5000
~~~

あとは、サービスを再起動しておくだけです。

~~~
# systemctl restart docker-distribution.service
~~~

### イメージの push

busyboxという軽めのイメージをpullして、タグ付けして、pushします。

~~~
# docker pull busybox
# docker tag busybox 127.0.0.1:5000/busybox
# docker push 127.0.0.1:5000/busybox
~~~

最初に使った swift コマンドで、イメージが保存されていることを確認します。

~~~
# swift -V 1.0 -A http://knakayam-ceph-c2.example.com/auth/v1 -U nak3:swift  -K testsecret list docker-registry
files/docker/registry/v2/blobs/sha256/1b/1bd6df27274fef1dd36eb529d0f4c8033f61c675d6b04213dd913f902f7cafb5/data
files/docker/registry/v2/blobs/sha256/22/22c2dd5ee85dc01136051800684b0bf30016a3082f97093c806152bf43d4e089/data
files/docker/registry/v2/blobs/sha256/75/75a0e65efd518b9bcac8a8287e5c7032bc81f8cbfbe03271fd049b81ab26119b/data
files/docker/registry/v2/repositories/busybox/_layers/sha256/22c2dd5ee85dc01136051800684b0bf30016a3082f97093c806152bf43d4e089/link
files/docker/registry/v2/repositories/busybox/_layers/sha256/75a0e65efd518b9bcac8a8287e5c7032bc81f8cbfbe03271fd049b81ab26119b/link
files/docker/registry/v2/repositories/busybox/_manifests/revisions/sha256/1bd6df27274fef1dd36eb529d0f4c8033f61c675d6b04213dd913f902f7cafb5/link
files/docker/registry/v2/repositories/busybox/_manifests/tags/latest/current/link
files/docker/registry/v2/repositories/busybox/_manifests/tags/latest/index/sha256/1bd6df27274fef1dd36eb529d0f4c8033f61c675d6b04213dd913f902f7cafb5/link
foo
segments/2f6/46f636b65722f72656769737472792f76322f7265706f7369746f726965732f62757379626f782f5f75706c6f6164732f35326162376633362d643534332d343636302d613963312d6232333136613264393362632f6461746149391f47a198dfa46951f927f2ddc333a280d84cffef4358eb0a3dec59dc8a7eda39a3ee5e6b4b0d3255bfef95601890afd80709/0000000000000001
segments/2f6/46f636b65722f72656769737472792f76322f7265706f7369746f726965732f62757379626f782f5f75706c6f6164732f61653566623466382d383362392d346563382d396263342d3966313930326430393865352f646174612e13e94b53f06f689cd9a39460220b0b7c611d0c4a87cb4e323a7fd24db45393da39a3ee5e6b4b0d3255bfef95601890afd80709/0000000000000001
~~~

思ったより簡単に、Ceph Object Storage を docker-distribution のバックエンドにして試してみることができました。