第7章 Docker タスク
OpenShift Container Platform は Docker を使用して、任意の数のコンテナーで作成される Pod でアプリケーションを実行します。
クラスター管理者は、OpenShift Container Platform インストールの各種の要素を効率的に実行するために Docker に追加の設定を加える必要がある場合があります。
7.1. Docker ストレージの拡張
利用可能なストレージの容量を増やすことにより、停止が発生しない継続的なデプロイメントが可能になります。これを実行するには、適切なサイズの空き容量を含む空きのパーティションが利用可能でなければなりません。
7.1.1. ノードの退避
手順
マスターインスタンスからか、またはクラスター管理者として、ノードからの Pod の退避を許可し、そのノードでの他の Pod のスケジューリングを無効にします。
$ NODE=ose-app-node01.example.com $ oc adm manage-node ${NODE} --schedulable=false NAME STATUS AGE VERSION ose-app-node01.example.com Ready,SchedulingDisabled 20m v1.6.1+5115d708d7 $ oc adm drain ${NODE} --ignore-daemonsets node "ose-app-node01.example.com" already cordoned pod "perl-1-build" evicted pod "perl-1-3lnsh" evicted pod "perl-1-9jzd8" evicted node "ose-app-node01.example.com" drained
注記移行されないローカルボリュームでコンテナーが実行されている場合には、以下のコマンドを実行します。
oc adm drain ${NODE} --ignore-daemonsets --delete-local-data
.ノード上の Pod を一覧表示し、それらが削除されていることを確認します。
$ oc adm manage-node ${NODE} --list-pods Listing matched pods on node: ose-app-node01.example.com NAME READY STATUS RESTARTS AGE
- ノードごとに、これまでの 2 つの手順を繰り返します。
Pod またはノードの退避またはドレイン (解放) についての詳細は、「ノードの保守」を参照してください。
7.1.2. ストレージの拡張
Docker ストレージは、新規ディスクを割り当てるか、または既存ディスクを拡張するかの 2 つの方法で拡張できます。
新規ディスクによるストレージの拡張
前提条件
新規ディスクは、追加のストレージを必要とする既存のインスタンスで利用可能でなければなりません。以下の手順では、/etc/sysconfig/docker-storage-setup ファイルに示されているように、元のディスクに
/dev/xvdb
というラベルが付けられ、新規ディスクには/dev/xvdd
というラベルが付けられています。# vi /etc/sysconfig/docker-storage-setup DEVS="/dev/xvdb /dev/xvdd"
注記プロセスは基礎となる OpenShift Container Platform インフラストラクチャーによって異なります。
手順
docker
およびatomic-openshift-node
サービスを停止します。# systemctl stop docker atomic-openshift-node
docker-storage-setup
コマンドを実行してコンテナーストレージに関連付けられたボリュームグループおよび論理ボリュームを拡張します。# docker-storage-setup INFO: Volume group backing root filesystem could not be determined INFO: Device /dev/xvdb is already partitioned and is part of volume group docker_vol INFO: Device node /dev/xvdd1 exists. Physical volume "/dev/xvdd1" successfully created. Volume group "docker_vol" successfully extended
Docker サービスを起動します。
# systemctl start docker # vgs VG #PV #LV #SN Attr VSize VFree docker_vol 2 1 0 wz--n- 64.99g <55.00g
新規ボリュームグループを作成して
docker-storage-setup
を再実行する場合と比較したディスクの追加のメリットとして、システムで使用されていたイメージが新規ストレージの追加後もそのまま存在するという点があります。# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-registry.default.svc:5000/tet/perl latest 8b0b0106fb5e 13 minutes ago 627.4 MB registry.access.redhat.com/rhscl/perl-524-rhel7 <none> 912b01ac7570 6 days ago 559.5 MB registry.access.redhat.com/openshift3/ose-deployer v3.6.173.0.21 89fd398a337d 5 weeks ago 970.2 MB registry.access.redhat.com/openshift3/ose-pod v3.6.173.0.21 63accd48a0d7 5 weeks ago 208.6 MB
ストレージ容量を拡張した状態で、新しく入ってくる Pod を受け入れられるようにノードをスケジュール可能な状態にします。
クラスター管理者として、マスターインスタンスから以下を実行します。
$ oc adm manage-node ${NODE} --schedulable=true ose-master01.example.com Ready,SchedulingDisabled 24m v1.6.1+5115d708d7 ose-master02.example.com Ready,SchedulingDisabled 24m v1.6.1+5115d708d7 ose-master03.example.com Ready,SchedulingDisabled 24m v1.6.1+5115d708d7 ose-infra-node01.example.com Ready 24m v1.6.1+5115d708d7 ose-infra-node02.example.com Ready 24m v1.6.1+5115d708d7 ose-infra-node03.example.com Ready 24m v1.6.1+5115d708d7 ose-app-node01.example.com Ready 24m v1.6.1+5115d708d7 ose-app-node02.example.com Ready 24m v1.6.1+5115d708d7
新規ディスクによるストレージの拡張
- 直前の手順に従って、ノードを退避します。
docker
およびatomic-openshift-node
サービスを停止します。# systemctl stop docker atomic-openshift-node
既存ディスクを必要に応じてサイズ変更します。これは環境に応じて異なります。
LVM (Logical Volume Manager) を使用している場合:
# lvremove /dev/docker_vg/docker/lv
# vgremove docker_vg
# pvremove /dev/<my_previous_disk_device>
- クラウドプロバイダーを使用している場合は、ディスクの割り当てを解除し、ディスクを破棄してから新規のより大きなディスクを作成し、これをインスタンスに割り当てることができます。
クラウド以外の環境の場合、ディスクおよびファイルシステムのサイズは変更することができます。詳細については、以下のソリューションを参照してください。
- デバイス名、サイズなどを確認して /etc/sysconfig/container-storage-setup ファイルが新規ディスクに対して適切に設定されていることを確認します。
docker-storage-setup
を実行して新規ディスクを再設定します。# docker-storage-setup INFO: Volume group backing root filesystem could not be determined INFO: Device /dev/xvdb is already partitioned and is part of volume group docker_vol INFO: Device node /dev/xvdd1 exists. Physical volume "/dev/xvdd1" successfully created. Volume group "docker_vol" successfully extended
Docker サービスを起動します。
# systemctl start docker # vgs VG #PV #LV #SN Attr VSize VFree docker_vol 2 1 0 wz--n- 64.99g <55.00g
atomic-openshift-node
サービスを起動します。# systemctl start atomic-openshift-node
7.1.3. ストレージバックエンドの変更
サービスおよびファイルシステムの機能拡張に応じて、新規機能を使用できるようにストレージバックエンドの変更が必要になる場合があります。以下の手順では、デバイスマッパーのバックエンドを overlay2
ストレージのバックエンドに変更する例について示しています。overlay2
は従来のデバイスマッパーに対して高いスピードと密度を提供します。
7.1.3.1. ノードの退避
マスターインスタンスからか、またはクラスター管理者として、ノードからの Pod の退避を許可し、そのノードでの他の Pod のスケジューリングを無効にします。
$ NODE=ose-app-node01.example.com $ oc adm manage-node ${NODE} --schedulable=false NAME STATUS AGE VERSION ose-app-node01.example.com Ready,SchedulingDisabled 20m v1.6.1+5115d708d7 $ oc adm drain ${NODE} --ignore-daemonsets node "ose-app-node01.example.com" already cordoned pod "perl-1-build" evicted pod "perl-1-3lnsh" evicted pod "perl-1-9jzd8" evicted node "ose-app-node01.example.com" drained
注記移行されないローカルボリュームでコンテナーが実行されている場合には、以下のコマンドを実行します。
oc adm drain ${NODE} --ignore-daemonsets --delete-local-data
ノード上の Pod を一覧表示し、それらが削除されていることを確認します。
$ oc adm manage-node ${NODE} --list-pods Listing matched pods on node: ose-app-node01.example.com NAME READY STATUS RESTARTS AGE
Pod またはノードの退避またはドレイン (解放) についての詳細は、「ノードの保守」を参照してください。
コンテナーが現時点でインスタンス上で実行されていない状態で、
docker
およびatomic-openshift-node service
サービスを停止します。# systemctl stop docker atomic-openshift-node
ボリュームグループの名前、論理グループ名、および物理ボリューム名を確認します。
# vgs VG #PV #LV #SN Attr VSize VFree docker_vol 1 1 0 wz--n- <25.00g 15.00g # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert dockerlv docker_vol -wi-ao---- <10.00g # lvremove /dev/docker_vol/docker-pool -y # vgremove docker_vol -y # pvs PV VG Fmt Attr PSize PFree /dev/xvdb1 docker_vol lvm2 a-- <25.00g 15.00g # pvremove /dev/xvdb1 -y # rm -Rf /var/lib/docker/* # rm -f /etc/sysconfig/docker-storage
docker-storage-setup
ファイルをSTORAGE_DRIVER
を指定するように変更します。注記システムが Red Hat Enterprise Linux バージョン 7.3 から 7.4 にアップグレードする際に、
docker
サービスは/var
を extfs のSTORAGE_DRIVER
と共に使用しようとします。ただし、extfs をSTORAGE_DRIVER
として使用するとエラーが発生します。このエラーについての詳細は、以下のバグを参照してください。DEVS=/dev/xvdb VG=docker_vol DATA_SIZE=95%VG STORAGE_DRIVER=overlay2 CONTAINER_ROOT_LV_NAME=dockerlv CONTAINER_ROOT_LV_MOUNT_PATH=/var/lib/docker CONTAINER_ROOT_LV_SIZE=100%FREE
ストレージをセットアップします。
# docker-storage-setup
docker
およびatomic-openshift-node
サービスを起動します。# systemctl start docker atomic-openshift-node
使用するストレージを
overlay2
に変更して、新しく入ってくる Pod を受け入れられるようにノードをスケジュール可能な状態にします。マスターインスタンスから、またはクラスター管理者として以下を実行します。
$ oc adm manage-node ${NODE} --schedulable=true ose-master01.example.com Ready,SchedulingDisabled 24m v1.6.1+5115d708d7 ose-master02.example.com Ready,SchedulingDisabled 24m v1.6.1+5115d708d7 ose-master03.example.com Ready,SchedulingDisabled 24m v1.6.1+5115d708d7 ose-infra-node01.example.com Ready 24m v1.6.1+5115d708d7 ose-infra-node02.example.com Ready 24m v1.6.1+5115d708d7 ose-infra-node03.example.com Ready 24m v1.6.1+5115d708d7 ose-app-node01.example.com Ready 24m v1.6.1+5115d708d7 ose-app-node02.example.com Ready 24m v1.6.1+5115d708d7
7.2. Docker 証明書の管理
OpenShift Container Platform 内部レジストリーは Pod として作成されます。ただし、コンテナーは必要な場合は外部レジストリーからプルされます。デフォルトでは、レジストリーは TCP ポート 5000 をリッスンします。レジストリーは TLS 経由でエクスポートされたイメージのセキュリティーを保護するか、またはトラフィックを暗号化せずにレジストリーを実行するオプションを提供します。
Docker は .crt
ファイルを CA 証明書として、.cert
ファイルをクライアント証明書として解釈します。CA 拡張は .crt
である必要があります。
7.2.1. 外部レジストリー用の認証局証明書のインストール
OpenShift Container Platform を外部レジストリーで使用するために、レジストリーの認証局 (CA) 証明書が、レジストリーからイメージをプルできるすべてのノードについて信頼されている必要があります。
Docker のバージョンによっては、Docker レジストリーを信頼するプロセスは異なります。最新バージョンの Docker のルート認証局はシステムのデフォルトにマージされています。docker
バージョン 1.13 よりも前のバージョンでは、システムのデフォルト証明書は他のカスタムルート証明書が存在しない場合にのみ使用されます。
手順
CA 証明書を
/etc/pki/ca-trust/source/anchors/
にコピーします。$ sudo cp myregistry.example.com.crt /etc/pki/ca-trust/source/anchors/
CA 証明書を展開し、信頼される認証局の一覧に追加します。
$ sudo update-ca-trust extract
openssl
コマンドを使用して SSL 証明書を確認します。$ openssl verify myregistry.example.com.crt myregistry.example.com.crt: OK
証明書が配置され、信頼が更新されたら、
docker
サービスを再起動して新規証明書が適切に設定されていることを確認します。$ sudo systemctl restart docker.service
Docker バージョンの 1.13 よりも前のバージョンの場合は、認証局を信頼するために以下の追加の手順を実行します。
すべてのノードで、ディレクトリーの名前が Docker レジストリーのホスト名となっている新規ディレクトリーを
/etc/docker/certs.d
に作成します。$ sudo mkdir -p /etc/docker/certs.d/myregistry.example.com
注記ポート番号は、Docker レジストリーがポート番号なしにアクセスできない場合を除き不要です。ポートを元の Docker レジストリーにポイントするには、以下を使用します。
myregistry.example.com:port
Docker レジストリーに IP アドレス経由でアクセスするには、ディレクトリーの名前が Docker レジストリーの IP である新規ディレクトリーを、すべてのノードの
/etc/docker/certs.d
内に作成する必要があります。$ sudo mkdir -p /etc/docker/certs.d/10.10.10.10
CA 証明書を直前の手順で新たに作成された Docker ディレクトリーにコピーします。
$ sudo cp myregistry.example.com.crt \ /etc/docker/certs.d/myregistry.example.com/ca.crt $ sudo cp myregistry.example.com.crt /etc/docker/certs.d/10.10.10.10/ca.crt
証明書がコピーされた後に、
docker
サービスを再起動して新規証明書が使用されていることを確認します。$ sudo systemctl restart docker.service
7.2.2. Docker 証明書のバックアップ
ノードホストのバックアップの実行時に、外部レジストリーの証明書を組み込みます。
手順
/etc/docker/certs.d
を使用している場合、ディレクトリーに含まれるすべての証明書をコピーし、ファイルを保存します。$ sudo tar -czvf docker-registry-certs-$(hostname)-$(date +%Y%m%d).tar.gz /etc/docker/certs.d/
システムの信頼を使用する場合、証明書をシステムの信頼内に追加する前に保存します。保存が完了したら、
trust
コマンドを使用して復元するために証明書を展開します。システム信頼の CA を特定し、pkcs11
ID を書き留めておきます。$ trust list ...[OUTPUT OMMITED]... pkcs11:id=%a5%b3%e1%2b%2b%49%b6%d7%73%a1%aa%94%f5%01%e7%73%65%4c%ac%50;type=cert type: certificate label: MyCA trust: anchor category: authority ...[OUTPUT OMMITED]...
pem
形式の証明書を展開し、これに名前を指定します (例:myca.crt
)。$ trust extract --format=pem-bundle \ --filter="%a5%b3%e1%2b%2b%49%b6%d7%73%a1%aa%94%f5%01%e7%73%65%4c%ac%50;type=cert" myca.crt
証明書が
openssl
で適切に展開されていることを確認します。$ openssl verify myca.crt
- 必要なすべての証明書についてこの手順を繰り返し、ファイルをリモートの場所に保存します。
7.2.3. Docker 証明書の復元
外部レジストリー用の Docker 証明書が削除されるか、または破損している場合、復元メカニズムでは先に実行されたバックアップのファイルを使用して、インストール方法と同じ手順を使用します。
7.3. Docker レジストリーの管理
OpenShift Container Platform を、外部 docker
レジストリーを使用してイメージをプルできるように設定できます。ただし、設定ファイルを使用して特定のイメージまたはレジストリーを許可したり、拒否したりすることもできます。
外部レジストリーがネットワークトラフィックの証明書を使用して公開される場合、これにはセキュアなレジストリーとしての名前を付けることができます。そうしない場合には、レジストリーとホスト間のトラフィックはプレーンなテキストで行われ、暗号化されないため、これが非セキュアなレジストリーになります。
7.3.1. Docker search の外部レジストリー
デフォルトで、docker
デーモンにはイメージを任意のレジストリーからプルできる機能がありますが、検索操作は docker.io/
および registry.access.redhat.com
に対して実行されます。デーモンは、--add-registry
オプションを docker
デーモンに指定してイメージを他のレジストリーから検索できるように設定できます。
Red Hat Registry registry.access.redhat.com
からイメージを検索する機能はデフォルトで Red Hat Enterprise Linux docker
パッケージにあります。
手順
ユーザーが
docker search
に他のレジストリーを指定してイメージを検索できるようにするには、それらのレジストリーをregistries
パラメーターの下の/etc/containers/registries.conf
ファイルに追加します。registries: - registry.access.redhat.com - my.registry.example.com
OpenShift Container Platform バージョン 3.6 よりも前のバージョンでは、これは
/etc/sysconfig/docker
に以下のオプションを指定して実行されました。ADD_REGISTRY="--add-registry=registry.access.redhat.com --add-registry=my.registry.example.com"
最初に追加されるレジストリーが最初に検索されるレジストリーになります。
docker
デーモンを再起動し、my.registry.example.com
の使用を許可します。$ sudo systemctl restart docker.service
docker
デーモンの再起動により、docker
コンテナーが再起動します。Ansible インストーラーを使用する場合、これは Ansible ホストファイルの
openshift_docker_additional_registries
変数を使用して設定できます。openshift_docker_additional_registries=registry.access.redhat.com,my.registry.example.com
7.3.2. Docker 外部レジストリーのホワイトリストおよびブラックリスト
Docker は、registries
および block_registries
フラグを docker
デーモンに設定して、外部レジストリーからの操作をブロックするように設定できます。
手順
許可されるレジストリーを
registries
フラグの付いた/etc/containers/registries.conf
ファイルに追加します。registries: - registry.access.redhat.com - my.registry.example.com
3.6 よりも前のバージョンでは、
/etc/sysconfig/docker
ファイルが代わりに変更されます。ADD_REGISTRY="--add-registry=registry.access.redhat.com --add-registry=my.registry.example.com"
注記docker.io
レジストリーは同じ方法で追加できます。残りのレジストリーをブロックします。
block_registries: - all
古いバージョンの残りのレジストリーをブロックします。
BLOCK_REGISTRY='--block-registry=all'
docker
デーモンを再起動します。$ sudo systemctl restart docker.service
docker
デーモンの再起動により、docker
コンテナーが再起動します。この例では、
docker.io
レジストリーがブラックリストに入れられているため、そのレジストリーに関連するすべての操作が失敗します。$ sudo docker pull hello-world Using default tag: latest Trying to pull repository registry.access.redhat.com/hello-world ... Trying to pull repository my.registry.example.com/hello-world ... Trying to pull repository registry.access.redhat.com/hello-world ... unknown: Not Found $ sudo docker pull docker.io/hello-world Using default tag: latest Trying to pull repository docker.io/library/hello-world ... All endpoints blocked.
ファイルを再び変更し、サービスを再起動して
docker.io
をregistries
変数に追加します。registries: - registry.access.redhat.com - my.registry.example.com - docker.io block_registries: - all
または、以下のようにします。
ADD_REGISTRY="--add-registry=registry.access.redhat.com --add-registry=my.registry.example.com --add-registry=docker.io" BLOCK_REGISTRY='--block-registry=all'
Docker サービスを再起動します。
$ sudo systemctl restart docker
イメージがプルできる状態であることを確認するには、以下を実行します。
$ sudo docker pull docker.io/hello-world Using default tag: latest Trying to pull repository docker.io/library/hello-world ... latest: Pulling from docker.io/library/hello-world 9a0669468bf7: Pull complete Digest: sha256:0e06ef5e1945a718b02a8c319e15bae44f47039005530bc617a5d071190ed3fc
外部レジストリーを使用する必要がある場合 (レジストリーを使用する必要のあるすべてのノードホストの
docker
デーモン設定ファイルを変更する場合など)、これらのノードでブラックリストを作成し、悪意あるコンテナーが実行されるのを防ぐことができます。Ansible インストーラーを使用する場合、これは、Ansible ホストファイルの
openshift_docker_additional_registries
およびopenshift_docker_blocked_registries
変数を使用して設定できます。openshift_docker_additional_registries=registry.access.redhat.com,my.registry.example.com openshift_docker_blocked_registries=all
7.3.3. セキュアなレジストリー
イメージを外部レジストリーからプルできるようにするには、レジストリー証明書を信頼できる必要があります。そうでない場合には、イメージのプル操作は失敗します。
これを実行する場合、「外部レジストリーの認証局証明書のインストール」のセクションを参照してください。
ホワイトリストを使用する場合、外部レジストリーは上記のようにregistries
変数に追加されるはずです。
7.3.4. 非セキュアなレジストリー
信頼されていない証明書を使用する外部レジストリー、または証明書がまったく使用されない外部レジストリーは使用しないでください。
ただし、非セキュアなレジストリーは、docker
デーモンがリポジトリーからイメージをプルできるように --insecure-registry
オプションを使用して追加する必要があります。これは --add-registry
オプションと同じですが、docker
操作については検証されていません。
レジストリーはこれらの両方のオプションを使用して追加される必要があります。これにより、検索が可能になり、ブラックリストがある場合はイメージのプルなどの他の操作を実行することができます。
テストとして、以下に localhost
の非セキュアなレジストリーを追加する方法についての例を示します。
手順
/etc/containers/registries.conf
設定ファイルを localhost の非セキュアなレジストリーを追加するように変更します。registries: - registry.access.redhat.com - my.registry.example.com - docker.io insecure_registries: - localhost:5000 block_registries: - all
3.6 よりも前のバージョンの場合、
/etc/sysconfig/docker
設定ファイルを変更して localhost を追加します。ADD_REGISTRY="--add-registry=registry.access.redhat.com --add-registry=my.registry.example.com --add-registry=docker.io --add-registry=localhost:5000" INSECURE_REGISTRY="--insecure-registry=localhost:5000" BLOCK_REGISTRY='--block-registry=all'
docker
デーモンを再起動してレジストリーを使用します。$ sudo systemctl restart docker.service
docker
デーモンを再起動することにより、docker
コンテナーが再起動されます。Docker レジストリー Pod を
localhost
で実行します。$ sudo docker run -p 5000:5000 registry:2
イメージをプルします。
$ sudo docker pull openshift/hello-openshift
イメージにタグを付けます。
$ sudo docker tag docker.io/openshift/hello-openshift:latest localhost:5000/hello-openshift-local:latest
イメージをローカルレジストリーにプッシュします。
$ sudo docker push localhost:5000/hello-openshift-local:latest
Ansible インストーラーを使用する場合、これは、
Ansible
ホストファイルのopenshift_docker_additional_registries
、openshift_docker_blocked_registries
、およびopenshift_docker_insecure_registries
変数を使用して設定できます。openshift_docker_additional_registries=registry.access.redhat.com,my.registry.example.com,localhost:5000 openshift_docker_insecure_registries=localhost:5000 openshift_docker_blocked_registries=all
注記ホストの IP アドレスに
openshift_docker_insecure_registries
変数も設定できます。0.0.0.0/0
は有効な設定ではありません。
7.3.5. 認証済みレジストリー
認証済みのレジストリーを docker
で使用するには、docker
デーモンがレジストリーにログインする必要があります。OpenShift Container Platform の場合、ユーザーはホストで docker login
コマンドを実行できないため、異なる手順セットを実行する必要があります。認証済みのレジストリーはユーザーがプルできるイメージや外部レジストリーにアクセスできるユーザーを制限するために使用できます。
外部 docker
レジストリーに認証が必要な場合は、レジストリーを使用するプロジェクトで特殊なシークレットを作成してから、そのシークレットを使用して docker
操作を実行します。
手順
ユーザーが
docker
レジストリーにログインするプロジェクトでdockercfg
シークレットを作成します。$ oc project <my_project> $ oc create secret docker-registry <my_registry> --docker-server=<my.registry.example.com> --docker-username=<username> --docker-password=<my_password> --docker-email=<me@example.com>
.dockercfg
ファイルが存在する場合、oc
コマンドを使用してシークレットを作成します。$ oc create secret generic <my_registry> --from-file=.dockercfg=<path/to/.dockercfg> --type=kubernetes.io/dockercfg
$HOME/.docker/config.json
ファイルを設定します。$ oc create secret generic <my_registry> --from-file=.dockerconfigjson=<path/to/.dockercfg> --type=kubernetes.io/dockerconfigjson
dockercfg
を使用し、シークレットをプル操作を実行するサービスアカウントにリンクして、イメージを認証済みレジストリーからプルします。イメージをプルするためのデフォルトのサービスアカウント名はdefault
です。$ oc secrets link default <my_registry> --for=pull
S2I 機能を使用してイメージをプッシュする場合、
dockercfg
シークレットは S2I Pod にマウントされるため、これをビルドを実行する適切なサービスアカウントにリンクする必要があります。イメージをビルドするために使用されるデフォルトのサービスアカウントの名前はbuilder
です。$ oc secrets link builder <my_registry>
buildconfig
では、シークレットをプッシュまたはプル操作用に指定する必要があります。"type": "Source", "sourceStrategy": { "from": { "kind": "DockerImage", "name": "*my.registry.example.com*/myproject/myimage:stable" }, "pullSecret": { "name": "*mydockerregistry*" }, ...[OUTPUT ABBREVIATED]... "output": { "to": { "kind": "DockerImage", "name": "*my.registry.example.com*/myproject/myimage:latest" }, "pushSecret": { "name": "*mydockerregistry*" }, ...[OUTPUT ABBREVIATED]...
外部レジストリーが認証を外部サービスに委任する場合は、レジストリー URL を使用するレジストリー用のシークレットと、独自の URL を使用する外部の認証システム用の両方の
dockercfg
シークレットを作成します。これら両方のシークレットをサービスアカウントに追加する必要があります。$ oc project <my_project> $ oc create secret docker-registry <my_registry> --docker-server=*<my_registry_example.com> --docker-username=<username> --docker-password=<my_password> --docker-email=<me@example.com> $ oc create secret docker-registry <my_docker_registry_ext_auth> --docker-server=<my.authsystem.example.com> --docker-username=<username> --docker-password=<my_password> --docker-email=<me@example.com> $ oc secrets link default <my_registry> --for=pull $ oc secrets link default <my_docker_registry_ext_auth> --for=pull $ oc secrets link builder <my_registry> $ oc secrets link builder <my_docker_registry_ext_auth>
7.3.6. ImagePolicy 受付プラグイン
受付制御プラグインは API への要求をインターセプトし、設定されているルールに応じてチェックを実行し、それらのルールに基づいて特定のアクションを許可したり、拒否したりします。OpenShift Container Platform は、「ImagePolicy
受付プラグイン」を使用して、この環境で実行されている、許可済みのイメージを制限できます。以下を制御できます。
- イメージのソース: イメージのプルに使用できるレジストリー
- イメージの解決: イメージが再タグ付けによって変更されないよう、イミュータブルなダイジェストによる Pod の実行を強制する。
- コンテナーイメージラベルの制限: イメージに特定のラベルを持たせるか、または持たせないよう強制する。
- イメージアノテーションの制限: 統合コンテナーレジストリーのイメージに特定のアノテーションを持たせるか、または持たせないよう強制する。
現時点で、ImagePolicy
受付プラグインはベータ版とみなされています。
手順
ImagePolicy
プラグインが有効にされている場合、これを、すべてのマスターノードで/etc/origin/master/master-config.yaml
ファイルを変更して使用される外部レジストリーを許可するように変更する必要があります。admissionConfig: pluginConfig: openshift.io/ImagePolicy: configuration: kind: ImagePolicyConfig apiVersion: v1 executionRules: - name: allow-images-from-other-registries onResources: - resource: pods - resource: builds matchRegistries: - docker.io - <my.registry.example.com> - registry.access.redhat.com
注記ImagePolicy
を有効にすることにより、ユーザーはアプリケーションを使用する際にレジストリーを指定する必要があります (oc new-app kubernetes/guestbook
ではなくoc new-app docker.io/kubernetes/guestbook
とするなど)。そうしないと、失敗が生じます。インストール時に受付プラグインを有効にするには、
openshift_master_admission_plugin_config
変数を、すべてのpluginConfig
設定を含むjson
でフォーマットされた文字列と共に使用できます。openshift_master_admission_plugin_config={"openshift.io/ImagePolicy":{"configuration":{"kind":"ImagePolicyConfig","apiVersion":"v1","executionRules":[{"name":"allow-images-from-other-registries","onResources":[{"resource":"pods"},{"resource":"builds"}],"matchRegistries":["docker.io","*my.registry.example.com*","registry.access.redhat.com"]}]}}}
警告現時点で、OpenShift Container Platform 3.6.1 で修正される必要のある 1 つの問題があります。これは、
ImagePolicy
Pod はデフォルトテンプレートを使用してデプロイできず、以下のエラーメッセージを出す問題です。Failed create | Error creating: Pod "" is invalid: spec.containers[0].\image: Forbidden: this image is prohibited by policy
この回避策については、「Image Policy is not working as expected」という Red Hat ナレッジベースアーティクルを参照してください。
7.3.7. イメージの外部レジストリーからのインポート
アプリケーション開発者は oc import-image
コマンドでイメージをインポートして imagestreams
を作成でき、OpenShift Container Platform は外部レジストリーからのイメージインポートを許可または拒否するように設定できます。
手順
ユーザーがイメージをインポートできる許可されたレジストリーを設定するには、以下を
/etc/origin/master/master-config.yaml
ファイルに追加します。imagePolicyConfig: allowedRegistriesForImport: - domainName: docker.io - domainName: '\*.docker.io' - domainName: '*.redhat.com' - domainName: 'my.registry.example.com'
- イメージを外部認証レジストリーからインポートするには、必要なプロジェクト内にシークレットを作成します。
推奨されていない場合でも、外部の認証済みレジストリーが非セキュアであるか、または証明書が信頼できない場合には、
oc import-image
コマンドを--insecure=true
オプションを指定して使用できます。外部の認証済みレジストリーがセキュアな場合、レジストリー証明書は、以下のようにレジストリーのインポートコントローラーを実行する際にマスターホストで信頼される必要があります。
/etc/pki/ca-trust/source/anchors/
の証明書をコピーします。$ sudo cp <my.registry.example.com.crt> /etc/pki/ca-trust/source/anchors/<my.registry.example.com.crt>
update-ca-trust
コマンドを実行します。$ sudo update-ca-trust
すべてのマスターホストでマスターサービスを再起動します。
$ sudo master-restart api $ sudo master-restart controllers
外部レジストリーの証明書は OpenShift Container Platform レジストリーで信頼されます。
$ for i in pem openssl java; do oc create configmap ca-trust-extracted-${i} --from-file /etc/pki/ca-trust/extracted/${i} oc set volume dc/docker-registry --add -m /etc/pki/ca-trust/extracted/${i} --configmap-name=ca-trust-extracted-${i} --name ca-trust-extracted-${i} done
警告現時点で、証明書をレジストリー Pod に追加するための正式な手順はありませんが、上記の回避策を使用できます。
この回避策では、これらのコマンドを実行するシステムですべての信頼される証明書を使って
configmaps
を作成するため、必要な証明書のみが信頼されるクリーンなシステムからこれを実行することが推奨されます。または、以下のように
Dockerfile
を使用して、イメージを再ビルドするために適切な証明書を信頼できるようレジストリーイメージを変更します。FROM registry.access.redhat.com/openshift3/ose-docker-registry:v3.6 ADD <my.registry.example.com.crt> /etc/pki/ca-trust/source/anchors/ USER 0 RUN update-ca-trust extract USER 1001
イメージを再ビルドし、これを
docker
レジストリーにプッシュし、そのイメージをレジストリーdeploymentconfig
のspec.template.spec.containers["name":"registry"].image
として使用します。$ oc patch dc docker-registry -p '{"spec":{"template":{"spec":{"containers":[{"name":"registry","image":"*myregistry.example.com/openshift3/ose-docker-registry:latest*"}]}}}}'
imagePolicyConfig
設定をインストールに追加するには、openshift_master_image_policy_config
変数を、以下のようにすべての imagePolicyConfig
設定を含む json
でフォーマットされた文字列で使用できます。
openshift_master_image_policy_config={"imagePolicyConfig":{"allowedRegistriesForImport":[{"domainName":"docker.io"},{"domainName":"\*.docker.io"},{"domainName":"*.redhat.com"},{"domainName":"*my.registry.example.com*"}]}}
ImagePolicy
についての詳細は、「ImagePolicy
受付プラグイン」のセクションを参照してください。
7.3.8. OpenShift Container Platform レジストリーの統合
OpenShift Container Platform をスタンドアロンのコンテナーレジストリーとしてインストールし、レジストリー機能のみを提供できるようにすることができます。これには、OpenShift Container Platform プラットフォームを実行するようにこのレジストリーを使用できる利点があります。
OpenShift Container Platform レジストリーについての詳細は、「OpenShift Container レジストリーのスタンドアロンデプロイメントのインストール」を参照してください。
OpenShift Container Platform レジストリーを有効にするには、直前のすべてのセクションが適用されます。OpenShift Container Platform の観点では、このスタンドアロンの OpenShift Container レジストリーは外部レジストリーとして処理されますが、これはマルチテナントレジストリーであり、OpenShift Container Platform の承認モデルが使用されるため、いくつかの追加タスクが必要になります。このレジストリーは新規プロジェクトを独自の環境に作成するのではなく、これが通信するよう設定された OpenShift Container Platform 内に作成するため、作成されるすべてのプロジェクトに影響を与えます。
7.3.8.1. レジストリープロジェクトのクラスターへの接続
レジストリーはレジストリー Pod と Web インターフェースを含む完全な OpenShift Container Platform 環境であるため、レジストリーに新規プロジェクトを作成するプロセスは、oc new-project
または oc create
コマンドラインを使用して実行されるか、または Web インターフェースを使って実行されます。
プロジェクトが作成されると、通常のサービスアカウント (builder
、default
、および deployer
) が自動的に作成され、プロジェクト管理者ユーザーにはパーミッションが付与されます。「匿名」ユーザーを含め、異なるユーザーにイメージをプッシュ/プルする権限を付与できます。
すべてのユーザーがレジストリー内の新規プロジェクトからイメージをプルできるようにするなどのいくつかのユースケースがありますが、OpenShift Container Platform とレジストリー間に 1:1 の関係を持たせることを希望している場合で、ユーザーが特定のプロジェクトからイメージのプッシュおよびプルを実行できるようにする場合には、いくつかの手順を実行する必要があります。
レジストリー Web コンソールはプル/プッシュ操作に使用されるトークンを表示しますが、ここに表示されるトークンはセッショントークンであるため、期限切れになります。特定のパーミッションを持つサービスアカウントを作成することにより、管理者はサービスアカウントのパーミッションを制限することができ、たとえばイメージのプッシュ/プルに異なるサービスアカウントを使用できるようにできます。その後はサービスアカウントトークンの期限切れが生じなくなるため、トークンの期限切れ、シークレットの再作成その他のタスクについて設定する必要がなくなります。
手順
新規プロジェクトを作成します。
$ oc new-project <my_project>
レジストリープロジェクトを作成します。
$ oc new-project <registry_project>
サービスアカウントをレジストリープロジェクトに作成します。
$ oc create serviceaccount <my_serviceaccount> -n <registry_project>
registry-editor
ロールを使用してイメージのプッシュおよびプルのパーミッションを付与します。$ oc adm policy add-role-to-user registry-editor -z <my_serviceaccount> -n <registry_project>
プルパーミッションのみが必要な場合、
registry-viewer
ロールを使用できます。サービスアカウントトークンを取得します。
$ TOKEN=$(oc sa get-token <my_serviceaccount> -n <registry_project>)
トークンをパスワードとして使用し、
dockercfg
シークレットを作成します。$ oc create secret docker-registry <my_registry> \ --docker-server=<myregistry.example.com> --docker-username=<notused> --docker-password=${TOKEN} --docker-email=<me@example.com>
dockercfg
シークレットを使用し、シークレットをプル操作を実行するサービスアカウントにリンクして、イメージをレジストリーからプルします。イメージをプルするためのデフォルトのサービスアカウント名はdefault
です。$ oc secrets link default <my_registry> --for=pull
S2I 機能を使用してイメージをプッシュする場合、
dockercfg
シークレットは S2I Pod にマウントされるため、これをビルドを実行する適切なサービスアカウントにリンクする必要があります。イメージをビルドするために使用されるデフォルトのサービスアカウントの名前はbuilder
です。$ oc secrets link builder <my_registry>
buildconfig
では、シークレットをプッシュまたはプル操作用に指定する必要があります。"type": "Source", "sourceStrategy": { "from": { "kind": "DockerImage", "name": "<myregistry.example.com/registry_project/my_image:stable>" }, "pullSecret": { "name": "<my_registry>" }, ...[OUTPUT ABBREVIATED]... "output": { "to": { "kind": "DockerImage", "name": "<myregistry.example.com/registry_project/my_image:latest>" }, "pushSecret": { "name": "<my_registry>" }, ...[OUTPUT ABBREVIATED]...