13.6. タグおよびイメージメタデータのインポート
イメージストリームは、外部 Docker イメージレジストリーのイメージリポジトリーからタグおよびイメージメタデータをインポートするように設定できます。これは複数の異なる方法で実行できます。
oc import-image
コマンドで--from
オプションを使用してタグとイメージ情報を手動でインポートできます。$ oc import-image <image_stream_name>[:<tag>] --from=<docker_image_repo> --confirm
以下は例になります。
$ oc import-image my-ruby --from=docker.io/openshift/ruby-20-centos7 --confirm The import completed successfully. Name: my-ruby Created: Less than a second ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2016-05-06T20:59:30Z Docker Pull Spec: 172.30.94.234:5000/demo-project/my-ruby Tag Spec Created PullSpec Image latest docker.io/openshift/ruby-20-centos7 Less than a second ago docker.io/openshift/ruby-20-centos7@sha256:772c5bf9b2d1e8... <same>
また、latest だけではなくイメージのすべてのタグをインポートするには
--all
フラグを追加することもできます。OpenShift Online のほとんどのオブジェクトの場合と同様に、CLI を使用して JSON または YAML 定義を作成し、これをファイルに保存してからオブジェクトを作成できます。
spec.dockerImageRepository
フィールドをイメージの Docker プル仕様に設定します。apiVersion: "v1" kind: "ImageStream" metadata: name: "my-ruby" spec: dockerImageRepository: "docker.io/openshift/ruby-20-centos7"
次にオブジェクトを作成します。
$ oc create -f <file>
外部 Docker レジストリーのイメージを参照するイメージストリームを作成する場合、OpenShift Online は短時間で外部レジストリーと通信し、イメージについての最新情報を取得します。
タグおよびイメージメタデータの同期後に、イメージストリームオブジェクトは以下のようになります。
apiVersion: v1 kind: ImageStream metadata: name: my-ruby namespace: demo-project selflink: /oapi/v1/namespaces/demo-project/imagestreams/my-ruby uid: 5b9bd745-13d2-11e6-9a86-0ada84b8265d resourceVersion: '4699413' generation: 2 creationTimestamp: '2016-05-06T21:34:48Z' annotations: openshift.io/image.dockerRepositoryCheck: '2016-05-06T21:34:48Z' spec: dockerImageRepository: docker.io/openshift/ruby-20-centos7 tags: - name: latest annotations: null from: kind: DockerImage name: 'docker.io/openshift/ruby-20-centos7:latest' generation: 2 importPolicy: { } status: dockerImageRepository: '172.30.94.234:5000/demo-project/my-ruby' tags: - tag: latest items: - created: '2016-05-06T21:34:48Z' dockerImageReference: 'docker.io/openshift/ruby-20-centos7@sha256:772c5bf9b2d1e8e80742ed75aab05820419dc4532fa6d7ad8a1efddda5493dc3' image: 'sha256:772c5bf9b2d1e8e80742ed75aab05820419dc4532fa6d7ad8a1efddda5493dc3' generation: 2
タグおよびイメージメタデータを同期するため、タグをスケジュールに応じて外部レジストリーのクエリーを実行できるよう設定できます。 これは、「タグのイメージストリームへの追加」で説明されているように --scheduled=true
フラグを oc tag
コマンドに設定して実行できます。
または、タグの定義で importPolicy.scheduled
を true に設定することもできます。
apiVersion: v1 kind: ImageStream metadata: name: ruby spec: tags: - from: kind: DockerImage name: openshift/ruby-20-centos7 name: latest importPolicy: scheduled: true
13.6.1. 非セキュアなレジストリーからのイメージのインポート
イメージストリームは、自己署名型の証明書を使って署名されたものを使用する場合や、HTTPS ではなく単純な HTTP を使用する場合など、非セキュアなイメージレジストリーからタグおよびイメージメタデータをインポートするように設定できます。
これを設定するには、openshift.io/image.insecureRepository
アノテーションを追加し、これを true に設定します。この設定はレジストリーへの接続時の証明書の検証をバイパスします。
kind: ImageStream
apiVersion: v1
metadata:
name: ruby
annotations:
openshift.io/image.insecureRepository: "true" 1
spec:
dockerImageRepository: my.repo.com:5000/myimage
- 1
openshift.io/image.insecureRepository
アノテーション true に設定します。
このオプションは統合レジストリーに対して、イメージの提供時にイメージストリームでタグ付けされた外部イメージについて非セキュアなトランスポートにフォールバックするよう指示しますが、これにはリスクが伴います。可能な場合には、istag
にのみ非セキュアのマークを付けてこのリスクを回避します。
13.6.1.1. イメージストリームタグのポリシー
13.6.1.1.1. 非セキュアなタグのインポートポリシー
上記のアノテーションは、特定の ImageStream
のすべてのイメージおよびタグに適用されます。より詳細な制御を実行するために、ポリシーを istags
に設定できます。タグの定義の importPolicy.insecure
を true
に設定すると、このタグ下のイメージについてのみ非セキュアなトランスポートへのフォールバックが許可されます。
特定の istag
下のイメージについてのセキュアでないトランスポートへのフォールバックは、イメージストリームにセキュアでないアノテーションが付けられるか、または istag
にセキュアでないインポートポリシーが設定されている場合に有効になります。importPolicy.insecure`
が false
に設定されていると、イメージストリームのアノテーションは上書きできません。
13.6.1.1.2. 参照ポリシー
参照ポリシーにより、このイメージストリームタグを参照するリソースがどこからイメージをプルするかを指定できます。これはリモートイメージ (外部レジストリーからインポートされるもの) にのみ適用されます。Local
と Source
のオプションから選択できます。
Source
ポリシーはクライアントに対し、イメージのソースレジストリーから直接プルするように指示します。統合レジストリーは、イメージがクラスターによって管理されていない限り使用されません。(これは外部イメージではありません。) これはデフォルトポリシーになります。
Local
ポリシーはクライアントに対し、常に統合レジストリーからプルするように指示します。これは Docker デーモンの設定を変更せずに外部の非セキュアなレジストリーからプルする場合に役立ちます。
このポリシーはイメージストリームタグの使用にのみ適用されます。外部レジストリーの場所を使用してイメージを直接参照したり、プルしたりするコンポーネントまたは操作は内部レジストリーにリダイレクトされません。
プルスルー (pull-through) 機能
このレジストリーの機能はリモートイメージをクライアントに提供します。この機能はデフォルトで有効にされており、ローカルの参照ポリシーが使用されるようにするには有効にされている必要があります。さらにすべての Blob は後のアクセスを速めるためにミラーリングされます。
イメージストリームタグの仕様でポリシーを referencePolicy.type
として設定できます。
ローカル参照ポリシーが設定されたセキュアでないタグの例
kind: ImageStream apiVersion: v1 metadata: name: ruby tags: - from: kind: DockerImage name: my.repo.com:5000/myimage name: mytag importPolicy: insecure: true 1 referencePolicy: type: Local 2
13.6.2. プライベートレジストリーからのイメージのインポート
イメージストリームは、プライベートレジストリーからタグおよびイメージメタデータをインポートするように設定できます。 これには認証が必要です。
これを設定するには、認証情報を保存するために使用されるシークレットを作成する必要があります。oc create secret
コマンドを使用してシークレットを作成する方法については、「Pod が他のセキュアなレジストリーからイメージを参照できるようにする設定」を参照してください。
シークレットが設定されたら、次に新規イメージストリームを作成するか、または oc import-image
コマンドを使用します。インポートプロセスで OpenShift Online はシークレットを取得してリモートパーティーに提供します。
セキュアでないレジストリーからインポートする場合には、シークレットに定義されたレジストリーの URL に :80
ポートのサフィックスを追加するようにしてください。 追加していない場合にレジストリーからインポートしようとすると、このシークレットは使用されません。
13.6.3. 外部レジストリーの信頼される証明書の追加
インポート元となっているレジストリーが標準の認証局で署名されていない証明書を使用している場合、レジストリーの証明書または署名する認証局を信頼するようシステムを明示的に設定する必要があります。これは 、レジストリーインポートコントローラーを実行するホストシステム (通常はマスターノード) に CA 証明書またはレジストリー証明書を追加して実行できます。
証明書または CA 証明書は、ホストシステムの /etc/pki/tls/certs
または /etc/pki/ca-trust
にそれぞれ追加する必要があります。また証明書の変更を反映するには、update-ca-trust
コマンドを Red Hat ディストリビューションで実行して、マスターサービスを再起動する必要があります。
13.6.4. 複数のプロジェクト間でのイメージのインポート
イメージストリームは、異なるプロジェクトから内部レジストリーのタグおよびイメージメタデータをインポートするように設定できます。推奨される方法としては、「タグのイメージストリームへの追加」で説明されている oc tag
コマンドを使用できます。
$ oc tag <source_project>/<image_stream>:<tag> <new_image_stream>:<new_tag>
別の方法として、プル仕様を使用して他のプロジェクトからイメージを手動でインポートすることもできます。
以下の方法は使用しないことを強く推奨します。 この使用は oc tag
を使用するだけでは不十分な場合にのみに使用する必要があります。
最初に、他のプロジェクトにアクセスするために必要なポリシーを追加します。
$ oc policy add-role-to-group \ system:image-puller \ system:serviceaccounts:<destination_project> \ -n <source_project>
これにより、
<destination_project>
が<source_project>
からイメージをプルできます。ポリシーが有効な場合、イメージを手動でインポートできます。
$ oc import-image <new_image_stream> --confirm \ --from=<docker_registry>/<source_project>/<image_stream>
13.6.5. イメージの手動プッシュによるイメージストリームの作成
イメージストリームはイメージを内部レジストリーに手動でプッシュすると自動的に作成されます。これは OpenShift Online 内部レジストリーを使用している場合にのみ可能です。
この手順を実行する前に、以下の条件を満たしている必要があります。
- プッシュ先となる宛先プロジェクトがすでに存在している必要がある。
-
ユーザーはそのプロジェクトで
{get, update} "imagestream/layers"
を実行する権限がある必要があります。さらに、イメージストリームが存在していない場合、ユーザーはそのプロジェクトで{create} "imagestream"
を実行する権限がなければなりません。プロジェクト管理者にはこれらを実行するパーミッションがあります。
system:image-pusher ロールは新規イメージストリームの作成パーミッションを付与せず、既存イメージストリームにイメージをプッシュするパーミッションのみを付与するため、ユーザーに追加パーミッションが付与されない場合、存在していないイメージストリームにイメージをプッシュするためにこのパーミッションを使用することはできません。
イメージを手動でプッシュしてイメージストリームを作成するには、以下を実行します。
- まず、内部レジストリーにログインします。
次に、適切な内部レジストリーの場所を使用してイメージにタグを付けます。たとえば、docker.io/centos:centos7 イメージをローカルにプルしている場合は以下を実行します。
$ docker tag docker.io/centos:centos7 https://registry.<clusterID>.openshift.com
最後に、イメージを内部レジストリーにプッシュします。以下は例になります。
$ docker push https://registry.<clusterID>.openshift.com The push refers to a repository [https://registry.<clusterID>.openshift.com] (len: 1) c8a648134623: Pushed 2bf4902415e3: Pushed latest: digest: sha256:be8bc4068b2f60cf274fc216e4caba6aa845fff5fa29139e6e7497bb57e48d67 size: 6273
- イメージストリームが作成されていることを確認します。
$ oc get is NAME DOCKER REPO TAGS UPDATED my-image 172.30.48.125:5000/test/my-image latest 3 seconds ago