為應用程式建置映像檔

Docker 映像檔是您使用 Red Hat® OpenShift® on IBM Cloud® 建立的每個容器的基礎。

映像檔是從 Dockerfile 所建立的,該 Dockerfile 檔案包含建置映像檔的指示。 Dockerfile 可能會參照其指示中個別儲存的建置構件(例如應用程式、應用程式的配置及其相依關係)。

建置映像檔

您可以透過多種方式建立您的圖像,包括以下 IBM Cloud 服務:

IBM Cloud Code Engine
Code Engine 支援從 Dockerfile 和 Cloud Native Buildpacks 建立映像,並自動將映像推送到 IBM Cloud® Container Registry。 如需相關資訊,請參閱 規劃建置
Tekton 管線
Continuous Delivery 服務包括數個 Tekton 作業,您可以在管線內參照這些作業來建置映像檔。 如需相關資訊,請參閱 Tekton 管線

從內部登錄中的現有映像檔串流部署容器

您可以從叢集管理員在叢集 Red Hat OpenShift 內部註冊表中設定的現有 映像流部署應用程式。 例如,您的叢集管理員可能已 設定影像串流,使其能從外部私有註冊表(例如 IBM Cloud Container Registry.)匯入影像。

使用映像檔串流搭配 CLI

  1. 存取您的 Red Hat OpenShift 叢集

  2. 列出專案中可用的映像檔串流。 如果您知道映像檔串流的專案、名稱和標籤,則可以在其他專案中使用本端映像檔串流,而無需設定映像檔取回串流認證。

    oc get is -n <project>
    
  3. 從映像檔串流建立應用程式。

    oc new-app --image-stream="<project>/<imagestream>:<tag>"
    

從 Red Hat OpenShift Web 主控台使用映像檔串流

  1. Red Hat OpenShift Web 主控台,切換至 開發人員 視景,然後按一下 + 新增
  2. 在「新增」窗格功能表列中,選取不是 default 要在其中建立應用程式的 專案,然後按一下 儲存器映像檔
  3. 映像檔 區段中,選取 內部登錄中的映像檔名稱
  4. 選擇 default專案,<image>影像流,和 <tag>標籤您之前建立的圖像流的。
  5. 檢閱其餘應用程式詳細資料,然後按一下 建立

將儲存器從 IBM Cloud Container Registry 映像檔部署至 default Red Hat OpenShift 專案

您可以將容器從 IBM 提供的公用映像檔或 IBM Cloud Container Registry 名稱空間中所儲存的專用映像檔部署至叢集裡。 如需叢集如何存取登錄映像檔的相關資訊,請參閱瞭解如何授權叢集以從 IBM Cloud Container Registry 取回映像檔

開始之前:

  1. 在 IBM Cloud Container Registry 中設定名稱空間,並將映像檔推送至此名稱空間

  2. 建立叢集

  3. 存取您的 Red Hat OpenShift 叢集

  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/<project>/<image>:<tag>
    
    <deployment>
    為您的部署命名。
    <number_of_replicas>
    輸入部署所建立的抄本 Pod 數目。
    app: <app_name>
    使用應用程式的名稱作為容器的標籤。
    name: <app_name>
    為容器提供名稱,例如 app 標籤的名稱。
    image: <region>.icr.io/project>/image>:tag>
    將映像檔 URL 變數取代為映像檔的資訊:
    region>: 該註冊域的區域性 IBM Cloud Container Registry API 端點。 若要列出您所登入之地區的網域,請執行 ibmcloud cr api
    namespace>: 登錄名稱空間。 若要取得名稱空間資訊,請執行 ibmcloud cr namespace-list
    image>:tag>: 您要為容器使用的映像檔和標籤。 若要列出登錄名稱空間中可用的映像檔,請執行 ibmcloud cr images
  6. 在叢集裡建立部署。

    oc apply -f <deployment>.yaml
    

從加密映像檔部署容器

使用 Image Key Synchronizer 叢集附加程式,將容器從已加密映像檔部署至叢集。

在執行 Red Hat OpenShift 4.5 或更新版本的叢集中,CRI-O 容器運行環境支援使用加密容器映像檔。 已加密儲存器映像檔是包含已加密層內容的 Open Container Initiative (OCI) 映像檔。 您可以啟用特定叢集的映像檔加密,而不是保護個別開發人員 (例如使用映像檔取回密碼從登錄取回映像檔的開發人員) 的映像檔安全。 這樣,您可以確保加密映像檔僅在具有映像檔解密金鑰的那些特定叢集中執行。

