検索

第7章 Docker タスク

download PDF

OpenShift Container Platform は Docker を使用して、任意の数のコンテナーで作成される Pod でアプリケーションを実行します。

クラスター管理者は、OpenShift Container Platform インストールの各種の要素を効率的に実行するために Docker に追加の設定を加える必要がある場合があります。

7.1. Docker ストレージの拡張

利用可能なストレージの容量を増やすことにより、停止が発生しない継続的なデプロイメントが可能になります。これを実行するには、適切なサイズの空き容量を含む空きのパーティションが利用可能でなければなりません。

7.1.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.

  2. ノード上の Pod を一覧表示し、それらが削除されていることを確認します。

    $ oc adm manage-node ${NODE} --list-pods
    
    Listing matched pods on node: ose-app-node01.example.com
    
    NAME      READY     STATUS    RESTARTS   AGE
  3. ノードごとに、これまでの 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 インフラストラクチャーによって異なります。

手順
  1. docker および atomic-openshift-node サービスを停止します。

    # systemctl stop docker atomic-openshift-node
  2. 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
  3. Docker サービスを起動します。

    # systemctl start docker
    # vgs
      VG         #PV #LV #SN Attr   VSize  VFree
      docker_vol   2   1   0 wz--n- 64.99g <55.00g
  4. 新規ボリュームグループを作成して 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
  5. ストレージ容量を拡張した状態で、新しく入ってくる 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

新規ディスクによるストレージの拡張

  1. 直前の手順に従って、ノードを退避します。
  2. docker および atomic-openshift-node サービスを停止します。

    # systemctl stop docker atomic-openshift-node
  3. 既存ディスクを必要に応じてサイズ変更します。これは環境に応じて異なります。

    • LVM (Logical Volume Manager) を使用している場合:

    • クラウドプロバイダーを使用している場合は、ディスクの割り当てを解除し、ディスクを破棄してから新規のより大きなディスクを作成し、これをインスタンスに割り当てることができます。
    • クラウド以外の環境の場合、ディスクおよびファイルシステムのサイズは変更することができます。詳細については、以下のソリューションを参照してください。

  4. デバイス名、サイズなどを確認して /etc/sysconfig/container-storage-setup ファイルが新規ディスクに対して適切に設定されていることを確認します。
  5. 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
  6. Docker サービスを起動します。

    # systemctl start docker
    # vgs
      VG         #PV #LV #SN Attr   VSize  VFree
      docker_vol   2   1   0 wz--n- 64.99g <55.00g
  7. atomic-openshift-node サービスを起動します。

    # systemctl start atomic-openshift-node

7.1.3. ストレージバックエンドの変更

サービスおよびファイルシステムの機能拡張に応じて、新規機能を使用できるようにストレージバックエンドの変更が必要になる場合があります。以下の手順では、デバイスマッパーのバックエンドを overlay2 ストレージのバックエンドに変更する例について示しています。overlay2 は従来のデバイスマッパーに対して高いスピードと密度を提供します。

7.1.3.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

  2. ノード上の Pod を一覧表示し、それらが削除されていることを確認します。

    $ oc adm manage-node ${NODE} --list-pods
    
    Listing matched pods on node: ose-app-node01.example.com
    
    NAME      READY     STATUS    RESTARTS   AGE

    Pod またはノードの退避またはドレイン (解放) についての詳細は、「ノードの保守」を参照してください。

  3. コンテナーが現時点でインスタンス上で実行されていない状態で、docker および atomic-openshift-node service サービスを停止します。

    # systemctl stop docker atomic-openshift-node
  4. ボリュームグループの名前、論理グループ名、および物理ボリューム名を確認します。

    # 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
  5. 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
  6. ストレージをセットアップします。

    # docker-storage-setup
  7. docker および atomic-openshift-node サービスを起動します。

    # systemctl start docker atomic-openshift-node
  8. 使用するストレージを 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 よりも前のバージョンでは、システムのデフォルト証明書は他のカスタムルート証明書が存在しない場合にのみ使用されます。

手順
  1. CA 証明書を /etc/pki/ca-trust/source/anchors/ にコピーします。

    $ sudo cp myregistry.example.com.crt /etc/pki/ca-trust/source/anchors/
  2. CA 証明書を展開し、信頼される認証局の一覧に追加します。

    $ sudo update-ca-trust extract
  3. openssl コマンドを使用して SSL 証明書を確認します。

    $ openssl verify myregistry.example.com.crt
    myregistry.example.com.crt: OK
  4. 証明書が配置され、信頼が更新されたら、docker サービスを再起動して新規証明書が適切に設定されていることを確認します。

    $ sudo systemctl restart docker.service

