IBM Cloud Docs
アプリ用イメージのビルド

アプリ用イメージのビルド

Docker イメージが、IBM Cloud® Kubernetes Service で作成するすべてのコンテナーの基礎です。

イメージは、Dockerfile (イメージをビルドするための指示が入ったファイル) から作成されます。 Dockerfile の別個に保管されている指示の中で、ビルド成果物 (アプリ、アプリの構成、その従属関係) が参照されることもあります。

IBM Cloud Container Registry イメージから default の Kubernetes 名前空間へのコンテナーのデプロイ

IBM 提供のパブリック・イメージや IBM Cloud Container Registry 名前空間に保管されているプライベート・イメージからクラスターにコンテナーをデプロイできます。 クラスターがレジストリー・イメージにアクセスする方法について詳しくは、IBM Cloud Container Registry からイメージをプルする権限がクラスターに与えられる仕組みについてを参照してください。

始める前に

  1. IBM Cloud Container Registry に名前空間をセットアップして、その名前空間にイメージをプッシュします

  2. クラスターを作成します。

  3. アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  4. <deployment>.yaml という名前のデプロイメント構成ファイルを作成します。

  5. IBM Cloud Container Registry 内の名前空間から使用するイメージおよびデプロイメントを定義します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <deployment>
    spec:
      replicas: <number_of_replicas>
      selector:
        matchLabels:
          app: <app_name>
      template:
        metadata:
          labels:
            app: <app_name>
        spec:
          containers:
          - name: <app_name>
            image: <region>.icr.io/<namespace>/<image>:<tag>
    
    <deployment>
    デプロイメントの名前を指定します。
    <number_of_replicas>
    デプロイメントで作成するレプリカ・ポッドの数を入力します。
    app: <app_name>
    このアプリの名前をコンテナーのラベルとして使用してください。
    name: <app_name>
    コンテナーの名前を指定します。app ラベルの名前などを使用してください。
    image: <region>.icr.io/namespace>/image>:tag>
    イメージの URL の変数は、対象イメージの情報に置き換えます。
    region>: レジストリー・ドメインの地域 IBM Cloud Container Registry API エンドポイント。 ログイン先のリージョンのドメインをリストするには、ibmcloud cr api を実行します。
    namespace>: レジストリー名前空間。 名前空間の情報を取得するには、ibmcloud cr namespace-list を実行します。
    image>:tag>: コンテナーのために使用するイメージとタグ。 レジストリー名前空間で使用できるイメージをリストするには、ibmcloud cr images を実行します。
  6. クラスター内にデプロイメントを作成します。

    kubectl apply -f <deployment>.yaml
    

ポッド・デプロイメントでイメージ・プル・シークレットを参照する

クラスター管理者が Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管しなかった場合、サービス・アカウントを指定していないすべてのデプロイメントは、コンテナーをデプロイする際にイメージ・プル・シークレットを使用することができません。 代わりに、ポッド・デプロイメントでイメージ・プル・シークレットを定義できます。 ポッド・デプロイメントでイメージ・プル・シークレットを参照する場合、イメージ・プル・シークレットはこのポッドに対してのみ有効であり、Kubernetes 名前空間内のポッド間で共有することはできません。

開始前に

ポッド・デプロイメントでイメージ・プル・シークレットを参照するには、以下のようにします。

  1. mypod.yaml という名前のポッド構成ファイルを作成します。

  2. IBM Cloud Container Registry 内のイメージにアクセスするためのイメージ・プル・シークレットとポッドを定義します。

    プライベート・イメージにアクセスするには、

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: <container_name>
          image: <region>.icr.io/<namespace_name>/<image_name>:<tag>
      imagePullSecrets:
        - name: <secret_name>
    

    IBM Cloud パブリック・イメージにアクセスするには、

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: <container_name>
          image: icr.io/<image_name>:<tag>
      imagePullSecrets:
        - name: <secret_name>
    
    container_name>
    クラスターにデプロイするコンテナーの名前。 namespace_name>: イメージが保管されているレジストリー名前空間。 使用可能な名前空間をリストするには、ibmcloud cr namespace-list を実行します。 image_name>: 使用するイメージの名前。 IBM Cloud アカウント内の使用可能なイメージをリストするには、ibmcloud cr image-list を実行します。 tag>: 使用するイメージのバージョン。 タグが指定されていない場合、latest というタグが付いたイメージがデフォルトで使用されます。 <secret_name>: 以前に作成したイメージ・プル・シークレットの名前。
  3. 変更内容を保存します。

  4. クラスター内にデプロイメントを作成します。

    kubectl apply -f mypod.yaml
    

イメージを IBM Cloud Container Registry にプッシュする

クラスター管理者が IBM Cloud Container Registry でイメージ・レジストリーをセットアップしたら、Docker イメージを名前空間に追加して安全にイメージを保管し、他のユーザーと共有することができます。

