OpenShift v3 のLDAP認証

OpenShiftの設定はマニュアルに書いてありありますが、そもそもLDAPサーバの証明書の準備などなど少し手間取ったので、メモです。

LDAPサーバの準備

インストール

これらのページを参照

  1. http://linux-hacking-guide.blogspot.jp/2015/04/ldap-authentication-server-in-rhel7.html
  2. http://www.certdepot.net/rhel7-configure-ldap-directory-service-user-connection/

確認

参照サイト(2)の方法で、/etc/passwd からユーザを移行している場合は、以下のコマンドで確認できます。

ldapsearch -x cn=ldapuser01 -b dc=example,dc=com
curl "ldap://client.cloud:389/dc=example,dc=com?cn?sub?uid=ldap*" -u "cn=Manager,dc=example,dc=com"
Enter host password for user 'cn=Manager,dc=example,dc=com’:redhat

DN: uid=ldapuser01,ou=People,dc=example,dc=com
    cn: ldapuser01
password=user01ldap

DN: uid=ldapuser02,ou=People,dc=example,dc=com
    cn: ldapuser02

password=user02ldap

TLSの利用設定とオレオレ証明書発行

証明書の発行

参照サイト (1) の以下の手順で証明書を発行します。

10) Create Server Certificate. Follow the following steps:

10.1) Create a local Certificate Authority (CA).

[root@oserver1 ~]# /etc/pki/tls/misc/CA  -newca

ここで設定するホスト名は、LDAPサーバのホスト名にしました。

10.2) Create public-private key pair

[root@oserver1 ~]#  openssl genrsa -out ldapserver.key

10.3) Create a certificate signing request (CSR)

[root@oserver1 ~]# openssl req -new -key ldapserver.key -out ldapserver.csr

10.4) Sign the certificate with the local CA.

[root@oserver1 ~]# openssl ca -in ldapserver.csr -out ldapserver.crt

10.5) Copy the files 'ldapserver.key' and 'ldapserver.crt' to the dir. '/etc/openldap/certs/'

10.6) We have to copy the CA cert file '/etc/pki/CA/cacert.pem' to the dir '/etc/openldap/cacerts/' on every client machine.

10.7)Create a file 'cert.ldif' with the following entries.

          dn: cn=config
          changetype: modify
          replace: olcTLSCertificateFile
          olcTLSCertificateFile: /etc/openldap/certs/ldapserver.crt

          dn: cn=config
          changetype: modify
          replace: olcTLSCertificateKeyFile
          olcTLSCertificateKeyFile: /etc/openldap/certs/ldapserver.key

10.8) Make entry