Docker バージョンの 1.13 よりも前のバージョンの場合は、認証局を信頼するために以下の追加の手順を実行します。

  1. すべてのノードで、ディレクトリーの名前が Docker レジストリーのホスト名となっている新規ディレクトリーを /etc/docker/certs.d に作成します。

    $ sudo mkdir -p /etc/docker/certs.d/myregistry.example.com
    注記

    ポート番号は、Docker レジストリーがポート番号なしにアクセスできない場合を除き不要です。ポートを元の Docker レジストリーにポイントするには、以下を使用します。myregistry.example.com:port

  2. Docker レジストリーに IP アドレス経由でアクセスするには、ディレクトリーの名前が Docker レジストリーの IP である新規ディレクトリーを、すべてのノードの /etc/docker/certs.d 内に作成する必要があります。

    $ sudo mkdir -p /etc/docker/certs.d/10.10.10.10
  3. 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
  4. 証明書がコピーされた後に、docker サービスを再起動して新規証明書が使用されていることを確認します。

    $ sudo systemctl restart docker.service

7.2.2. Docker 証明書のバックアップ

ノードホストのバックアップの実行時に、外部レジストリーの証明書を組み込みます。

手順
  1. /etc/docker/certs.d を使用している場合、ディレクトリーに含まれるすべての証明書をコピーし、ファイルを保存します。

    $ sudo tar -czvf docker-registry-certs-$(hostname)-$(date +%Y%m%d).tar.gz /etc/docker/certs.d/
  2. システムの信頼を使用する場合、証明書をシステムの信頼内に追加する前に保存します。保存が完了したら、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]...
  3. 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
  4. 証明書が openssl で適切に展開されていることを確認します。

    $ openssl verify myca.crt
  5. 必要なすべての証明書についてこの手順を繰り返し、ファイルをリモートの場所に保存します。

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 パッケージにあります。

手順
  1. ユーザーが 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"

    最初に追加されるレジストリーが最初に検索されるレジストリーになります。

  2. docker デーモンを再起動し、my.registry.example.com の使用を許可します。

    $ sudo systemctl restart docker.service

    docker デーモンの再起動により、docker コンテナーが再起動します。

  3. 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 デーモンに設定して、外部レジストリーからの操作をブロックするように設定できます。

手順
  1. 許可されるレジストリーを 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 レジストリーは同じ方法で追加できます。

  2. 残りのレジストリーをブロックします。

    block_registries:
       - all
  3. 古いバージョンの残りのレジストリーをブロックします。

    BLOCK_REGISTRY='--block-registry=all'
  4. docker デーモンを再起動します。

    $ sudo systemctl restart docker.service

    docker デーモンの再起動により、docker コンテナーが再起動します。

  5. この例では、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.ioregistries 変数に追加します。

    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'
  6. Docker サービスを再起動します。

    $ sudo systemctl restart docker
  7. イメージがプルできる状態であることを確認するには、以下を実行します。

    $ 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
  8. 外部レジストリーを使用する必要がある場合 (レジストリーを使用する必要のあるすべてのノードホストの 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 の非セキュアなレジストリーを追加する方法についての例を示します。

手順
  1. /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'
  2. docker デーモンを再起動してレジストリーを使用します。

    $ sudo systemctl restart docker.service

    docker デーモンを再起動することにより、docker コンテナーが再起動されます。

  3. Docker レジストリー Pod を localhost で実行します。

    $ sudo docker run -p 5000:5000 registry:2
  4. イメージをプルします。

    $ sudo docker pull openshift/hello-openshift
  5. イメージにタグを付けます。

    $ sudo docker tag docker.io/openshift/hello-openshift:latest localhost:5000/hello-openshift-local:latest
  6. イメージをローカルレジストリーにプッシュします。

    $ sudo docker push localhost:5000/hello-openshift-local:latest
  7. Ansible インストーラーを使用する場合、これは、Ansible ホストファイルの openshift_docker_additional_registriesopenshift_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 操作を実行します。

手順
  1. ユーザーが 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>
  2. .dockercfg ファイルが存在する場合、oc コマンドを使用してシークレットを作成します。

    $ oc create secret generic <my_registry> --from-file=.dockercfg=<path/to/.dockercfg> --type=kubernetes.io/dockercfg
  3. $HOME/.docker/config.json ファイルを設定します。

    $ oc create secret generic <my_registry> --from-file=.dockerconfigjson=<path/to/.dockercfg> --type=kubernetes.io/dockerconfigjson
  4. dockercfg を使用し、シークレットをプル操作を実行するサービスアカウントにリンクして、イメージを認証済みレジストリーからプルします。イメージをプルするためのデフォルトのサービスアカウント名は default です。

    $ oc secrets link default <my_registry> --for=pull
  5. S2I 機能を使用してイメージをプッシュする場合、dockercfg シークレットは S2I Pod にマウントされるため、これをビルドを実行する適切なサービスアカウントにリンクする必要があります。イメージをビルドするために使用されるデフォルトのサービスアカウントの名前は builder です。

    $ oc secrets link builder <my_registry>
  6. 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]...
  7. 外部レジストリーが認証を外部サービスに委任する場合は、レジストリー 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 受付プラグインはベータ版とみなされています。