例えば、プライベート・レジストリーまたはパブリック・レジストリーのソースからイメージをプルし、タグを付けて IBM Cloud Container Registry で後で使用することができます。 または、他のユーザーがイメージにアクセスできるように、作業対象の Docker イメージを名前空間にプッシュすることもできます。 まずは、名前空間へのイメージの追加を参照してください。

脆弱性アドバイザーによる IBM Cloud Container Registry でのイメージのセキュリティー管理

Vulnerability Advisorは、IBM やサード・パーティーから提供されたコンテナー・イメージや、組織の IBM Cloud Container Registry 名前空間に追加されたコンテナー・イメージのセキュリティー状況を検査します。

イメージを名前空間に追加すると、Vulnerability Advisorによってイメージが自動的にスキャンされ、セキュリティー問題や潜在的な脆弱性が検出されます。 セキュリティー問題が検出されると、報告された脆弱性の解決に役立つ指示が提供されます。 まずは、脆弱性アドバイザーを使用したイメージ・セキュリティーの管理を参照してください。

コンテナー・イメージのための信頼できるコンテンツのセットアップ

署名ありで IBM Cloud Container Registry に保管されている信頼できるイメージからコンテナーを構築できます。また、署名なしのイメージや脆弱なイメージのデプロイを防止できます。

  1. 信頼できるコンテンツとしてイメージに署名します。 イメージに信頼をセットアップしたら、信頼できるコンテンツと、レジストリーにイメージをプッシュできる署名者を管理できるようになります。
  2. クラスターでコンテナーの作成に署名付きのイメージしか使用できないようにするポリシーを適用するには、オープンソースの Portieris プロジェクトをインストールします。
  3. クラスター・ユーザーは、信頼できるイメージから作成されたアプリをデプロイできます。
    1. default の Kubernetes 名前空間にデプロイします
    2. 別の Kubernetes 名前空間にデプロイするか、別の IBM Cloud リージョンまたはアカウントからデプロイします

クラスターでのイメージ・セキュリティー制約の有効化

クラスターでイメージ・セキュリティー制約を有効にする場合は、オープンソースの Kubernetes プロジェクト Portieris をインストールします。 その後、イメージ・ポリシーを作成して、ポリシーを満たさないポッド (署名されていないイメージなど) がクラスター内で実行されないようにすることができます。

詳細については 、 Portieris のドキュメントを参照してください。

変更されたイメージ: デフォルトでは、Portieris は MutatingAdmissionWebhook アドミッション・コントローラーを使用して、タグではなくダイジェストでイメージを参照するようにイメージを変更します。 ただし、変更されたイメージを拒否するデプロイメント・テクノロジーが存在する場合があります。 その場合は、 画像の変異オプションポリシー を使用して、デフォルトの動作を変更することができます。

イメージ・セキュリティー制約の有効化または無効化

CLIまたはコンソールから、クラスタの画像セキュリティの適用を有効または無効にすることができます。 それ以前のバージョンについては 、 Portieris のドキュメントを参照してください。

CLI を使用したイメージ・セキュリティー適用の有効化または無効化

以下のコマンドを参照してください。

コンソールからのイメージ・セキュリティー適用の有効化または無効化

  1. コンソールから、クラスタを選択します。
  2. 画像セキュリティの適用フィールドを見つけ、 [有効] または [無効] をクリックします。

デフォルトのイメージ・ポリシー

イメージ・セキュリティー制約を有効にすると、IBM Cloud Kubernetes Service によってクラスター内に特定のイメージ・ポリシーが自動的に作成されます。 この機能を無効にすると、基礎となるClusterImagePolicy CRD が削除されます。これにより、作成したすべてのデフォルト・イメージ・ポリシーとすべてのカスタム・イメージ・ポリシーが削除されます。

  • ibm-signed-image-enforcement という名前のイメージ・ポリシーは、名前空間で実行されるイメージを IBM Cloud Kubernetes Service イメージのみに制限します。 これらのイメージ・ポリシーは変更しないでください。 変更しても数分以内に上書きされます。
  • defaultdefault-allow-all などのように、別のイメージ・ポリシーで制限されていないイメージを許可するイメージ・ポリシーもあります。 これらのイメージ・ポリシーは変更でき、変更は保持されますが、イメージ・ポリシーの名前は変更しないでください。 ポリシーの名前を変更すると、デフォルトの名前と設定を含むポリシーが別に作成されます。

クラスター内のイメージ・ポリシーを確認するには、以下のようにします。

開始前に

アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  1. クラスターにグローバルに適用されるイメージ・ポリシーをリスト表示します。 設定例については 、 Portieris のポリシー文書をご覧ください。

    kubectl get ClusterImagePolicy
    
  2. クラスター内の特定の名前空間に適用されるイメージ・ポリシーをリスト表示します。 設定例については 、 Portieris のポリシー文書をご覧ください。

    kubectl get ImagePolicy --all-namespaces