若要使用已加密映像檔來執行應用程式,您必須與叢集裡工作者節點上的容器運行環境共用用於解密映像檔的金鑰。 當您在叢集裡啟用 Image Key Synchronizer 附加程式時,同步化程式常駐程式集會部署在 image-key-synchronizer 專案中。 然後,您可以建立 Kubernetes 密鑰,其中包含該專案中的映像檔解密金鑰。 附加程式會將金鑰新增至工作者節點上的特定目錄,容器執行時期可以在其中存取及使用金鑰來解密容器映像檔。 請注意,Image Key Synchronizer 附加程式也支援私密金鑰,它們首先 由儲存在 IBM® Key Protect 實例中的根金鑰包裝

開始之前

  1. 下載並安裝下列開放程式碼工具的 CLI 用戶端:

  2. 存取您的 Red Hat OpenShift 叢集

  3. 選用項目: 當您建立用於映像檔加密的公開和私密金鑰組時,可以直接在密鑰中提供私密金鑰,或先使用 Key Protect 根金鑰或金鑰管理服務 (KMS) 來包裝私密金鑰。 若要準備包裝私密金鑰,請執行下列動作:

    1. 安裝 Key Protect CLI 外掛程式
    2. 建立 Key Protect 服務實例
    3. 建立 Key Protect 根金鑰
    4. 取得 Key Protect 實例的下列值:
    5. 建立名為 keyprotect-config 的 Kubernetes 密鑰,其中包含您所擷取的值。 Image Key Synchronizer 附加程式會使用此密鑰中的環境變數,向 Key Protect 實例進行鑑別。
        apiVersion: v1
        kind: Secret
        metadata:
          name: keyprotect-config
          namespace: image-key-synchronizer
        type: Opaque
        stringData:
          config.json: |
              {
                  "keyprotect-url":"<service_endpoint>",
                  "instance-id": "<service_instance_ID>",
                  "apikey": "<service_instance_ID_API_key>"
              }
        ```
    

若要部署使用已加密映像檔的容器,請執行下列動作:

  1. 將「container-service」外掛程式更新至最新版本。

    ibmcloud update && ibmcloud plugin update container-service
    
  2. 啟用 Image Key Synchronizer 附加程式。

    ibmcloud oc cluster addon enable image-key-synchronizer -c CLUSTER_NAME_OR_ID
    
  3. 驗證已在叢集的 image-key-synchronizer 專案中順利建立 addon-image-key-synchronizer 常駐程式集。

    oc get ds addon-image-key-synchronizer -n image-key-synchronizer
    
  4. 使用 openssl 來產生私密和公開 RSA 金鑰組。

    openssl genrsa -out myprivatekey.pem
    openssl rsa -in myprivatekey.pem -pubout -out mypubkey.pem
    
  5. 請直接在密碼中提供私密金鑰,或先使用金鑰管理服務 (KMS) 中的根金鑰來包裝私密金鑰,例如 Key Protect。 在 image-key-synchronizer 專案中建立密鑰之後,Image Key Synchronizer 附加程式會自動將私密金鑰複製到工作者節點上的 /etc/crio/keys/synced 目錄。

    • 直接提供私密金鑰: 將私密金鑰儲存為 image-key-synchronizer 專案中的 Kubernetes 密鑰。
        oc create -n image-key-synchronizer secret generic --type=key --from-file=myprivatekey.pem <secret_name>
        ```
    - **若要使用 Key Protect 根金鑰**來包裝私密金鑰,請執行下列動作:
        1. 以 base64編碼您的私密金鑰,並複製輸出。
    
            ```sh {: pre}
            cat myprivatekey.pem | base64
            ```
        2. 使用 Key Protect CLI 外掛程式,以您的根金鑰包裝 base64-encoded 私密金鑰。 在輸出中,複製已包裝私密金鑰的密文。
    
            ```sh {: pre}
            ibmcloud kp key wrap ROOT_KEY_ID -p BASE64_ENCODED_PRIVATE_KEY
            ```
        3. 將包裝的私密金鑰儲存為 `image-key-synchronizer` 專案中的 Kubernetes 密鑰。
    
            ```yaml {: pre}
            apiVersion: v1
            kind: Secret
            type: kp-key
            metadata:
              name: <secret_name>
              namespace: image-key-synchronizer
            stringData:
              rootkeyid: "<root_key_ID>"
              ciphertext: "<wrapped_private_key_cipertext>"
            ```
        4. 建立該密鑰。
    
            ```sh {: pre}
            oc apply -n image-key-synchronizer -f <secret_name>.yaml
            ```
    
  6. 使用 docker 在本端取回 OCI 映像檔。 請將 <source_image> 替換為該映像的儲存庫,並將 替換為您要使用的映像標籤,例如 latest``。

    docker pull <source_image>:<tag>
    
  7. 使用 skopeo 來加密本端映像檔。 此指令會複製您先前取回的 OCI 映像檔,使用公開金鑰來加密映像檔,並將已加密映像檔儲存至不同的本端檔案。 請考量命名已加密映像檔 <source_image>_encrypted,以方便識別。

    skopeo copy --encryption-key jwe:./mypubkey.pem <source_image>:<tag> <source_image>_encrypted:<tag>
    
  8. 選用項目: 若要在本端驗證映像檔已加密,您可以嘗試使用不正確的金鑰來解密映像檔。

    1. 產生一個新的私鑰。
        openssl genrsa --out wrongkey.pem 1024
        ```
    2. 嘗試使用此新金鑰來解密映像檔。 解密指令失敗,因為指定的私密金鑰不正確。
    
    ```sh {: pre}
        skopeo copy --decryption-key ./wrongkey.pem <source_image>_encrypted:<tag> <source_image>_decrypted:<tag>
        ```
    
  9. 選用項目: 將已加密映像檔推送至 IBM Cloud Container Registry,其支援已加密 OCI 映像檔。

  10. 在應用程式部署中指定加密映像檔。 例如,如果您已將加密映像檔推送至 IBM Cloud Container Registry,則可以遵循 將容器從 IBM Cloud Container Registry 映像檔部署至 default Red Hat OpenShift 專案 中的範例。 當您在叢集中建立部署時,容器執行時期會使用 /etc/crio/keys/synced 目錄中的私密解密金鑰來解密映像檔,然後再執行它。

  11. 對於您要加密的任何後續映像檔,您可以使用相同的公開金鑰來使用 Skopeo加密映像檔,或重複這些步驟來使用不同的公開和私密金鑰組。

如果您稍後決定停用附加程式,則會移除 addon-image-key-synchronizer 常駐程式集,但不會移除 image-key-synchronizer 專案及您在該專案中建立的任何密鑰,而且儲存器執行時期仍可以使用這些密鑰來執行加密映像檔。 如果您也想要從工作者節點移除金鑰,則必須先從 image-key-synchronizer 專案中刪除對應的密鑰,然後再停用附加程式。

若需查看每個 Image Key Synchronizer 附加元件版本的變更清單,請參閱 Image Key IBM Cloud Synchronizer 附加元件變更記錄

在 Pod 部署中參照映像檔取回密碼

若叢集管理員未 將映像拉取密鑰儲存於服務帳戶 Kubernetes 中,所有未指定服務帳戶的部署皆無法使用該密鑰部署容器。 您可以改為在 Pod 部署中定義映像檔取回密碼。 當您在 Pod 部署中引用映像拉取密鑰時,該映像拉取密鑰僅對此 Pod 有效,且無法在 Red Hat OpenShift 專案中的不同 Pod 之間共用。

開始之前

若要引用您 Pod 部署中的映像拉取密鑰,

  1. 建立名為 mypod.yaml 的 Pod 配置檔。

  2. 定義 Pod 及映像檔取回密碼,以存取 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-listimage_name>: 要使用的圖片名稱。 若要列出 IBM Cloud 帳戶中的可用映像檔,請執行 ibmcloud cr image-listtag>: 您要使用的圖片版本。 若未指定標籤,系統將預設使用標籤為「最新」的圖片。 <secret_name>: 您先前所建立的映像拉取密鑰名稱。
  3. 儲存變更。

  4. 在叢集裡建立部署。

    oc apply -f mypod.yaml
    

將映像檔推送至 IBM Cloud Container Registry

叢集管理員使用 建立映像註冊表後 IBM Cloud Container Registry,您可透過將映像新增至命名空間,安全地儲存並與其他使用者共享 Docker 映像。

舉例來說,您可以從任何私有或公開的註冊庫來源拉取一張圖片,然後為其加上標籤,以便日後在 IBM Cloud Container Registry 中使用。 或者,您可以將您使用的 Docker 映像檔推送至名稱空間,以便其他使用者可以存取該映像檔。 若要開始使用,請參閱 將映像檔新增至名稱空間

使用 Vulnerability Advisor 在 IBM Cloud Container Registry 中管理映像檔的安全

Vulnerability Advisor 檢查由 IBM、第三方提供,或新增至您組織的 IBM Cloud Container Registry 命名空間中的容器映像的安全狀態。

當您將映像檔新增至名稱空間時,Vulnerability Advisor 會自動掃描映像檔,以偵測安全問題及潛在漏洞。 如果找到安全問題,會提供指示以協助修正報告的漏洞。 若要開始使用,請參閱 使用 Vulnerability Advisor

設定容器映像檔的授信內容

您可以從已簽署並儲存在 IBM Cloud Container Registry 中的授信映像檔中建置容器,並防止從未簽署或有漏洞的映像檔進行部署。

  1. 簽署映像檔以取得授信內容。 在設定映像檔的信任之後,您可以管理可將映像檔推送至登錄的授信內容及簽章者。
  2. 若要施行原則,以便只能使用已簽署的映像檔在叢集中建置容器,請 安裝開放程式碼 Portieris 專案
  3. 叢集使用者可以部署從信任映像檔建置的應用程式。
    1. 部署至 default Kubernetes 名稱空間
    2. 部署至不同的 Kubernetes 名稱空間,或從不同的 IBM Cloud 地區或帳戶進行部署

在您的叢集中啟用影像安全性強制執行

當您在叢集啟用影像安全性強制執行時,您需安裝此開源 KubernetesPortieris 專案。 接著,您可以建立映像檔政策,以防止不符合政策要求的 Pod(例如未簽名的映像檔)在您的叢集中執行。

如需相關資訊,請參閱 Portieris 文件

變異映像檔:預設情況下,Portieris 會使用 准入 MutatingAdmissionWebhook 控制器來變異您的映像檔,使其透過摘要而非標籤來引用映像檔。 不過,您可能有一些部署技術會拒絕變異的映像檔。 若是如此,您可以使用 影像突變選項原則 來變更預設行為。

啟用或停用映像檔安全強制執行

您可以從 CLI 或主控台啟用或停用叢集的映像檔安全強制執行。 有關早期版本,請參 閱 Portieris 文件

使用 CLI 啟用或停用映像檔安全強制執行

請參閱下列指令。

從主控台啟用或停用映像檔安全強制執行

  1. 主控台,選擇您的群集。
  2. 找到影像安全強制執行欄位,然後按一下啟用停用

預設映像檔原則

當您啟用影像安全性強制執行時,Red Hat OpenShift on IBM Cloud 系統會自動在您的叢集內建立特定的影像政策。 當您停用此特性時,會移除基礎 ClusterImagePolicy CRD,這會移除您所建立的所有預設映像檔原則及任何自訂映像檔原則。

  • 名稱為 ibm-signed-image-enforcement 的映像檔原則會將專案中執行的映像檔限制為僅限 Red Hat OpenShift on IBM Cloud 映像檔。 請勿修改這些映像檔原則。 您所做的任何變更都會在幾分鐘內改寫。
  • 其他映像檔原則 (例如 defaultdefault-allow-all) 允許不受其他映像檔原則限制的映像檔。 您可以修改這些映像檔原則,並保留您所做的變更,但不要重新命名映像檔原則。 如果您重新命名原則,則會建立更多具有預設名稱及設定的原則。

若要檢閱叢集裡的映像檔原則,

開始之前

存取您的 Red Hat OpenShift 叢集

  1. 列出廣域套用至叢集的映像檔原則。 如需範例配置,請參閱 Portieris 原則文件

    oc get ClusterImagePolicy
    
  2. 列出套用至叢集內特定名稱空間的映像檔原則。 如需範例配置,請參閱 Portieris 原則文件

    oc get ImagePolicy --all-namespaces