[root@oserver1 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f cert.ldif

追加設定

※ここは私の勘違いがありそうな予感。。。 TLSCACerfiticationを有効にするため、/etc/openldap/slapd.d/cn=config.ldifolcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pemの記述を追加します。 すでに、olcTLSCACertificateFileの定義がある場合は、次のldifを使って更新します。

dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pem

ldaps の有効化

/etc/sysconfig/slapdを編集してSLAPD_URLSを変更します。

#SLAPD_URLS="ldapi:/// ldap:///"
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"

トラブルシューティング

データベースの更新エラー

色々と悪銭苦闘していると、証明書を発行し直したり。で、そんなこんなでopenssl ca実行時にエラーが発生。

failed to update database
TXT_DB error number 2

古い証明書を無効にする必要があります。

openssl ca -revoke /etc/pki/CA/newcerts/00.pem

revokeもできない場合は、`/etc/pki/CA/index.txt を編集します。

cp -p /etc/pki/CA/index.txt{,.old}
: > /etc/pki/CA/index.txt

動作確認

# openssl s_client -connect client.cloud:636 -CAfile my-ldap-ca-bundle.crt 
CONNECTED(00000003)
depth=1 C = XX, ST = Default State, O = Default Company Ltd, OU = Default Organization, CN = client.cloud
verify return:1
depth=0 C = XX, ST = Default State, O = Default Company Ltd, OU = Default Organization, CN = client.cloud
verify return:1
---
Certificate chain
 0 s:/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
   i:/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
 1 s:/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
   i:/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDbDCCAlSgAwIBAgIJANs2X7OV8HUkMA0GCSqGSIb3DQEBCwUAMHkxCzAJBgNV
BAYTAlhYMRYwFAYDVQQIDA1EZWZhdWx0IFN0YXRlMRwwGgYDVQQKDBNEZWZhdWx0
IENvbXBhbnkgTHRkMR0wGwYDVQQLDBREZWZhdWx0IE9yZ2FuaXphdGlvbjEVMBMG
A1UEAwwMY2xpZW50LmNsb3VkMB4XDTE1MTAwNzIxNDQyNFoXDTE2MTAwNjIxNDQy
NFoweTELMAkGA1UEBhMCWFgxFjAUBgNVBAgMDURlZmF1bHQgU3RhdGUxHDAaBgNV
BAoME0RlZmF1bHQgQ29tcGFueSBMdGQxHTAbBgNVBAsMFERlZmF1bHQgT3JnYW5p
emF0aW9uMRUwEwYDVQQDDAxjbGllbnQuY2xvdWQwgZ8wDQYJKoZIhvcNAQEBBQAD
gY0AMIGJAoGBAMOUaNe/BY4cj6Q5eFZvfsKMnLCKXP6Ui6MVA4D5FuxoU7lSfUm5
VIvcxsxJNWGExPC9ZpDK0Yulpr3+FXbRhcwcZb6N5/F2UldamC4mscZT1AsfwRZJ
zMN+14HGV0lfAGkaA/ctbgOw41rd0oyy+VGODRAUMFlt6kF7/VFixTITAgMBAAGj
ezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVk
IENlcnRpZmljYXRlMB0GA1UdDgQWBBSRtt3qakgF9XS09BNnhT8GfT7C6zAfBgNV
HSMEGDAWgBShCPFk9kdbkAQoYRxf46abhM6DzTANBgkqhkiG9w0BAQsFAAOCAQEA
IVGB3hSQWXzAl2jHP8pHQ/s1qeRQZAKHuCp687CycikhSVgVd/VFA+VLeoTJrL7m
ESdfz0L3j+jJtlWTjN9Evs4QJBfqHkIyFlxz+ud0k+2tXdggqV+Cqo1i0hi+u9F1
KZL8BhPJwnN+Z8vEhA0RaWctqbTr2jMJ0ySEHGghmaPEggkZjbJ7TCub4KCwlKVF
12XIAEr4xLx6eOlwFQRmC8TpgGkKLj2HZ/k+7ywlApbv1zJErq3C1fyB9TQNNPEX
0Wdow+uuIQIgCog65YepsVHE4cMikX0uaXZW3tyE6FcD0Y3uaU9+X5pyJ+XGosC4
i46cMdt0xQutdACKdrRteA==
-----END CERTIFICATE-----
subject=/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
issuer=/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
---
No client certificate CA names sent
---
SSL handshake has read 2003 bytes and written 439 bytes
---
New, TLSv1/SSLv3, Cipher is AES128-GCM-SHA256
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : AES128-GCM-SHA256
    Session-ID: 268668D6A0B3813C46718D3502D5F028A068BE44F5A9CE23407611499A62D77D
    Session-ID-ctx: 
    Master-Key: 808949603CFADCDC98FDB435495C3DE5D8A6106FD2214D891142148F5FE5CC546A552F19EF90C45BCBE02E0AAB00AE28
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1444300644
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

OpenShiftの認証設定 

証明証の配置

LDAPサーバから証明書(/etc/openldap/cacerts/cacert.pem)を取得して、/etc/openshift/master/my-ldap-ca-bundle.crtに保存します。

oauthConfig:
  assetPublicURL: https://master.cloud:8443/console/
  grantConfig:
    method: auto
  identityProviders:
  - name: my_ldap_provider
    challenge: True
    login: True
    provider:
      apiVersion: v1
      kind: LDAPPasswordIdentityProvider
      attributes:
        id:
        - dn
        email:
        - mail
        name:
        - cn 
        preferredUsername:
        - uid
      bindDN: "cn=Manager,dc=example,dc=com"
      bindPassword: "redhat"
      ca: "my-ldap-ca-bundle.crt"
      insecure: false
      url: "ldaps://client.cloud:636/dc=example,dc=com?uid"

なお、CAの認証をしない場合、cainsecureurlの設定は以下の通りです。

ca: ""
insecure: true
url: "ldap://client.cloud:389/dc=example,dc=com?uid"

openshift-master を再起動して、LDAP認証の完了です

OpenShift上のコンテナから外部のDBを参照する

外部のMySQLを準備する

簡単に試すため MySQLのコンテナを利用します。

MySQLの実行

sudo docker pull docker.io/mysql
sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql

3306ポートの開放

sudo iptables -A OUTPUT -p tcp --dport 3306 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

テーブル作成

MySQLのコンテナに入って、データベースとテーブルを作成します。

docker exec -it <CONTAINER_ID> bash
mysql -u root -p
Enter password: mysql  ←mysqlと入力。パスワードなので表示はされない

create database mydb;
create table hello (
msg varchar(255)
);
insert into hello(msg) values('hello opensihft');

これで、データベースは準備完了です。

アプリケーション作成

MySQLを利用するPHPのアプリケーション作成

ここでは、helloテーブルを参照するように変更したdemoブランチを指定します。

oc new-project extdbtest
oc new-app https://github.com/akubicharm/hello-php.git#demo

ルーティングの設定

アプリケーションにFQDNでアクセスするために、ルーティングの設定をします。

oc expose service hello-php --hostname=hello-php.extdbtest.apps.cloud

curl hello-php.extdbtest.apps.cloudコマンドを実行しても、DBにアクセスできないので警告が表示されます。

これで、外部のDBを参照するアプリケーションは準備完了です。

外部のDBを利用する設定

外部のDBを利用するために、サービスとエンドポイントを定義します。

サービス定義

hello-phpアプリケーションから参照するためのhello-php-mysql-serviceサービスを定義します。 ここでmetadataで指定するnameの値がhello-php-mysql-serviceであることが重要です。index.phpからDBサーバ指定する環境変数と合わせておく必要があります。

サービスのホスト名は、[サービス名を大文字にした文字列]_SERVICE_HOST という命名規則になっています。

  • index.phpの抜粋
$mysqli = new mysqli(getenv("HELLO_PHP_MYSQL_SERVICE_HOST"), getenv("MYSQL_USER"), getenv("MYSQL_PASSWORD"), getenv("MYSQL_DATABASE"));
{
    "kind": "Service",
    "apiVersion": "v1",
    "metadata": {
        "name": "hello-php-mysql"
    },
    "spec": {
        "ports": [
            {
                "name": "mysql",
                "protocol": "TCP",
                "port": 3306,
                "targetPort": 3306,
                "nodePort": 0
            }
        ]
    },
    "selector": {}
}

サービスを作成します。

oc create -f hello-php-mysql-service.json

エンドポイント定義

hello-php-mysql-serviceサービスのエンドポイント(DBサーバ)を定義します。 subsetsで、DBサーバのIPアドレス、ポート番号を指定します。subsets->portsで定義しているname(ここでは、mysql)は、サービスのspecで定義したnameに合わせます。

  • エンドポイントの定義 [hello-php-mysql-endpoint.json]
{
  "kind": "Endpoints",
  "apiVersion": "v1",
  "metadata": {
    "name": "hello-php-mysql"
  },
  "subsets": [
    {
      "addresses":  [
        { "IP": "192.168.232.101" }
      ],
      "ports":  [
        { "port": 3306, "name": "mysql" }
      ]
    }
  ]
}

エンドポイントを作成します。

oc create -f hello-php-mysql-endpoint.json

デプロイメントコンフィグの抽出

deploymentConfig(dc)をJSON形式で抽出します。

oc export dc hello-php -o json > hello-php-dc.json

デプロイメントコンフィグの定義

保存したhello-php-dc.jsonを編集し、hello-phpアプリケーションから利用する環境変数名を定義します(65〜78行目)。実際の値はoc envコマンドで定義します。

  • 編集したデプロイメントコンフィグの抜粋
    55                   "containers": [
    56                      {
    57                          "name": "hello-php",
    58                          "image": "172.30.131.34:5000/extdbtest/hello-php@sha256:bb766f1c8fc7aab47fce0ce9bccb24e1a18fb692e4c8ddd33c40c994c0587e00",
    59                          "ports": [
    60                              {
    61                                  "containerPort": 8080,
    62                                  "protocol": "TCP"
    63                              }
    64                          ],
    65                          "env": [
    66                            {
    67                              "name": "MYSQL_USER",
    68                              "value": "${MYSQL_USER}"
    69                            },
    70                            {
    71                              "name": "MYSQL_PASSWORD",
    72                              "value": "${MYSQL_PASSWORD}"
    73                            },
    74                            {
    75                              "name": "MYSQL_DATABASE",
    76                              "value": "${MYSQL_DATABASE}"
    77                            }
    78                          ],
    79                          "resources": {},
    80                          "terminationMessagePath": "/dev/termination-log",
    81                          "imagePullPolicy": "Always"
    82                      }
    83                  ],

デプロイメントコンフィグの更新

デプロイメントコンフィグを更新します。更新するとLATEST VERSIONが1つインクリメントされます。

oc replace --force -f hello-php-dc.json

環境変数の設定

まず、環境変数が設定されていないことを確認します。

oc env dc/hello-php --listを実行すると、以下のように出力されます。

# deploymentconfigs hello-php, container hello-php
MYSQL_USER=${MYSQL_USER}
MYSQL_PASSWORD=${MYSQL_PASSWORD}
MYSQL_DATABASE=${MYSQL_DATABASE}

oc envコマンドで環境変数を設定します。

oc env dc hello-php -e MYSQL_USER=root  -e MYSQL_PASSWORD=mysql  -e MYSQL_DATABASE=mydb

再度oc env dc/hello-php --listを実行すると、環境変数が設定されていることを確認できます。

# deploymentconfigs hello-php, container hello-php
MYSQL_USER=root
MYSQL_PASSWORD=mysql
MYSQL_DATABASE=mydb

アプリケーションの確認

curl hello-php.extdbtest.apps.cloud コマンドを実行すると、以下のように表示されます。

<h1>Hello External DB</h1>array(1) {
  ["msg"]=>
  string(15) "hello opensihft"
}

設定の詳細はOpenShift v3 Developer GuideChapter 9. Integrating External Services - Red Hat Customer Portalをみてください。

OpenShift v3 のJBoss Web Server (tomcat7)+MySQL テンプレートの使い方

Tomcat/MySQLのテンプレートを使う場合、少しだけ設定が必要だったのでメモ

やりたいこと

JBoss Web Server (tomcat7)/MySQLのテンプレートを使って簡単なアプリケーションのデプロイ。デプロイするアプリケーションはtomcatのサンプルアプリケーションを利用します。

利用するテンプレート

パラメータ

パラメータ名 備考
APPLICATION_HOSTNAME sample-extdbtest.apps.cloud 公開するときのFQDNを指定
GIT_URI https://github.com/apache/tomcat.git Tomcatのサンプルアプリ

アプリケーションの確認

http://sample-extdbtest.apps.cloud/examples/index.html にアクセスして、以下のページが表示されるはず。だった。。。

<title>Apache Tomcat Examples</title>
</head>
<body>
<p>
<h3>Apache Tomcat Examples</H3>
<p></p>
<ul>
<li><a href="servlets">Servlets examples</a></li>
<li><a href="jsp">JSP Examples</a></li>
<li><a href="websocket/index.xhtml">WebSocket (JSR356) Examples</a></li>
<li><a href="websocket-deprecated">WebSocket Examples using the deprecated
    Apache Tomcat proprietary API</a></li>
</ul>
</body></html>

発生した問題

build

サンプルアプリケーションのタグがmasterではなくtrunkだった。

これは、アプリケーション作成時に設定するパラメータGIT_REFtrunkに設定すれば良い。すでに作成済みのbuildConfigを直接編集してもOK。

  source:
    git:
      ref: trunk
      uri: https://github.com/apache/tomcat.git
    type: Git

編集後、build を実行。

oc start-build jws-app

deploy

ServiceAccount、Secretがない

deploy に失敗するので、oc get events でイベントログを確認したところ、Podの作成にjws-service-accountがないというエラー。 これを解決して、気を取り直して再デプロイするも、今度はVolumeをマウントするのにjws-app-secretがないというエラー。 jws-service-accountとjws-app-secretをhttps://github.com/jboss-openshift/application-templates/blob/master/secrets/jws-app-secret.jsonに使って作成。

oc create -f jws-app-secret.json

設定後、deploy を再実行。

oc deploy jws-app --latest

これで無事にアプリケーションがデプロイできました。

ビルドは一度だけ!

継続的デリバリを実現するための鉄則の一つに「バイナリのビルドは一度だけ!」というものがあります。しかし、ソースコードリポジトリに登録されているソースコードを正として、ビルドやデプロイを行うツールを利用している場合には、この鉄則の実現が難しくなります。

OpenShiftでは、ビルド済みの Docker Image をバージョン管理しているので、「ビルドは一度だけ!」を容易に実現可能です。

ということで、OpenShift v3その実現方法をご紹介します。

「ビルドは一度だけ!」を実現するためのOpenShiftの概念

ImageStream

OpenShiftにデプロイするアプリケーションのDockerイメージへの参照。SCMのブランチのようなイメージで利用可能。

ServiceAccount

OpenShift APIを利用する権限を持つオブジェクト。Podのビルドを実行するsystem:image-builder権限を持つbuilder、Podのデプロイをするsystem:deployer権限をもつdeployer、builder, deployer以外のすべての権限をもつdefaultがある。

手順

アプリケーションの作成

ビルドは一度だけを実現するために元となるプロジェクトとアプリケーションを作成します。

1. テスト用プロジェクト(hello)の作成

oc new-project hello

2. アプリケーションの作成

oc new-app https://github.com/akubicharm/php-hello-world.git

3.ルーティングの設定と確認

oc expose service php-hello-world --hostname=php-hello-world.hello.apps.cloud
curl php-hello-world.hello.apps.cloud

Hello World」と出力されれば OK です。

ビルド済みイメージをデプロイするプロジェクト(hello-prod)の作成

OpenShift v3.0.2.0 では、異なるプロジェクトのImageStreamを利用してアプリケーションがデプロイできるようになりました。

1. プロジェクトの作成

oc new-project prod-hello

2. helloプロジェクトのポリシーの確認

oc describe policyBindings :default -n hello

system:image-pullers ロールに Service Account が設定されていません。

RoleBinding[system:image-pullers]:   
                    Role:           system:image-puller
                    Users:          <none>
                    Groups:         system:serviceaccounts:hello
                    ServiceAccounts:    <none>
                    Subjects:       <none>

3.prod-hello プロジェクトに権限の付与

oc policy add-role-to-user system:image-puller system:serviceaccount:prod-hello:default -n hello

prod-helloプロジェクトのdefaultサービスアカウントにimage-pullerロールが付与されました。これでprod-helloプロジェクトはアプリケーションのデプロイ時にhelloプロジェクトのImageStreamを利用することができるようになります。

RoleBinding[system:image-pullers]:   
                    Role:           system:image-puller
                    Users:          <none>
                    Groups:         system:serviceaccounts:hello
                    ServiceAccounts:prod-hello/default
                    Subjects:       <none>

ビルド済みイメージからのアプリケーションのデプロイ

1. テスト用プロジェクトからテンプレート作成

helloプロジェクトからアプリケーションのテンプレートを作成します。ビルドは行う必要がないので、buildConfigはエクスポート対象から除外し、deploymentConfig, service, route のみをエクスポートします。

oc export deploymentConfig,service,route -o yaml --as-template=php-hello-world > prod-php-hello-world.yaml

テンプレートの ImageStreamのタグとルーティングの設定を編集します。

perl -i -pe 's/name: php-hello-world:latest/name: php-hello-world:prod-hello/g' prod-php-hello-world.yaml
perl -i -pe 's/php-hello-world.hello.apps.cloud/php-hello-world.prod.apps.cloud/g' prod-php-hello-world.yaml

この段階ではhello-prodというタグの付いた php-hello-worldのImageStreamがまだないので、デプロイはされません。

2. プロダクション用プロジェクトへアプリケーションのデプロイ

oc project prod-hello
oc new-app -f prod-php-hello-world.yaml

3. ImageStream の確認

oc project hello
oc get imageStream
oc describe is php-hello-world
Name:           php-hello-world
Created:        28 minutes ago
Labels:         app=php-hello-world
Docker Pull Spec:   172.30.131.34:5000/hello/php-hello-world

Tag Spec        Created     PullSpec                                Image
latest  <pushed>    26 minutes ago  172.30.131.34:5000/hello/php-hello-world@sha256:a94f7113d501dea557c952886d099b59825ad14e2a3f25aa545fe0311aef7b4c    

4. タグ付け

oc tag hello/php-hello-world@sha256:a94f7113d501dea557c952886d099b59825ad14e2a3f25aa545fe0311aef7b4c prod-hello/php-hello-world:prod

5. デプロイ

oc deploy prod-php-helo-world --latest -n prod-hello

これで、hello プロジェクトで動作確認されたアプリケーションをprod-helloにデプロイすることができました。 この後は、以下の手順を繰り返すことで「ビルドは一度だけ!」を実現できるようになります。

  1. ソースコードの変更
  2. hello プロジェクトのビルド
  3. hello プロジェクトでのテスト
  4. 最新のイメージへのタグ付け

f:id:akubicharm:20150930022657p:plain

修正履歴

  • [2015/10/21] oc tag の第2引数を修正しました。他のプロジェクトで作成されたイメージを利用するには、[MyProjectName]/[Image Stream]:[tag] とする必要があります。

覚書 - Vagrant/VirtualBox On Mac での色々

環境

vagrant 1.7.4

Virtualbox 5.0.3

ゲストOSのネットワークアダプタは、NATとホストオンリーネットワーク

 

ホストOSの設定

ホストオンリーネットワークを利用するために、vboxnetX を作成。ゲストOSはIPを固定にするので、DHCPは無効

VirtualBox - ネットワークの設定

アダプター(例)

ゲストOSを 192.168.232.0/24 のネットワークに接続する場合

  • IPv4アドレス : 192.168.232.1
  • IPv4ネットマスク: 255.255.255.0

ゲストOSの設定

DNSの設定

NATは10.0.2.15 になっている。ホストOSをDNSサーバに見立てる場合は、ifcfg-ethxxx(NAT側のアダプタ)に

DNS1=10.0.2.3

を追加する。

こうすれば、ホストOSがどのネットワークに接続されているかを気にすることなく、名前解決が可能になる。

 

覚書 - コンテナの名前解決のトラブルシューティング

OpenShiftのビルド用コンテナからgithub.comなどが見えない場合

Docker 内で名前解決ができていない場合は、dockerデーモンのオプションで明示的にDNSサーバを指定すれば良い。

ex) --dns 8.8.8.8

Docker内で名前解決が行われない場合の対処法 - Qiita

 

デプロイ対象のテンプレートアプリケーションをDockerで動かす

docker run -it openshift3/nodejs-010-rhel7  /bin/sh

ここで、名前解決できるか確認すれば OK

覚書-OpenShift内部の使用リソースの除去(Pruning)

パッとわかりにくかったので、備忘録として。

OpenShiftには、不要になったリソースを除去するためのCLIのコマンドがあります。対象となるリソースは、builds, deploymentsとimagesです。

builds - Docker Build, S2I Build, Custom Buildを実行するために生成されるオブジェクト。ビルドの度に生成されるので、何度もビルドをしていると溜まっていきいます。

deployments - デプロイを実行するためにに生成されるオブジェクト。

images - ビルドの結果生成さ、OpenShift内部に保存されるDocker Image。

builds, deployments はマニュアルに記載の通り system:admin というシステムアカウントで実行すれば、除去することができます。

$ oadm prune builds
$ oadm prune deployments

ですが、images の除去はちょっと違います。

$ oadm prune images
error: You must use a client config with a token

OpenShiftのユーザとしてログインしてから実行する必要がありますが、ここで準備が必要になります。通常のユーザには、system:image-prunerの権限がありません。 まず、OpenShiftの管理者でユーザ(ここではjoe)に system:image-pruner の権限を付与します。

$ oadm policy add-cluster-role-to-user system:image-pruner joe
$ oc login --username joe
$ oadm prune images
Dry run enabled - no modifications will be made. Add --confirm to remove images

Deleting registry layer blobs ...
BLOB
sha256:ddf7338aedaa23ecb45fe7adc222ee367bf822a8fe576e1ef02566a75ba07c2d
sha256:51352e3baedfe18f25986f24992fd79b403885301477ba28d293bb9ea1b177d9
sha256:1986487abec7fd451a1247e4ff522103b37d3f184758fb701518e44d8ef619a8
sha256:162699bb928f7acb06ece7a699006cc71aa18c08045d7bcc7075381a36c2962d
sha256:ae823ba6c0be979b400879198a21b8c629a7933d1c24c166ff4f546a214063c5

Deleting images from OpenShift ...
IMAGE
sha256:4d3785ddc85f1c53105b54792a23ee4c4ccf6e27cf4f1dcb597094d8d182a345

詳細は、Administrator Guide[1]をご参照ください。

[1]https://access.redhat.com/documentation/en/openshift-enterprise/version-3.0/openshift-enterprise-30-administrator-guide#pruning-resources