設定映像檔登錄
Red Hat® OpenShift® on IBM Cloud® 叢集包含內部登錄,用於在本端建置、部署和管理容器映像檔。 要使專用登錄能夠管理和控制對整個企業中映像檔的存取權,您還可以將叢集設定為使用 IBM Cloud® Container Registry。
選擇映像檔登錄解決方案
您的容器映像檔必須儲存於您的叢集可存取的容器註冊表中,才能將應用程式部署至您的叢集。 您可以選擇使用 Red Hat OpenShift 叢集的內建註冊表、僅限特定使用者存取的私有註冊表,或是公開註冊表。 請檢閱下表,以選擇適合您使用案例的最佳選項。
- 內部 Red Hat OpenShift Container Registry (OCR)
-
您的叢集已設定為使用內部 Red Hat OpenShift Container Registry,以便 Red Hat OpenShift 能直接在叢集內部自動建置、部署及管理您的應用程式生命週期。 影像儲存於一個後端 IBM Cloud classic 檔案儲存裝置中,該裝置是在建立叢集時進行配置的。 如果需要更多儲存空間,可以調整該裝置的大小。 使用案例:
-
如需相關資訊,請參閱使用內部登錄。
- 專用登錄
-
專用登錄是保護映像檔免遭未獲授權使用者的良好選擇。 專用登錄必須由叢集管理者設定,以確保存取權、儲存空間配額、映像檔信任和其他特性依預期作業。 依預設,您的 Red Hat OpenShift 叢集 會透過
default專案中的映像檔取回密碼,與專用 IBM Cloud Container Registry 整合。IBM Cloud Container Registry 是高可用性多租戶專用登錄,用於儲存您自己的映像檔。 您還可以從廣域icr.io登錄中取回 IBM 提供的映像檔,並從授權登錄中獲取經授權的軟體。 透過 IBM Cloud Container Registry,您可以透過與 IBM Cloud 的 IAM 及計費系統整合,管理多個叢集的影像。 搭配使用 IBM Cloud Container Registry 與內部登錄的優點:- 本端映像檔快取,以透過內部登錄進行更快速的建置。
- 其他專案中的部署可以看到映像檔串流,因此您不必將取回密鑰複製到每一個專案。
- 跨多個叢集共用映像檔,而無需將映像檔推送到多個登錄。
- 自動掃描映像檔漏洞。
- 透過 IBM Cloud IAM 原則和個別的地區登錄來控制存取權。
- 保留映像檔,而無需使用叢集或連接的儲存裝置中的儲存空間。 您還可以設定原則來管理映像檔數量,以防止映像檔使用的空間太多。
- VPC 基礎架構: 使用專用登錄服務端點,以便只使用專用雲端服務端點的叢集仍然可以存取登錄。
- 設定儲存空間和映像檔取回資料流量配額,以更妥善地控制映像檔的儲存空間、使用和計費。
- 從授權登錄中取回獲得授權的 IBM 內容。
-
首先,請參閱下列主題:
- 公用登錄
-
像 Docker Hub 這樣的公開儲存庫,是跨團隊、公司、叢集或雲端服務供應商共享映像檔的一種方式。 一些公用登錄還可能會提供專用登錄元件。 使用案例:
- 在公用網路上推送和取回映像檔。
- 跨雲端服務供應商對容器進行快速測試。
- 不需要企業級功能,例如漏洞掃描或存取管理。
-
如需更多資訊,請參閱公開註冊庫的文件,例如 Quay 或 Docker Hub。
將影像儲存於內部註冊表中
Red Hat OpenShift 叢集預設具備內部登錄表。 內部登錄檔中的影像已完成備份,但具體方式會因叢集 Red Hat OpenShift on IBM Cloud 所採用的基礎架構供應商而異。
- 標準叢集
- 依預設,您的 Red Hat OpenShift 叢集已設定內部登錄,其使用 File Storage for Classic 作為後端儲存體。 刪除叢集時,還將刪除內部登錄及其映像檔。 若您希望將映像檔長期保存,建議考慮使用私有註冊表(例如 IBM Cloud Container Registry )、將映像檔備份至持久儲存空間(例如 Object Storage ),或建立一個獨立的 Red Hat OpenShift 容器註冊表(OCR)叢集。 如需相關資訊,請參閱 Red Hat OpenShift 文件。
- VPC 叢集
- 您的 Red Hat OpenShift 叢集的內部註冊表會將您的映像檔備份至您帳戶中某個 IBM Cloud Object Storage 實例內自動建立的儲存桶中。 即使您刪除叢集,也會保留物件儲存區中儲存的任何資料。 叢集建立完成後,您將無法從叢集中移除或解除連結「IBM Cloud Object Storage」儲存桶。 如果您計劃建立一個不使用 COS 作為後端支援的內部註冊表的叢集(例如用於 IBM 金融服務雲端環境 ),則必須在建立叢集時省略 COS 執行個體。 如需更多資訊,請參閱 《 不使用 Object Storage 儲存桶建立 VPC 叢集 》。
- 標準、VPC 或 Satellite 叢集
- 您可以選擇性地選擇設定內部登錄,以將資料儲存在內部登錄 Pod 執行所在之工作者節點的
emptyDir中。 請記住,此資料不是持續的,如果 Pod 或工作者節點重新啟動,則會刪除儲存的資料且無法復原。 如果您定期從大型映像檔建置容器,則可以將映像檔儲存在本端emptyDir中,以提高效能。
將內部映像檔登錄備份至 IBM Cloud Object Storage
虛擬私有雲
您在 Red Hat OpenShift 叢集內部註冊表中的影像會自動備份至一個 IBM Cloud Object Storage 儲存桶。 即使您刪除叢集,也會保留物件儲存區中儲存的任何資料。
不過,如果在建立叢集時無法建立儲存區,則必須手動建立儲存區並設定叢集以使用儲存區。 同時,內部登錄會使用 emptyDir Kubernetes 磁區,將容器映像檔儲存在工作者節點的次要磁碟上。 emptyDir 磁區不會被視為持續性高可用性儲存空間,如果您刪除使用該映像檔的 Pod,則會自動刪除該映像檔。
若要手動建立內部登錄的儲存區,請參閱 關於雲端物件儲存體儲存區的叢集建立錯誤。
為群集註冊表設定 COS 儲存桶
您可以手動為群集的內部影像登錄設定 IBM Cloud Object Storage 桶。 這在您需要設定或重新設定註冊表儲存後端時非常有用。
開始之前
- 您必須擁有現有的 Red Hat OpenShift on IBM Cloud 集群和 IBM Cloud Object Storage 實例。
- 存取您的 Red Hat OpenShift 叢集。
設定 COS 儲存桶
-
為您的群集和 Object Storage 實例設定環境變數。
export CLUSTER_NAME=<cluster_name> export COS_INSTANCE_ID=<cos_instance_id> export CLUSTER_ID=$(ibmcloud ks cluster get --cluster $CLUSTER_NAME --json | jq -r .id) -
檢查目前的影像登錄操作員設定。
oc get configs.imageregistry.operator.openshift.io/cluster -o yaml -
暫時將操作員設定為
Removed模式。 如果註冊表已啟用,請停用以避免衝突。oc patch configs.imageregistry.operator.openshift.io/cluster \ --type=merge -p '{"spec":{"managementState":"Removed"}}' -
檢查註冊表是否使用
emptyDir,這表示沒有設定 COS 桶。storage: emptyDir: {} managementState: Managed -
為您的群集建立 Object Storage 桶。 將
<region>改為您偏好的區域,例如us-south或eu-de。RANDOM_SUFFIX=$(LC_ALL=C tr -dc 'a-z0-9' </dev/urandom | head -c 6) COS_BUCKET_NAME="roks-${CLUSTER_ID}-${RANDOM_SUFFIX}" ibmcloud cos bucket-create \ --bucket "$COS_BUCKET_NAME" \ --ibm-service-instance-id "$COS_INSTANCE_ID" \ --class standard \ --region <region> -
從註冊表組態中移除
emptyDir欄位。oc patch configs.imageregistry.operator.openshift.io/cluster \ --type=json \ -p '[{"op": "remove", "path": "/spec/storage/emptyDir"}]' -
設定註冊表使用 S3 儲存 ( Object Storage )。 更新
region和regionEndpoint值,以符合您水桶的區域。oc patch configs.imageregistry.operator.openshift.io/cluster --type=merge -p "$(cat <<EOF { "spec": { "managementState": "Unmanaged", "storage": { "s3": { "bucket": "$COS_BUCKET_NAME", "region": "<region>-standard", "regionEndpoint": "https://s3.direct.<region>.cloud-object-storage.appdomain.cloud", "trustedCA": { "name": "" }, "virtualHostedStyle": false } } } } EOF )"例如,如果您的水桶位於
eu-de,請使用region: "eu-de-standard"和regionEndpoint: "https://s3.direct.eu-de.cloud-object-storage.appdomain.cloud"。 -
驗證影像登錄操作員組態。
oc get configs.imageregistry.operator.openshift.io/cluster -o yaml -
為 COS 憑證實例建立服務憑證金鑰,並擷取 HMAC 憑證。
ibmcloud resource service-key-create roks-$CLUSTER_ID-key \ --instance-id "$COS_INSTANCE_ID" \ -p '{"HMAC": true}' \ -o json > service-key.json # Extract values with jq ACCESS_KEY=$(jq -r '.credentials.cos_hmac_keys.access_key_id' service-key.json) SECRET_KEY=$(jq -r '.credentials.cos_hmac_keys.secret_access_key' service-key.json) # Create credentials file cat <<EOF > creds.txt [default] aws_access_key_id = $ACCESS_KEY aws_secret_access_key = $SECRET_KEY EOF這會使用您的 Object Storage 認證建立
creds.txt檔案。憑證檔案範例
[default] aws_access_key_id = f1ab5fcf7XXXXXXXXXb2a14e046 aws_secret_access_key = 4c78ddfa763XXXXXXX23d1cc9350d1 -
如果
image-registry-private-configuration-usersecret 不存在,請建立它。oc create secret generic image-registry-private-configuration-user -n openshift-image-registry -
使用存取憑證更新秘密。
oc patch secret image-registry-private-configuration-user \ -n openshift-image-registry \ --type merge \ -p "{ \"data\": { \"REGISTRY_STORAGE_S3_ACCESSKEY\": \"$(echo -n "$ACCESS_KEY" | base64)\", \"REGISTRY_STORAGE_S3_SECRETKEY\": \"$(echo -n "$SECRET_KEY" | base64)\" } }" -
如果
image-registry-private-configurationsecret 不存在,請建立它。oc create secret generic image-registry-private-configuration -n openshift-image-registry -
使用 Object Storage 完整憑證檔案更新主影像註冊密碼。
CREDENTIALS_B64=$(base64 -i creds.txt | tr -d '\n') oc patch secret image-registry-private-configuration \ -n openshift-image-registry \ --type merge \ -p "{\"data\": {\"credentials\": \"${CREDENTIALS_B64}\"}}" -
將影像登錄操作員設定為
Managed模式。oc patch configs.imageregistry.operator.openshift.io/cluster \ --type=merge -p '{"spec":{"managementState":"Managed"}}' -
重新啟動影像登錄部署。
oc rollout restart deployment image-registry -n openshift-image-registry -
驗證註冊表是否處於健康狀態。
oc get clusteroperator image-registry
疑難排解 COS 登錄配置
如果您在 Object Storage 登錄組態中遇到問題,請嘗試執行下列疑難排解步驟。
-
請確認
image-registryPod 是否正在運行。oc project openshift-image-registry oc get pods輸出範例
NAME READY STATUS RESTARTS AGE image-registry-7d8b57c98f-m92t7 1/1 Running 0 3h53m node-ca-62p88 1/1 Running 0 5h12m node-ca-6s8vx 1/1 Running 0 5h17m node-ca-b5jwl 1/1 Running 0 4h56m node-ca-chl7k 1/1 Running 0 5h17m node-ca-l6tlb 1/1 Running 0 4h55m node-ca-q4vw8 1/1 Running 0 4h55m -
檢查群組操作員
image-registry狀態。oc describe clusteroperator image-registry -
如有需要,請暫時移除 S3 後端設定,並回復至
emptyDir以解除操作員的鎖定。oc patch configs.imageregistry.operator.openshift.io/cluster --type=merge -p '{ "spec": { "managementState": "Managed", "storage": { "emptyDir": {} } } }' -
檢查
openshift-image-registry命名空間中的 Pod。oc get pods -n openshift-image-registry -
檢查已部署的組態環境變數。
oc get pod -n openshift-image-registry -l docker-registry=default -o jsonpath='{.items[0].spec.containers[0].env}' | jq
如需設定註冊表的詳細資訊,請參閱 設定和註冊表。
將映像檔儲存在「標準」叢集的內部登錄中
預設情況下,您的 Red Hat OpenShift 叢集的內部註冊表會使用一個 IBM Cloud File Storage for Classic 卷來儲存註冊表映像。 可以檢閱儲存空間磁區的預設大小,或者更新磁區大小。
檢視磁區詳細資料
若要檢視磁區詳細資料(包括儲存空間類別和大小),可以說明持續性磁區要求。
oc describe pvc -n openshift-image-registry image-registry-storage
變更磁區詳細資料
如果登錄需要更多 GB 的儲存空間來儲存空間映像檔,則可以調整檔案儲存空間磁區的大小。 如需相關資訊,請參閱變更現有儲存裝置的大小和 IOPS。 調整 IBM Cloud 基礎架構帳戶中的磁區大小時,不會更新連接的 PVC 說明。 您也可以登入使用 registry-backing PVC 的 openshift-image-registry Pod,以確認該卷已調整大小。
將映像檔儲存在工作者節點的空目錄中
如果您定期從大型映像檔建置容器,則可以將內部登錄映像檔本端儲存在工作者節點的 emptyDir 中 (例如裸機工作者節點),以提高效能。
請記住,此資料不是持續的,如果 Pod 或工作者節點重新啟動,則會刪除儲存的資料且無法復原。
-
更新映像檔登錄操作器 configmap,以將儲存體設為使用工作者節點的
emptyDir。 請注意,將 configmap 更新為使用emptyDir並 不會 移除映像檔登錄的原始 PVC。oc patch configs.imageregistry.operator.openshift.io/cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}' -
如果 映像檔登錄操作員管理狀態 設為
Unmanaged,例如在 Satellite 叢集中,請將管理狀態更新為Managed。 現在,操作器會更新內部登錄 Pod。oc patch configs.imageregistry.operator.openshift.io/cluster --type merge -p '{"spec":{"managementState":"Managed"}}' -
取得內部登錄 Pod 的詳細資料,以便您可以驗證更新項目。
- 檢查
image-registryPod 是否在執行中,且叢集裡每個工作者節點都有一個 Pod 執行。
oc get pods -n openshift-image-registry ``` 輸出範例 ```sh {: screen} NAME READY STATUS RESTARTS AGE cluster-image-registry-operator-695bf78ffc-zvkhd 2/2 Running 0 33m image-registry-6774598589-65cnx 1/1 Running 0 112s node-ca-gg66r 1/1 Running 0 113s node-ca-n8jpq 1/1 Running 0 113s node-ca-p2d7j 1/1 Running 0 113s ``` 1. 取得 `image-registry` Pod 執行所在之 **Node** 的公用 IP 位址。 ```sh {: pre} oc describe pod -n openshift-image-registry <image-registry-pod> | grep Node ``` 輸出範例 ```sh {: screen} Node: 169.xx.xxx.xxx/169.xx.xxx.xxx ``` 如果工作者節點 IP 位址是專用的,請執行 `ibmcloud oc worker ls -c <cluster> | grep <private_IP>` 並記下對應的公用 IP 位址。 {: tip} 1. 在 Pod YAML 的 `metadata.uid` 區段中取得 `image-registry` Pod 的 **UID** (不是 `metadata.ownerReferences.uid` 區段中抄本集的 UID)。 ```sh {: pre} oc get pod -n openshift-image-registry <image-registry-pod> -o yaml ``` 輸出範例 ```yaml {: screen} apiVersion: v1 kind: Pod metadata: uid: e8d7718d-b0bd-47e2-9aaa-05f3a608fd9b ... ``` - 檢查
-
驗證內部登錄是否將資料儲存至工作者節點的
emptyDir。-
使用您先前擷取的工作者節點 直接從叢集存取登錄。 請遵循步驟,將測試映像檔推送至內部登錄。
要完成文件 Red Hat OpenShift 中的這些步驟,您需要
podman使用命令列介面工具。 依預設,工作者節點可能沒有此 CLI 工具。 請參 閱安裝 Podman 指南以了解可用的 RHEL 版本。 -
導覽至儲存至
emptyDir的內部登錄 Pod 資料夾。 對於<pod_uid>,請使用您先前擷取的 Pod UID。
cd var/lib/kubelet/pods/<pod_uid>/volumes/kubernetes.io~empty-dir/registry-storage/docker/registry/v2/repositories/openshift ``` 1. 請驗證您的映像檔是在儲存庫目錄中。 ```sh {: pre} ls ``` 輸出範例 ```sh {: screen} <myimage> nginx ... ``` -
移除內部映像檔登錄
虛擬私有雲
影像註冊表操作員部署僅存在於工具包 Red Hat OpenShift on IBM Cloud 管理的叢集之中。 HyperShift 受管叢集在控制平面中執行映像註冊表操作員。
如果您不想要使用內部映像檔登錄,則可以完成下列步驟來移除它。
- 儲存內部登錄配置的副本。
oc get configs.imageregistry.operator.openshift.io cluster -o yaml > configs.yaml - 執行下列修補程式指令,將映像檔登錄的管理狀態變更為
Removed。kubectl patch configs.imageregistry.operator.openshift.io cluster -p '{"spec":{"managementState":"Removed"}}' --type='merge' - 變更管理狀態之後,即會從叢集裡的
openshift-image-registry名稱空間移除映像檔登錄服務及部署。 您可以執行下列指令來驗證已移除它們。 請注意,只會移除映像檔登錄部署及服務。 映像檔登錄操作器部署及服務仍會保留。oc get deployment -n openshift-image-registryoc get svc -n openshift-image-registry
為內部登錄設定安全的外部路徑
預設情況下,您的 Red Hat OpenShift 叢集會具備一個內部註冊表,可透過具有內部 IP 位址的服務進行存取。 如果要使內部登錄在公用網路上可用,可以設定安全的重新加密路徑。 例如,可以將叢集的內部登錄設定為作為其他專案或叢集裡的部署的公用登錄。
開始之前:
- 確認您具有叢集的 管理員 IBM Cloud IAM 服務存取角色。
- 確保叢集具有公用網路連線功能,以使用公用路徑公開內部登錄。
- 在本端機器上安裝 Docker。
- 存取您的 Red Hat OpenShift 叢集。
若要使用內部登錄,請設定用於存取此登錄的公用路徑。 然後,建立包含用於存取此登錄的認證的映像檔取回密碼,以便其他專案中的部署可以從此登錄中取回映像檔。
-
在「
openshift-image-registry」專案中,請確認內部註冊表中已存在「image-registry」服務。oc get svc -n openshift-image-registry輸出範例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE image-registry ClusterIP 172.21.xxx.xxx <none> 5000/TCP 36d image-registry-operator ClusterIP None <none> 60000/TCP 36d -
為
image-registry服務建立一條安全路徑,該路徑使用reencryptTLS 終端服務。 透過重新加密,路由器會使用一個憑證終止 TLS 連線,然後使用其他憑證來重新加密與內部登錄的連線。 利用這種方法,會加密使用者和內部登錄之間的連線的完整路徑。 若要使用您自己的自訂網域名稱,請包含--hostname選項。oc create route reencrypt --service=image-registry -n openshift-image-registry -
擷取已指派給
image-registry路由的主機名稱( HOST/PORT )及埠號( PORT )。oc get route image-registry -n openshift-image-registry輸出範例
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD image-registry image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud image-registry 5000-tcp reencrypt None -
編輯路由設定,將 負載平衡策略設為「
source」,以便相同的客戶端 IP 位址能連至同一台伺服器,如同「直通路由」的設定方式。 可以藉由在metadata.annotations區段中新增註釋haproxy.router.openshift.io/balance: source來設定該策略。 您可以透過「Red Hat OpenShift」應用程式控制台編輯設定檔,或於命令列中執行以下指令進行編輯。oc edit route image-registry -n openshift-image-registry新增註釋。
apiVersion: route.openshift.io/v1 kind: Route metadata: annotations: haproxy.router.openshift.io/balance: source ... -
如果公司網路原則阻止透過 Proxy 或防火牆從本端系統存取公用端點,請在下列步驟中 容許存取您為內部登錄建立的路徑子網域。
-
使用與主機名稱相同的路徑登入內部登錄。
docker login -u $(oc whoami) -p $(oc whoami -t) image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud -
既然您已登入,現在可嘗試將範例
hello-world應用程式推送到內部登錄。- 從 DockerHub 中取回
hello-world映像檔,或在本端機器上建置映像檔。
docker pull hello-world ``` 1. 使用內部登錄的主機名稱、要將映像檔部署到的專案以及映像檔名稱和標籤來標記本端映像檔。 ```sh {: pre} docker tag hello-world:latest image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag> ``` 1. 將映像檔推送到叢集的內部登錄。 ```sh {: pre} docker push image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag> ``` 4. 請確認該映像已新增至「Red Hat OpenShift」映像串流中。 ```sh {: pre} oc get imagestream ``` 輸出範例 ```sh {: screen} NAME DOCKER REPO TAGS UPDATED hello-world image-registry-openshift-image-registry.svc:5000/default/hello-world latest 7 hours ago ``` - 從 DockerHub 中取回
-
若要讓專案中的部署可從內部登錄中取回映像檔,請在專案中建立映像檔取回密碼,以保存用於存取內部登錄的認證。 然後,將映像檔取回密碼新增到每個專案的預設服務帳戶。
- 列出預設服務帳戶使用的映像檔取回密碼,並記下以
default-dockercfg開頭的密碼。
oc describe sa default ``` 輸出範例 ```sh {: screen} ... Image pull secrets: all-icr-io default-dockercfg-mpcn4 ... ``` 1. 從配置檔案的 `data` 欄位中取得已編碼的密碼資訊。 ```sh {: pre} oc get secret <default-dockercfg-name> -o yaml ``` 輸出範例 ```yaml {: screen} apiVersion: v1 data: .dockercfg: ey...= ``` 1. 將 `data` 欄位的值解碼。 ```sh {: pre} echo "<ey...=>" | base64 -D ``` 輸出範例 ```sh {: screen} {"172.21.xxx.xxx:5000":{"username":"serviceaccount","password":"eyJ... ``` 4. 為內部登錄建立新的映像檔取回密碼。 - `secret_name`: 為您的映像拉取密鑰命名,例如 `internal-registry`。 - `--namespace`: 請輸入要建立映像拉取密鑰的專案,例如 `default`。 - `--docker-server`: 請勿輸入內部服務 IP 位址(`172.21.xxx.xxx:5000` ),而是輸入 `image-registry` 路由的主機名稱及埠號(`image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000` )。 - `--docker-username`: 從前一張圖片中的拉取密鑰中複製 ` `"username"` `,例如 `serviceaccount`。 - `--docker-password`: 從前一張圖片中的「pull secret」中複製 ` `"password"` `。 - `--docker-email`: 若有,請輸入您的 Docker 電子郵件地址。 若您沒有電子郵件地址,請輸入一個虛構的電子郵件地址,例如 `a@b.c`。 需要有此電子郵件才能建立 Kubernetes 密碼,但在建立之後就不再使用。 ```sh {: pre} oc create secret docker-registry internal-registry --namespace default --docker-server image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000 --docker-username serviceaccount --docker-password <eyJ...> --docker-email a@b.c ``` 5. 將映像檔取回密碼新增到專案的 default 服務帳戶。 ```sh {: pre} oc patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]' ``` 6. 針對要從內部登錄中取回映像檔的每個專案,重複上述步驟。 - 列出預設服務帳戶使用的映像檔取回密碼,並記下以
既然您已為內部登錄設定了可存取的路徑,接下來就可以登入到登錄,將映像檔推送到登錄以及從登錄中取回映像檔。 如需相關資訊,請參閱 Red Hat OpenShift 文件。
將映像檔從 IBM Cloud Container Registry 匯入至內部登錄映像檔串流
預設情況下,您的 Red Hat OpenShift on IBM Cloud 叢集會從專案 default 中的遠端 icr.ioIBM Cloud Container Registry 私有網域拉取映像檔。 您可以將映像標記為 映像流,從而將其從 匯入至 IBM Cloud Container Registry 叢集 Red Hat OpenShift 的內部登錄表中。 使用此設定,您可以使用內部登錄的本端快取,從映像檔部署應用程式,這可讓您的應用程式部署建置更快速。 此外,其他專案的部署作業可引用此映像流,如此便無需在每個專案中 IBM Cloud Container Registry 分別建立映像拉取密鑰憑證。
若您在 IBM Cloud Container Registry 中更新映像檔,該映像檔不會自動拉取至叢集 Red Hat OpenShift 的內部登錄檔。 請改為 配置定期匯入,或重複這些步驟來標記映像檔。 視您在部署中使用的映像檔取回原則而定,您也可能需要重新啟動部署。
想要進一步瞭解建置、映像檔串流及內部登錄如何一起運作? 閱讀 文件 Red Hat OpenShift,或參閱 這篇關於管理容器映像的部落格文章。
-
切換至
default專案,以將映像檔取回至映像檔串流。default專案已設定認證來存取icr.io登錄。oc project default -
列出 IBM Cloud Container Registry中的可用映像檔。 記下您要取回至 Red Hat OpenShift 叢集之內部登錄的映像檔 儲存庫 和 標籤。
ibmcloud cr images -
標記映像檔,以將它從 IBM Cloud Container Registry 名稱空間取回至內部登錄作為映像檔串流。 如需相關資訊,請參閱 Red Hat OpenShift 文件 或執行
oc tag --help。oc tag <region>.icr.io/<namespace>/<image>:<tag> default/<image>:<tag> --reference-policy=local [--scheduled]<region>.icr.io/<namespace>/<image>:<tag>:使用先前擷取的儲存庫和標籤資訊,完成 IBM Cloud Container Registry 區域、名稱空間、影像和要抽取的影像的標籤名稱。default/<image>:<tag>: 請輸入您從「IBM Cloud Container Registry」標記影像所建立的內部影像串流相關資訊。 您可以在default專案中建立此映像檔串流,如果您未指定專案,也會在此專案中建立映像檔串流。<image>:<tag>的數值通常與您先前擷取的數值相符。--reference-policy=local: 將此值設為local,以便將 IBM Cloud Container Registry 中映像檔的副本匯入內部登錄的本端快取中,並作為映像檔串流提供給叢集專案。 如果不包括此值,則當您在部署中使用映像檔串流時,映像檔串流會參照回 IBM Cloud Container Registry,因此在專案中需要認證。--scheduled: 設定此選用選項,以設定將映像檔從 IBM Cloud Container Registry 定期匯入至內部登錄。 預設間隔為 15 分鐘。 如需相關資訊,請參閱 Red Hat OpenShift 文件。
-
驗證已建立映像檔串流。
oc get imagestreams -
驗證映像檔串流已順利從 IBM Cloud Container Registry取回映像檔。 在輸出中,檢查 最新標籤來源 映像檔是否符合您的
* <region>.icr.io/<namespace>/<image>@<digest>映像檔。oc describe is/<imagestream>輸出範例
NAME: <imagestream> Namespace: default Created: 2 days ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2020-03-31T09:41:36Z Image Repository: image-registry.openshift-image-registry.svc:5000/default/ant1 Image Lookup: local=false Unique Images: 1 Tags: 1 latest tagged from <region>.icr.io/<namespace>/<image>:<tag> * <region>.icr.io/<namespace>/<image>@<digest> 2 days ago
現在,您的開發人員可以 在應用程式部署中使用映像檔串流。 映像檔會從內部登錄中本端取回的映像檔順利建置。 您不需要將專案中的映像檔取回密碼設定為 IBM Cloud Container Registry,因為映像檔串流位於叢集本端。
在內部登錄中設定建置,以將映像檔推送至 IBM Cloud Container Registry
當您在 Red Hat OpenShift on IBM Cloud 叢集內 建立建置時 , 可設定內部註冊表將映像檔推送至外部儲存庫。IBM Cloud Container Registry 預設情況下,您叢集 default 專案中的映像拉取密鑰僅具備從拉取映像的讀取 IBM Cloud Container Registry 權限。 若要推送映像檔,您必須新增具有寫入權的密鑰。
-
切換至「
default」專案。oc project default -
遵循步驟來設定 IBM Cloud IAM API 金鑰,具有
Reader和Writer服務存取角色,可從icr.io登錄取回映像檔,並將映像檔推送至其中。請記住,任何具有專案存取權的使用者都可以使用此密鑰將映像檔推送至專用登錄。 您可能想要設定 記載及監視 工具,以便您可以觀察誰在叢集裡執行哪些動作。
-
針對您要將映像檔推送至其中的每一個
icr.io區域,重複前一個步驟。 -
將密鑰新增至建置服務帳戶,並參照建置配置檔中的密鑰。 如需相關資訊,請參閱 Red Hat OpenShift 文件。
- 將您剛建立的密鑰鏈結至叢集裡所有建置使用的
builder角色,以將密鑰新增至建置服務帳戶。
oc secrets link builder <secret_name> ``` 1. 列出建置配置,並記下您要對 IBM Cloud Container Registry提供推送及取回存取權的配置。 ```sh {: pre} oc get bc ``` 1. 設定建置配置的映像檔推送密碼,以使用您剛才使用 `Writer` 服務存取權建立的密碼 IBM Cloud Container Registry。 ```sh {: pre} oc set build-secret --push bc/<build_config_name> <secret_name> ``` 4. 設定建置配置的映像檔取回密碼,以便從您要從中取回起始建置映像檔的登錄取回。 例如,如果來源映像檔位於 IBM Cloud Container Registry 儲存庫中,您可以使用剛剛建立的密鑰,並具有對 IBM Cloud Container Registry 的 `Reader` 服務存取權。 ```sh {: pre} oc set build-secret --pull bc/<build_config_name> <secret_name> ``` - 將您剛建立的密鑰鏈結至叢集裡所有建置使用的
-
更新建置服務帳戶及建置配置檔以推送至 IBM Cloud Container Registry之後,請重新啟動建置。
oc start-build <build_name> -
取得建置 Pod 的名稱,例如
<build>-2-build。oc get pods -
請檢查建置的日誌,並記下推送映像檔的位置。
oc logs <build_pod>成功映像檔推送日誌的範例。
... Successfully pushed <region>.icr.io/<namespace>/<build_name>@sha256:<hash> Push successful -
請檢查專用登錄中的映像檔,以確認已建立映像檔。
ibmcloud cr image list輸出範例
Repository Tag Digest Namespace Created Size Security status <region>.icr.io/<namespace>/<build_name> latest <digest> <namespace> 2 minutes ago 182 MB 33 Issues
您的 Red Hat OpenShift 建置現在可以從 IBM Cloud Container Registry取回映像檔,並將映像檔推送至其中。
使用 IBM Cloud Container Registry
預設情況下,您的 Red Hat OpenShift on IBM Cloud 叢集會從專案 default 中的遠端 icr.ioIBM Cloud Container Registry 私有網域拉取映像檔。 若需將儲存於 的映像 IBM Cloud Container Registry 檔用於其他專案,可將映像檔以映像流形式拉取至內部註冊表,或為每個專案中的全域及區域性註冊表建立專屬的映像拉取密鑰。
將映像檔匯入內部登錄: 請參閱 將映像檔從 IBM Cloud Container Registry 匯入內部登錄映像檔串流。
若要直接從外部 IBM Cloud Container Registry 取回映像檔: 請參閱下列主題。
- 瞭解如何授權叢集從登錄中取回映像檔。
- 複製
all-icr-io中的密鑰 從「default」專案,拉取至您想要取得圖片的專案。 - 建立您自己的映像檔取回密碼。
- 將影像拉取密鑰新增 至您的部署設定或專案服務帳戶中。
了解如何授權您的叢集從私有註冊表拉取映像檔
若要從登錄中取回映像檔,您的 Red Hat OpenShift on IBM Cloud 叢集會使用特殊類型的 Kubernetes 密碼 imagePullSecret。 此映像檔取回密碼會儲存用來存取容器登錄的認證。
儲存器登錄可以是:
- 您自己的 IBM Cloud Container Registry中的專用名稱空間。
- IBM Cloud Container Registry 中屬於不同 IBM Cloud 帳戶的專用名稱空間。
- 任何其他專用登錄,例如 Docker。
不過,依預設,叢集會設定為僅從 IBM Cloud Container Registry中帳戶的名稱空間取回映像檔,並將這些映像檔中的容器部署至叢集裡的 default Red Hat OpenShift 專案。 如果您需要在叢集的其他專案中或從其他容器登錄取回映像檔,則必須設定您自己的映像檔取回密碼。
預設映像檔取回密碼設定
通常,您的 Red Hat OpenShift on IBM Cloud 叢集僅設定為從 Red Hat OpenShiftdefault 專案中的所有 icr.ioIBM Cloud Container Registry 網域拉取映像。 請參閱以下常見問題解答,以瞭解如何從 Red Hat OpenShift 其他專案或帳戶拉取映像檔、限制拉取權限,或為何您的叢集可能缺少預設映像檔拉取憑證。
- 我的叢集該如何設定,才能從
defaultRed Hat OpenShift 專案中拉取映像檔? - 當您建立叢集時,叢集具有 IBM Cloud IAM 服務 ID,而此服務 ID 獲提供 IBM Cloud Container Registry 的 IAM Reader 服務存取角色原則。 在叢集的映像檔取回密碼所儲存的未到期 API 金鑰中,模擬服務 ID 認證。 映像拉取密鑰已新增至
defaultKubernetes 命名空間,並新增至default服務帳戶中此 Red Hat OpenShift 專案的密鑰清單中。 透過使用映像檔取回密碼,您的部署可以從 廣域及地區 IBM Cloud Container Registry 取回映像檔 (唯讀存取權),以在defaultRed Hat OpenShift 專案中部署容器。
- 廣域登錄會安全地儲存 IBM所提供的公用映像檔。 您可以在部署之間參照這些公用映像檔,而不是對儲存在每一個地區登錄中的映像檔具有不同的參照。
- 地區登錄會安全地儲存您自己的專用 Docker 映像檔。
- 如果我在
defaultRed Hat OpenShift 專案中沒有映像檔取回密碼,該怎麼辦? - 您可以透過 登入叢集 並執行
oc get secrets -n default | grep "icr-io"來檢查映像檔取回密碼。 如果未列出任何icr密碼,則建立叢集的人員可能沒有 IAM 中 IBM Cloud Container Registry 的必要許可權。 請參閱「將現有叢集更新為使用 API 金鑰的映像檔提取機密」。 - 我可以將拉取存取權限限制在特定區域的註冊表上嗎?
- 是,您可以編輯服務 ID 的現有 IAM 原則,以將 Reader 服務存取角色限制為該地區登錄或登錄資源(例如名稱空間)。 必須為 IBM Cloud 啟用 IBM Cloud Container Registry IAM 原則後,才能自訂登錄 IAM 原則。
想要讓您的註冊表憑證更加安全嗎?請要求叢集管理員在您的 叢 集中啟用金鑰管理服務供應商,以加密叢集內的 Kubernetes 機密資料,例如儲存註冊表憑證的映像檔拉取機密。
- 我可以在
default以外的 Red Hat OpenShift 專案中取回映像檔嗎? - 依預設,不可以。 透過預設的叢集設定,您可以將儲存於 IBM Cloud Container Registry 命名空間中的任何映像檔所建構的容器,部署至叢集中的
defaultRed Hat OpenShift 專案中。 若要在其他 Red Hat OpenShift 專案或 IBM Cloud 帳戶中使用這些圖片,您可以選擇複製現有的圖片提取密鑰,或自行建立新的圖片提取密鑰。 - 我可以從另一個 IBM Cloud 帳戶匯入圖片嗎?
- 是,在您要使用的 IBM Cloud 帳戶中建立 API 金鑰。 然後,在您要從 IBM Cloud 帳戶取回映像檔之每一個叢集的每一個專案中,建立一個密鑰來保留 API 金鑰。 如需更多資訊,請參考此範例,該範例使用的是已授權的服務 ID API 金鑰。
若要使用 Docker 這類非 IBM Cloud 登錄,請參閱存取儲存在其他專用登錄中的映像檔。
- API 金鑰是否必須對應於某個服務 ID? 如果我的帳戶達到服務 ID 的上限,會發生什麼情況?
- 預設叢集設定會建立一個服務 ID,以將 IBM Cloud IAM API 金鑰認證儲存在映像檔取回密碼中。 不過,您也可以建立個別使用者的 API 金鑰,並將那些認證儲存在映像檔取回密碼中。 若您達到 IAM 對服務 ID 的限制,您的叢集將在未包含服務 ID 和映像檔拉取密鑰的情況下建立,且預設無法從
icr.io註冊表網域拉取映像檔。 您必須建立自己的映像檔取回密碼,但建立時須使用個別使用者(例如功能 ID,而不是 IBM Cloud IAM 服務 ID)的 API 金鑰。 - 我看到區域登錄網域及所有登錄網域的映像檔取回密碼。 我要用哪一個?
- 先前,Red Hat OpenShift on IBM Cloud 會為每一個地區、公用
icr.io登錄網域建立個別映像檔取回密碼。 現在,所有地區的所有公用及專用icr.io登錄網域都儲存在叢集的defaultKubernetes 專案中自動建立的單一all-icr-io映像檔取回密碼中。
對於叢集裡其他 Kubernetes 名稱空間中的工作負載,以從專用登錄取回容器映像檔,您現在只能將 all-icr-io 映像檔取回密碼複製到該 Kubernetes 專案。 然後,在服務帳戶或部署中指定 all-icr-io 密碼。 您不再需要複製符合映像檔地區登錄的映像檔取回密碼。 此外,請記住您不需要公用登錄的映像檔取回密碼,這不需要鑑別。
- 在另一個 Red Hat OpenShift 專案中複製或建立一個 image pull secret 後,就大功告成了嗎?
- 還沒。 容器必須有權使用所建立的密碼來取回映像檔。 您可以將映像檔取回密碼新增至名稱空間的服務帳戶,或在每次部署時參照密碼。 如需指示,請參閱使用映像檔取回密碼部署容器。
icr.io 登錄的專用網路連線
當您設定帳戶 IBM Cloud 以使用服務端點時,可透過私有網路連線將映像檔推送至並從中提取映像 IBM Cloud Container Registry 檔。
我需要做什麼才能設定叢集以使用 icr.io 登錄的專用連線?
- 啟用 IBM Cloud 基礎架構帳戶的 虛擬路由器功能(VRF),以便您可以使用 IBM Cloud Container Registry 專用雲端服務端點。 若要啟用 VRF,請參閱 啟用 VRF。
若要檢查是否已啟用 VRF,請使用
ibmcloud account show指令。 - 啟用 IBM Cloud 帳戶,以使用服務端點。
IBM Cloud Container Registry 會自動使用專用雲端服務端點。 您不需要啟用 Red Hat OpenShift on IBM Cloud 叢集的專用雲端服務端點。
更新現有叢集以使用 API 金鑰映像檔取回密碼
新的 Red Hat OpenShift on IBM Cloud 叢集會將 API 金鑰儲存於 映像檔拉取機密中,以授權存取 IBM Cloud Container Registry。 使用這些映像檔取回密碼,您可以從 icr.io 登錄網域中所儲存的映像檔部署容器。 如果您的叢集不是使用密碼建立的,則可以將映像檔取回密碼新增至叢集。
開始之前
-
請確定您具有下列許可權: IBM Cloud IAM 操作員或管理者 平台存取角色 Red Hat OpenShift on IBM Cloud。 帳戶擁有者可透過執行以下指令,授予您該角色。
ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator" -
IBM Cloud 針對 IBM Cloud Container Registry 的 IAM 管理員平台存取角色,適用於所有區域及資源群組。 此政策無法限定於特定區域或資源群組。 帳戶擁有者可透過執行以下指令,授予您該角色。
確認密鑰已成功建立
ibmcloud iam user-policy-create YOUR_USER_EMAIL --service-name container-registry --roles Administrator -
如果您的帳戶 限制建立服務 ID,請將 服務 ID 建立者 角色新增至主控台 (API 或 CLI 中的
iam-identity) 中的 Identity and Access Management。 -
如果您的帳戶 限制 API 金鑰建立,請將 使用者 API 金鑰建立者 角色新增至主控台 (API 或 CLI 中的
iam-identity) 中的 Identity and Access Management。
更新映像檔取回密碼
若要更新位於 default Kubernetes 命名空間中的叢集映像檔拉取祕密,請執行以下操作。
-
取得叢集 ID。
ibmcloud oc cluster ls -
執行下列指令,以建立叢集的服務 ID,並將 IBM Cloud Container Registry的 IAM 讀者 服務存取角色指派給服務 ID。 該指令還會建立 API 金鑰以模擬服務 ID 認證,並將 API 金鑰儲存在叢集的 Kubernetes 映像檔取回密碼中。 映像拉取密鑰位於
defaultRed Hat OpenShift 專案中。ibmcloud oc cluster pull-secret apply --cluster CLUSTER_NAME_OR_ID當您執行這個指令時,會起始建立 IAM 認證及映像檔取回密碼,這可能需要一點時間才能完成。 在建立映像檔拉取密鑰之前,您無法部署從 IBM Cloud Container Registry
icr.io網域拉取映像檔的容器。 -
驗證已在叢集裡建立映像檔取回密碼。
oc get secrets | grep icr-io輸出範例
all-icr-io kubernetes.io/dockerconfigjson 1 16d -
更新 容器部署,以從
icr.io網域名稱取回映像檔。 -
可選步驟:若您有防火牆,請務必為您使用的網域設定 允許外發網路流量傳輸至註冊表子網。
-
使用下列其中一個選項來完成設定。
- 若要從
default以外的 Red Hat OpenShift 專案,或從其他 IBM Cloud 帳戶拉取映像檔,請複製或建立另一個映像檔拉取密鑰。 - 若要限制對特定登錄資源(例如,名稱空間或地區)的映像檔取回密碼存取權,請執行下列動作:
- 若要從
使用映像拉取密鑰存取外部私有註冊庫中的映像
在您的叢集中設定專屬的映像檔拉取密鑰,以便將容器部署至 default 以外的 Red Hat OpenShift 專案、使用儲存於其他 IBM Cloud 帳戶中的映像檔,或使用儲存於外部私有註冊庫中的映像檔。 此外,您還可以建立自己的映像檔取回密碼來套用 IAM 存取原則,以限制對特定登錄映像檔、名稱空間或動作(例如 push 或 pull)的許可權。
建立映像檔取回密碼後,容器必須使用該密碼才有權從登錄中取回映像檔。 您可以將映像拉取密鑰新增至專案的服務帳戶中,或在每次部署時引用該密鑰。 如需指示,請參閱使用映像檔取回密碼部署容器。
映像拉取密鑰僅對其所建立的 Red Hat OpenShift 專案有效。 請針對您要部署容器的每個名稱空間,重複這些步驟。
開始之前:
若要使用自己的映像檔取回密碼,請在下列選項之間進行選擇:
- 複製影像提取密鑰 從預設的 Red Hat OpenShift 專案,複製到您叢集中的其他專案。
- 建立新的 IAM API 金鑰認證,並將其儲存在映像檔取回密碼中,以存取其他 IBM Cloud 帳戶中的映像檔,或是套用 IAM 原則來限制對特定登錄網域或名稱空間的存取權。
- 建立映像檔取回密碼,以存取外部專用登錄中的映像檔。
如果您已在專案中建立了一個影像拉取密鑰,並希望在部署時使用它,請參閱 《 使用已建立的 imagePullSecret 部署容器 》。
複製現有的映像檔取回密碼
您可以將影像拉取密鑰(例如為 default Red Hat OpenShift 專案自動建立的密鑰)複製到叢集中的其他專案。 若您希望針對此專案使用不同的 IBM Cloud IAM API 金鑰憑證(例如為了限制對特定專案的存取權限,或從其他 IBM Cloud 帳戶拉取影像),請改為使用 建立影像拉取密鑰。
-
列出您叢集中可用的 Red Hat OpenShift 專案,或建立一個專案以供使用。
oc get projects輸出範例
default Active ibm-cert-store Active ibm-system Active kube-public Active kube-system Active建立專案
oc new-project <project_name> -
列出
defaultRed Hat OpenShift 專案中,針對 IBM Cloud Container Registry 的現有影像拉取密鑰。oc get secrets -n default | grep icr-io輸出範例
all-icr-io kubernetes.io/dockerconfigjson 1 16d -
將
default專案中的「all-icr-io」映像拉取密鑰複製到您選擇的專案中。 新的映像拉取密鑰命名為<project_name>-icr-<region>-io。oc get secret all-icr-io -n default -o yaml | sed 's/default/<new-project>/g' | oc create -n <new-project> -f - -
驗證已順利建立密碼。
oc get secrets -n <project_name> | grep icr-io -
若要部署容器,請 新增映像檔取回密碼 至每一個部署或專案的服務帳戶,以便專案中的任何部署都可以從登錄取回映像檔。
使用不同的 IAM API 金鑰認證建立映像檔取回密碼
可以將 IBM Cloud IAM 存取原則指派給使用者或服務 ID,以將許可權作用對象限制為特定登錄映像檔名稱空間或動作(例如,push 或 pull)。 然後,建立 API 金鑰,並將這些登錄認證儲存在叢集的映像檔取回密碼中。
例如,若要存取其他 IBM Cloud 帳戶中的映像檔,請建立 API 金鑰,以將使用者或服務 ID 的 IBM Cloud Container Registry 認證儲存在該帳戶中。 接著,在您的叢集帳戶中,將 API 金鑰憑證儲存至每個叢集及叢集專案的「映像檔拉取機密」中。
下列步驟會建立 API 金鑰,用來儲存 IBM Cloud IAM 服務 ID 的認證。 您可能希望為具有對 IBM Cloud 的 IBM Cloud Container Registry IAM 服務存取原則的使用者 ID 建立 API 金鑰,而不使用服務 ID。 不過,請確定使用者是一個功能 ID,或具有可在使用者離開時讓叢集仍可存取登錄的方案。
-
列出您叢集中的可用 Red Hat OpenShift 專案,或建立一個專案,以便從您的註冊表映像檔部署容器。
oc get projects輸出範例
default Active ibm-cert-store Active ibm-system Active kube-public Active kube-system Active建立專案
oc new-project <project_name> -
建立叢集的 IBM Cloud IAM 服務 ID,以用於映像檔取回密碼中的 IAM 原則及 API 金鑰認證。 請務必為服務 ID 設定一個有助於您日後檢索該服務 ID 的描述,例如同時包含叢集名稱和專案名稱。
ibmcloud iam service-id-create <cluster_name>-<project>-id --description "Service ID for IBM Cloud Container Registry in Red Hat OpenShift on IBM Cloud cluster <cluster_name> project <project>" -
建立叢集服務 ID 的自訂 IBM Cloud IAM 原則,以授與 IBM Cloud Container Registry 的存取權。
ibmcloud iam service-policy-create <cluster_service_ID> --roles <service_access_role> --service-name container-registry [--region <IAM_region>] [--resource-type namespace --resource <registry_namespace>]cluster_service_ID- 必要。 請將此處替換為您先前為 Kubernetes 叢集所建立的「
<cluster_name>-<kube_namespace>-id」服務 ID。 --service-name container-registry- 必要。 輸入
container-registry,讓 IAM 原則適用於 IBM Cloud Container Registry。 --roles <service_access_role>- 必要。 請輸入您要對其設定服務 ID 存取範圍的「IBM Cloud Container Registry」服務存取角色。 可能值為
Reader、Writer及Manager。 --region <IAM_region>- 選用。 如果您要將存取原則範圍限定為特定 IAM 地區,請以逗點區隔清單輸入地區。 可能的值為
global及 local registry regiones。 --resource-type namespace --resource <registry_namespace>- 選用。 若要將存取權限限制為僅限於特定 IBM Cloud Container Registry 命名空間中的 圖片,請在「資源類型」欄位中輸入
namespace,並指定<registry_namespace>。 若要列出登錄名稱空間,請執行ibmcloud cr namespaces。
-
建立服務 ID 的 API 金鑰。 請將 API 金鑰命名為與您的服務 ID 相似的名稱,並包含您先前建立的服務 ID,
<cluster_name>-<kube_namespace>-id請務必提供 API 金鑰的說明,以協助您稍後擷取該金鑰。ibmcloud iam service-api-key-create <cluster_name>-<project>-key <cluster_name>-<project>-id --description "API key for service ID <service_id> in Red Hat OpenShift on IBM Cloud cluster <cluster_name> project <project>" -
從前一個指令的輸出中擷取 API 金鑰值。
Please preserve the API key! It can't be retrieved after it's created. Name <cluster_name>-<kube_namespace>-key Description key_for_registry_for_serviceid_for_kubernetes_cluster_multizone_namespace_test Bound To crn:v1:bluemix:public:iam-identity::a/1bb222bb2b33333ddd3d3333ee4ee444::serviceid:ServiceId-ff55555f-5fff-6666-g6g6-777777h7h7hh Created At 2019-02-01T19:06+0000 API Key i-8i88ii8jjjj9jjj99kkkkkkkkk_k9-llllll11mmm1 Locked false UUID ApiKey-222nn2n2-o3o3-3o3o-4p44-oo444o44o4o4 -
建立一個映像拉取密鑰,用以在叢集專案中儲存 API 金鑰憑證。 針對您要從中取回映像檔的每一個
icr.io網域,針對每一個叢集的每一個專案重複此步驟。oc --namespace <project> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=iamapikey --docker-password=<api_key_value> --docker-email=<docker_email>--namespace <project>- 必要。 請指定您在叢集中用於服務 ID 名稱的「Red Hat OpenShift」專案。
<secret_name>- 必要。 輸入映像檔取回密碼的名稱。
--docker-server <registry_URL>- 必要。 設定在其中設定登錄名稱空間的映像檔登錄 URL。 如需可用的網域,請參閱 本端地區。
--docker-username iamapikey- 必要。 請輸入使用者名稱以登入您的私人註冊庫。 如果您使用 IBM Cloud Container Registry,請輸入
iamapikey。 --docker-password <token_value>- 必要。 請輸入您先前取得之
API Key的值。 --docker-email <docker-email>- 必要。 如果您有 Docker 電子郵件位址,請輸入它。 若您沒有電子郵件地址,請輸入一個虛構的電子郵件地址,例如
a@b.c。 需要有此電子郵件才能建立 Kubernetes 密碼,但在建立之後就不再使用。
-
驗證已順利建立 Secret。 請將
替換為您建立映像拉取密鑰的project。oc get secrets --namespace <project> -
將映像拉取密鑰新增至 Kubernetes 服務帳戶,以便在您部署容器時,該專案中的任何 Pod 都能使用該映像拉取密鑰。
存取儲存在其他專用登錄中的映像檔
如果您已有專用登錄,則必須將登錄認證儲存在 Kubernetes 映像檔取回密碼中,然後從配置檔參照此密碼。
開始之前:
若要建立映像檔取回密碼,請執行下列動作:
-
建立用來儲存專用登錄認證的 Kubernetes 密碼。
oc --namespace <project> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email>--namespace <project>- 必要。 您所在叢集中,欲使用該機密並部署容器的 Red Hat OpenShift 專案。 若要列出叢集裡的可用專案,請執行
oc get projects。 <secret_name>- 必要。 您要用於映像檔取回密碼的名稱。
--docker-server <registry_URL>- 必要。 儲存專用映像檔的登錄的 URL。
--docker-username <docker_username>- 必要。 用於登入您的私人註冊庫的用戶名稱。
--docker-password <token_value>- 必要。 用來登入專用登錄的密碼,例如記號值。
--docker-email <docker-email>- 必要。 如果您有 Docker 電子郵件位址,請輸入它。 若您沒有電子郵件地址,請輸入一個虛構的電子郵件地址,例如
a@b.c。 需要有此電子郵件才能建立 Kubernetes 密碼,但在建立之後就不再使用。
-
驗證已順利建立 Secret。 將
<project>取代為您在其中建立映像檔取回密碼的專案名稱。oc get secrets --namespace <project>
使用映像檔取回密碼部署容器
您可以在 Pod 部署中定義一個映像檔拉取密鑰,或將該密鑰儲存於您的 Kubernetes 服務帳戶中,以便專案中所有未指定 Kubernetes 服務帳戶的部署皆可使用該密鑰。
若要規劃如何在叢集裡使用映像檔取回密碼,請在下列選項之間進行選擇。
- 關於您 Pod 部署中的映像拉取密鑰:若您不希望預設授予專案中所有 Pod 存取您註冊庫的權限,請使用此選項。 開發人員可以 在每一個必須存取登錄的 Pod 部署中包括映像檔取回密碼。
- 將映像拉取密鑰儲存於 Kubernetes 服務帳戶中:使用此選項,可授予選定的 Red Hat OpenShift 專案中所有部署對您註冊表中映像的存取權限。 若要在 Kubernetes 服務帳戶中儲存映像檔取回密碼,請使用 下列步驟。
將影像拉取密鑰儲存至所選專案的 Kubernetes 服務帳戶中
每個 Red Hat OpenShift 專案都有一組名為 default 的 Kubernetes 服務帳戶。 在專案內,您可以將映像檔取回密碼新增至此服務帳戶,以授與 Pod 從登錄取回映像檔的存取權。 若部署未指定服務帳戶,系統將自動使用此 Red Hat OpenShift 專案的 default 服務帳戶。
-
檢查預設服務帳戶是否已有映像檔取回密碼。
oc describe serviceaccount default -n <project_name>當「
<none>」顯示在「映像檔提取密鑰」欄位中時,表示不存在任何映像檔提取密鑰。 -
將映像檔取回密碼新增至預設服務帳戶。
- 當未定義映像拉取密鑰時,用於新增映像拉取密鑰的範例指令。
oc patch -n <project_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}' ``` - 當已定義映像拉取密鑰時,用於新增映像拉取密鑰的範例指令。 ```sh {: pre} oc patch -n <project_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]' ``` -
驗證映像檔取回密碼已新增至預設服務帳戶。
oc describe serviceaccount default -n <project_name>輸出範例
Name: default Namespace: <namespace_name> Labels: <none> Annotations: <none> Image pull secrets: <image_pull_secret_name> Mountable secrets: default-token-sh2dx Tokens: default-token-sh2dx Events: <none>如果 映像檔取回密碼 指出
<secret> (not found),請執行oc get secrets -n project,以驗證映像檔取回密碼存在於與服務帳戶相同的專案中。 -
建立名為
mypod.yaml的 Pod 配置檔,以從登錄中的 映像檔 部署容器。apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod-container image: <region>.icr.io/<project>/<image>:<tag> -
透過套用
mypod.yaml配置檔,在叢集中建立 Pod。oc apply -f mypod.yaml
設定叢集以取回授權軟體
您可以設定 Red Hat OpenShift on IBM Cloud 叢集以取回授權軟體,而此軟體是包裝於 IBM 授權您使用的 Helm Chart 的受保護容器映像檔集合。 授權軟體儲存在特殊 IBM Cloud Container Registry cp.icr.io 網域中。 若要存取此網域,您必須為您的叢集建立一個包含授權金鑰的映像檔拉取密鑰,並將此映像檔拉取密鑰新增至您欲部署此授權軟體的每個專案中的「Kubernetes」服務帳戶中。
開始之前: 存取 Red Hat OpenShift 叢集。
-
取得授權軟體程式庫的授權金鑰。
- 請登入 MyIBM.com,並向下捲動至「容器軟體庫」區段。 按一下檢視程式庫。
- 在「存取您的容器軟體」>「授權金鑰」頁面中,點選「複製金鑰」。 此金鑰可授權您存取容器軟體程式庫中的所有授權軟體。
-
在您欲部署已獲授權容器的專案中,請建立一個映像檔拉取密鑰,以便您能存取
cp.icr.io這個已獲授權的註冊表。 使用您先前擷取的 授權金鑰 作為--docker-password值。 如需相關資訊,請參閱存取儲存在其他專用登錄中的映像檔。oc create secret docker-registry entitled-cp-icr-io --docker-server=cp.icr.io --docker-username=cp --docker-password=<entitlement_key> --docker-email=<docker_email> -n <project> -
將映像拉取密鑰新增至命名空間的服務帳戶中,以便專案中的任何容器都能使用授權金鑰來拉取已獲授權的映像。 如需相關資訊,請參閱使用映像檔取回密碼部署容器。
oc patch -n <project> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]' -
在該專案中建立一個 Pod,用以從指定註冊表中的映像檔建構容器。
oc run <pod_name> --image=cp.icr.io/<image_name> -n <project> --generator=run-pod/v1 -
驗證 Pod 處於執行中狀態,以確認可以順利從授權映像檔建置容器。
oc get pod <pod_name> -n <project>
想知道下一步嗎? 您可以設定授權 Helm Chart 儲存庫,其中儲存了包含授權軟體的 Helm Chart。 如果已在叢集裡安裝 Helm,請執行 helm repo add entitled https://raw.githubusercontent.com/IBM/charts/master/repo/entitled。
將專用登錄新增至廣域取回密鑰
RHEL 工作節點
在僅使用 RHEL 工作者節點的叢集中,您可以設定全局影像拉取秘訣,叢集中的每個工作者節點都可以使用該秘訣從私有註冊表中拉取影像。
依預設,Red Hat OpenShift on IBM Cloud 叢集具有下列登錄的廣域映像檔取回密碼,因此可以部署預設 Red Hat OpenShift 元件。
cloud.openshift.comquay.ioregistry.connect.redhat.comregistry.redhat.io
請勿將全域拉取密鑰替換為不具備預設 Red Hat 註冊表憑證的拉取密鑰。 若您這麼做,叢集內預設安裝 Red Hat OpenShift 的元件(例如) OperatorHub, 可能會發生故障,因為它們無法從這些註冊表拉取映像檔。
開始之前:
- 下載
jqJSON 處理器指令行套件。 您可以使用jq來結合預設廣域取回密鑰的 JSON 值與您要新增的專用登錄取回密鑰。 - 存取您的 Red Hat OpenShift 叢集。
如果要新增專用登錄,請編輯 openshift-config 專案中的廣域 pull-secret。
-
建立密鑰值,以保留認證來存取您的專用登錄,並將解碼的密鑰值儲存在 JSON 檔案中。 當您建立密鑰值時,認證會自動編碼為 base64。 透過使用
--dry-run選項,僅會建立密碼值,而不會在叢集裡建立密碼物件。 然後,解碼的密鑰值會儲存在 JSON 檔案中,以供稍後在廣域取回密鑰中使用。oc create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email> --dry-run=true --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > myregistryconfigjson--namespace <project>- 必要。 您所在叢集中,欲使用該機密並部署容器的 Red Hat OpenShift 專案。 若要列出叢集裡的可用專案,請執行
oc get ns。 <secret_name>- 必要。 您要用於映像檔取回密碼的名稱。
--docker-server <registry_URL>- 必要。 儲存專用映像檔的登錄的 URL。
--docker-username <docker_username>- 必要。 用於登入您的私人註冊庫的用戶名稱。
--docker-password <token_value>- 必要。 用來登入專用登錄的密碼,例如記號值。
--docker-email <docker-email>- 必要。 如果您有 Docker 電子郵件位址,請輸入它。 若您沒有電子郵件地址,請輸入一個虛構的電子郵件地址,例如
a@b.c。 需要有此電子郵件才能建立 Kubernetes 密碼,但在建立之後就不再使用。 --dry-run=true- 包含此選項只會建立密碼值,而不會在叢集裡建立及儲存密碼物件。
--output="jsonpath={.data.\.dockerconfigjson}"- 僅從 Kubernetes 密鑰的資料區段取得
.dockerconfigjson值。 | base64 --decode > myregistryconfigjson- 將已解碼的密鑰資料下載至本端
myregistryconfigjson檔案。
-
擷取預設廣域取回密鑰的解碼密鑰值,並將該值儲存在
dockerconfigjson檔案中。oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > dockerconfigjson -
將下載的專用登錄取回密碼
myregistryconfigjson檔與預設廣域取回密碼dockerconfigjson檔結合。jq -s '.[0] * .[1]' dockerconfigjson myregistryconfigjson > dockerconfigjson-merged -
使用結合的
dockerconfigjson-merged檔案更新廣域取回密鑰。oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=dockerconfigjson-merged -
驗證已更新廣域取回密鑰。 檢查您的專用登錄及每一個預設 Red Hat 登錄是否位於下列指令的輸出中。
oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode輸出範例
{ "auths": { "cloud.openshift.com": { "auth": "<encoded_string>", "email": "email@example.com" }, "quay.io": { "auth": "<encoded_string>", "email": "email@example.com" }, "registry.connect.redhat.com": { "auth": "<encoded_string>", "email": "email@example.com" }, "registry.redhat.io": { "auth": "<encoded_string>", "email": "email@example.com" }, "<private_registry>": { "username": "iamapikey", "password": "<encoded_string>", "email": "email@example.com", "auth": "<encoded_string>" } } } -
若要挑選廣域配置變更,請重新載入叢集裡的所有工作者節點。
- 記下叢集裡工作者節點的 ID。
ibmcloud oc worker ls -c <cluster_name_or_ID> ``` 1. **對於標準叢集** 重新載入每一個工作者節點。 您可以透過包括多個 `-w` 選項來重新載入多個工作者節點,但請確保同時有足夠的工作者節點在執行中,以讓您的應用程式避免中斷。 ```sh {: pre} ibmcloud oc worker reload -c <cluster_name_or_ID> -w <workerID_1> -w <workerID_2> ``` 1. **對於 VPC 叢集** 更換每一個工作者節點。 開始之前,請確保叢集具有足夠的其他工作者節點,以便 Pod 可以重新排程並繼續執行。 ```sh {: pre} ibmcloud oc worker replace --cluster <cluster_name_or_ID> --worker <worker_node_ID> ``` -
在工作者節點回到正常狀態之後,請驗證已在工作者節點上更新廣域取回密碼。
- 啟動除錯 Pod 以登入工作者節點。 使用您先前針對
<node_name>所擷取的 專用 IP。
oc debug node/<node_name> ``` 1. 將根目錄切換至主機,以便您可以檢視工作者節點上的檔案。 ```sh {: pre} chroot /host ``` 1. 驗證 Docker 配置檔具有符合您所設定廣域取回密碼的登錄認證。 ```sh {: pre} vi /.docker/config.json ``` - 啟動除錯 Pod 以登入工作者節點。 使用您先前針對
更新全域拉取密鑰
RHCOS 工作節點 RHEL 工作節點
在使用 RHCOS Worker 或 RHCOS 與 RHEL Worker 組合的群集中,您可以完成下列步驟,以更新 Red Hat OpenShift on IBM Cloud 群集中的全局拉取秘 密。
依預設,Red Hat OpenShift on IBM Cloud 叢集具有下列登錄的廣域映像檔取回密碼,因此可以部署預設 Red Hat OpenShift 元件。
cloud.openshift.comquay.ioregistry.connect.redhat.comregistry.redhat.io
請勿將全域拉取密鑰替換為不具備預設 Red Hat 註冊表憑證的拉取密鑰。 若您這麼做,叢集內預設安裝 Red Hat OpenShift 的元件(例如) OperatorHub, 可能會發生故障,因為它們無法從這些註冊表拉取映像檔。
- 建立一個包含您要使用的登錄憑證的金鑰。
oc create secret docker-registry docker-auth-secret \ --docker-server=REGISTRY \ --docker-username=USERNAME \ --docker-password=PASSWORD \ --namespace kube-system - 建立一個DaemonSet以在所有工作節點上套用機密。
ocp_release_pull_secret_image=$(oc get ds -n openshift-dns node-resolver -o jsonpath='{.spec.template.spec.containers[0].image}') cat << EOF | oc create -f - apiVersion: apps/v1 kind: DaemonSet metadata: name: update-docker-config namespace: kube-system labels: app: update-docker-config spec: selector: matchLabels: name: update-docker-config template: metadata: labels: name: update-docker-config spec: initContainers: - command: ["/bin/sh", "-c"] args: - > echo "Checking if RHEL or RHCOS host"; [[ -s /docker-config/.docker/config.json ]] && CONFIG_PATH=/docker-config/.docker || CONFIG_PATH=/docker-config/root/.docker; echo "Backing up or restoring config.json"; [[ -s \$CONFIG_PATH/config.json ]] && cp \$CONFIG_PATH/config.json \$CONFIG_PATH/config.json.bak || cp \$CONFIG_PATH/config.json.bak \$CONFIG_PATH/config.json; echo "Merging secret with config.json"; /host/usr/bin/jq -s '.[0] * .[1]' \$CONFIG_PATH/config.json /auth/.dockerconfigjson > \$CONFIG_PATH/config.tmp; mv \$CONFIG_PATH/config.tmp \$CONFIG_PATH/config.json; echo "Sending signal to reload crio config"; pidof crio; kill -1 \$(pidof crio) image: ${ocp_release_pull_secret_image} imagePullPolicy: IfNotPresent name: updater resources: {} securityContext: privileged: true volumeMounts: - name: docker-auth-secret mountPath: /auth - name: docker mountPath: /docker-config - name: bin mountPath: /host/usr/bin - name: lib64 mountPath: /lib64 containers: - resources: requests: cpu: 0.01 image: ${ocp_release_pull_secret_image} name: sleepforever command: ["/bin/sh", "-c"] args: - > while true; do sleep 100000; done hostPID: true volumes: - name: docker-auth-secret secret: secretName: docker-auth-secret - name: docker hostPath: path: / - name: bin hostPath: path: /usr/bin - name: lib64 hostPath: path: /lib64 hostPathType: Directory EOF - 驗證 Pod 正在運作。
oc get daemonset -n kube-system update-docker-config
更新 IBM Cloud Kubernetes Service containerd 自訂登錄配置
使用 Kubernetes 1.22 版或更新版本,您可以在工作者節點上使用容器配置檔來配置從容器登錄取回。 您可以使用 daemonset 來更新叢集中所有節點之間的配置,這可防止在工作者節點重新載入或新增工作者時抹除配置。
更新 containerd 自訂登錄配置的 daemonset 範例
使用範例 YAML 檔案來定義在所有工作者節點上執行的 daemonset,以設定或更新 containerd 登錄主機配置,並裝載至對應的 containerd 登錄路徑。
此範例設定 dockerhub 的下列登錄主機配置。 已提供此登錄主機配置,並在工作者節點佈建階段期間自動配置。 在部署之後及工作者節點重新載入或重新啟動之後,init 儲存器會在每個工作者節點上起始設定 hosts.toml。
server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
YAML 檔案範例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
name: containerd-dockerhub-registry-config
name: containerd-dockerhub-registry-config
namespace: kube-system
spec:
selector:
matchLabels:
name: containerd-dockerhub-registry-config
template:
metadata:
labels:
name: containerd-dockerhub-registry-config
spec:
initContainers:
- image: alpine:3.13.6
name: containerd-dockerhub-registry-config
command:
- /bin/sh
- -c
- |
#!/bin/sh
set -uo pipefail
cat << EOF > /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
EOF
volumeMounts:
- mountPath: /etc/containerd/certs.d/docker.io/
name: dockerhub-registry-config
containers:
- name: pause
image: "us.icr.io/armada-master/pause:3.5"
imagePullPolicy: IfNotPresent
volumes:
- name: dockerhub-registry-config
hostPath:
path: /etc/containerd/certs.d/docker.io/
如需更新 containerd 登錄主機配置的相關資訊,請參閱 containerd 文件。