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

こちらの記事[「Ceph Object Storage を docker-registry (docker-distribution) の バックエンドに使う」](https://qiita.com/nak3/items/9716a3e6a4ae770352dc)で使った設定と同様のものを使って、OpenShift上のdocker-registryのバックエンドにCephを使っていきたいと思います。

### docker-registryの設定ファイル変更

すでにデフォルト状態のdocker-registry podがデプロイされていることを前提にしています。デプロイされている pod から `/config.yml` をローカルにコピーします。

~~~
# oc cp docker-registry-N-XXXXX:/config.yml  .
~~~

ローカルで編集します。storage以下の`filesystem:`を`swift:`の設定に変更するだけです。

~~~
# vim config.yml
~~~

BEFORE:

~~~
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /registry
~~~

AFTER:

~~~
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
~~~

authurlやusernameの設定は、こちらの記事[「Ceph Object Storage を docker-registry (docker-distribution) の バックエンドに使う」](https://qiita.com/nak3/items/9716a3e6a4ae770352dc)で使った設定をそのまま使っています。それほど大変ではありませんし、初めはローカルのdocker-distributionで検証して設定が正しいことを確認しておくのが良いと思います。

### 更新した config.yml を docker-registry で利用する

更新した `config.yml` は、`configmap`を使って、docker-registryにmountさせます。docker-registryのDeploymentConfigには、環境変数も用意されているので、以下の3つのコマンドで変更は可能です。

~~~ 
# oc create configmap registry-config --from-file=config.yml 
# oc volume dc/docker-registry --add --type=configmap     --configmap-name=registry-config -m /etc/docker/registry/
# oc set env dc/docker-registry REGISTRY_CONFIGURATION_PATH=/etc/docker/registry/config.yml
~~~

DeploymentConfigを更新すると、デフォルトで ConfigChange で デプロイがトリガーされる設定されているので、podの再デプロイがはしります。Running状態になったことを確認してください。

~~~
# oc get pod
NAME                       READY     STATUS    RESTARTS   AGE
docker-registry-4-88bg6    1/1       Running   5          1m
~~~

### image を push して検証する

バックエンドストレージにCeph Object Storageを使うようになった、docker-registryにimageをpushしてテストしてみましょう。

~~~
# oc new-app centos/ruby-22-centos7~https://github.com/openshift/ruby-ex.git
~~~

ビルド pod のログを見て、push が成功することを確認しましょう。

~~~
# oc logs ruby-ex-1-build -f
Pushing image docker-registry.default.svc:5000/demo/ruby-ex:latest ...
Pushed 0/10 layers, 10% complete
Pushed 1/10 layers, 13% complete
Pushed 2/10 layers, 23% complete
Pushed 3/10 layers, 32% complete
Pushed 4/10 layers, 41% complete
Pushed 5/10 layers, 55% complete
Pushed 6/10 layers, 64% complete
Pushed 7/10 layers, 76% complete
Pushed 8/10 layers, 83% complete
Pushed 8/10 layers, 97% complete
Pushed 9/10 layers, 99% complete
Pushed 10/10 layers, 100% complete
Push successful
~~~

### (おまけ) Ceph 側のobjectを覗いてみる

swift コマンドを使ってpushされた image が Ceph ストレージにあることを確認してみます。`demo`はプロジェクト名で、その後ろにイメージ名と一緒に保存されていることがわかります。

~~~
# 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/repositories/demo/ruby-ex/_layers/sha256/296548fd899888385195c38cd1b5f3fa6443abe35c4169de2fdb104f70007afe/link
files/docker/registry/v2/repositories/demo/ruby-ex/_layers/sha256/3198ba1a52956d97ff53912cfbd20cc333fef02bb0bf0dabf32659af1ea6d272/link
files/docker/registry/v2/repositories/demo/ruby-ex/_layers/sha256/469cfcc7a4b3947a4fa549c68cf4f8570be53779725f0c19f3d33d1520b08db0/link
files/docker/registry/v2/repositories/demo/ruby-ex/_layers/sha256/46db36153229f0c3ccba1a4e75169c8d20db2d17aa46c7cfd8877a0357a72e39/link
files/docker/registry/v2/repositories/demo/ruby-ex/_layers/sha256/575bbd9ad94d0e03aad2a2d5b69a1e4d88f87d4d2c5c9ad86193c9027d2d61c9/link
files/docker/registry/v2/repositories/demo/ruby-ex/_layers/sha256/9cde659b5fe388676ae34f3fa107e6ad00e8573f3e4ea5aadef38c93f8a60e6f/link
files/docker/registry/v2/repositories/demo/ruby-ex/_layers/sha256/a2c26223d84a4efc918e010f7de2b903c0aebc901b669be127e4d60ea5bb7f2b/link
files/docker/registry/v2/repositories/demo/ruby-ex/_layers/sha256/a38d357764a3aa20c2241433436db6cc24ea898a7f3c0904d66ca2323f302123/link
files/docker/registry/v2/repositories/demo/ruby-ex/_layers/sha256/d71b2d9b1cd31f28ce83322703f7ab706a35255bbcd419a3e95c2e895bd5f681/link
files/docker/registry/v2/repositories/demo/ruby-ex/_layers/sha256/e11c8e053fb5d1761f80fbfe7369765ecf2942fb2d975d3dd1d2792fcd8cabbd/link
files/docker/registry/v2/repositories/demo/ruby-ex/_layers/sha256/f55f016bb97cae4fab16eefa5f65b85f3112ce9758614d3b308f4f55e280d9d3/link
files/docker/registry/v2/repositories/demo/ruby-ex/_manifests/revisions/sha256/4b132f5996ceefa09e5cfb1006451487e3e9e34b7edd58dd2de57bc07cc42199/link
~~~

今回は、docker-distributionを検証していたので、OpenShift上で利用することも簡単に終わってしまいました。docker-registryのバックエンドにCephオブジェクトストレージを使う手順でした。