手順
  1. 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 とするなど)。そうしないと、失敗が生じます。

  2. インストール時に受付プラグインを有効にするには、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 は外部レジストリーからのイメージインポートを許可または拒否するように設定できます。

手順
  1. ユーザーがイメージをインポートできる許可されたレジストリーを設定するには、以下を /etc/origin/master/master-config.yaml ファイルに追加します。

    imagePolicyConfig:
      allowedRegistriesForImport:
      - domainName: docker.io
      - domainName: '\*.docker.io'
      - domainName: '*.redhat.com'
      - domainName: 'my.registry.example.com'
  2. イメージを外部認証レジストリーからインポートするには、必要なプロジェクト内にシークレットを作成します。
  3. 推奨されていない場合でも、外部の認証済みレジストリーが非セキュアであるか、または証明書が信頼できない場合には、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>
  4. update-ca-trust コマンドを実行します。

    $ sudo update-ca-trust
  5. すべてのマスターホストでマスターサービスを再起動します。

    $ sudo master-restart api
    $ sudo master-restart controllers
  6. 外部レジストリーの証明書は 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 を作成するため、必要な証明書のみが信頼されるクリーンなシステムからこれを実行することが推奨されます。

  7. または、以下のように 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
  8. イメージを再ビルドし、これを docker レジストリーにプッシュし、そのイメージをレジストリー deploymentconfigspec.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 インターフェースを使って実行されます。

プロジェクトが作成されると、通常のサービスアカウント (builderdefault、および deployer) が自動的に作成され、プロジェクト管理者ユーザーにはパーミッションが付与されます。「匿名」ユーザーを含め、異なるユーザーにイメージをプッシュ/プルする権限を付与できます。

すべてのユーザーがレジストリー内の新規プロジェクトからイメージをプルできるようにするなどのいくつかのユースケースがありますが、OpenShift Container Platform とレジストリー間に 1:1 の関係を持たせることを希望している場合で、ユーザーが特定のプロジェクトからイメージのプッシュおよびプルを実行できるようにする場合には、いくつかの手順を実行する必要があります。

警告

レジストリー Web コンソールはプル/プッシュ操作に使用されるトークンを表示しますが、ここに表示されるトークンはセッショントークンであるため、期限切れになります。特定のパーミッションを持つサービスアカウントを作成することにより、管理者はサービスアカウントのパーミッションを制限することができ、たとえばイメージのプッシュ/プルに異なるサービスアカウントを使用できるようにできます。その後はサービスアカウントトークンの期限切れが生じなくなるため、トークンの期限切れ、シークレットの再作成その他のタスクについて設定する必要がなくなります。

手順
  1. 新規プロジェクトを作成します。

    $ oc new-project <my_project>
  2. レジストリープロジェクトを作成します。

    $ oc new-project <registry_project>
  3. サービスアカウントをレジストリープロジェクトに作成します。

    $ oc create serviceaccount <my_serviceaccount> -n <registry_project>
  4. registry-editor ロールを使用してイメージのプッシュおよびプルのパーミッションを付与します。

    $ oc adm policy add-role-to-user registry-editor -z <my_serviceaccount> -n <registry_project>

    プルパーミッションのみが必要な場合、registry-viewer ロールを使用できます。

  5. サービスアカウントトークンを取得します。

    $ TOKEN=$(oc sa get-token <my_serviceaccount> -n <registry_project>)
  6. トークンをパスワードとして使用し、dockercfg シークレットを作成します。

    $ oc create secret docker-registry <my_registry> \
      --docker-server=<myregistry.example.com> --docker-username=<notused> --docker-password=${TOKEN} --docker-email=<me@example.com>
  7. dockercfg シークレットを使用し、シークレットをプル操作を実行するサービスアカウントにリンクして、イメージをレジストリーからプルします。イメージをプルするためのデフォルトのサービスアカウント名は default です。

    $ oc secrets link default <my_registry> --for=pull
  8. S2I 機能を使用してイメージをプッシュする場合、dockercfg シークレットは S2I Pod にマウントされるため、これをビルドを実行する適切なサービスアカウントにリンクする必要があります。イメージをビルドするために使用されるデフォルトのサービスアカウントの名前は builder です。

    $ oc secrets link builder <my_registry>
  9. 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]...
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.