本教學課程說明如何在 Google Distributed Cloud (GDC) 氣隙裝置環境中上傳容器應用程式,並在裝置環境中執行該應用程式。在本教學課程中,您將瞭解如何建立 Harbor 專案、將映像檔上傳至 Harbor,以及建立工作負載。容器化工作負載會在專案命名空間中執行。
GDC 氣隙隔離裝置環境會預先設定名為 tear-harbor
的 Harbor 登錄檔,供您在名為 tear
的 GDC 專案中使用。您將在本範例中使用這個登錄檔。
本教學課程使用 Artifact Registry 提供的範例網頁伺服器應用程式。 Google Cloud
目標
- 將容器映像檔推送至受管理 Harbor 登錄檔。
- 將範例容器應用程式部署至叢集。
事前準備
請確認您有專案可管理容器化部署作業。 如果沒有專案,請建立專案。
將專案命名空間設為環境變數:
export NAMESPACE=PROJECT_NAMESPACE
請機構 IAM 管理員授予下列角色:
專案命名空間的命名空間管理員角色 (
namespace-admin
)。 您必須具備這個角色,才能在專案中部署容器工作負載。專案命名空間的 Harbor 執行個體檢視者角色 (
harbor-instance-viewer
)。需要具備這個角色身分才能查看及選取 Harbor 執行個體。專案命名空間的 Harbor 專案建立者角色 (
harbor-project-creator
)。您必須具備這個角色,才能存取及管理 Harbor 專案。
登入 Kubernetes 叢集,並使用使用者身分產生 kubeconfig 檔案。請務必將 kubeconfig 路徑設為環境變數:
export KUBECONFIG=CLUSTER_KUBECONFIG
在登錄檔中建立 Harbor 專案
GDC 提供 Harbor 即服務,這是一項全代管服務,可讓您使用 Harbor 儲存及管理容器映像檔。
如要使用 Harbor as a Service,您必須在 tear-harbor
登錄執行個體中建立 Harbor 專案,以便管理容器映像檔:
您需要
tear-harbor
的網址。列出執行個體的網址:gdcloud harbor instances describe tear-harbor --project=tear
輸出內容類似於
harbor-1.org-1.zone1.google.gdc.test
。將執行個體網址設為變數,以供本教學課程稍後使用:
export INSTANCE_URL=INSTANCE_URL
建立專案前,請務必使用上一步的網址登入 Harbor。使用瀏覽器開啟這個網址,並登入 Harbor 執行個體。
建立 Harbor 專案:
gdcloud harbor harbor-projects create HARBOR_PROJECT \ --project=tear \ --instance=tear-harbor
將
HARBOR_PROJECT
替換為要建立的 Harbor 專案名稱。您無法在任何專案命名空間中建立 Harbor 專案。您必須使用tear
專案。將 Harbor 專案名稱設為變數,以便在後續教學課程中使用:
export HARBOR_PROJECT=HARBOR_PROJECT
設定 Docker
如要在 Harbor 登錄檔中使用 Docker,請完成下列步驟:
設定 Docker,將 Harbor as a Service 設為信任來源。詳情請參閱「設定 Docker 信任 Harbor 根層級 CA」。
設定 Docker 驗證機制,以便存取 Harbor。詳情請參閱「為 Harbor 登錄檔執行個體設定 Docker 驗證」。
由於
tear-harbor
是預先設定的 Harbor 登錄檔,您必須信任由 Google Distributed Cloud Air-gapped 內部 CA 簽署的憑證:請向 IO 索取下列資訊:
- Harbor 叢集的外部網址。
- Google Distributed Cloud 氣隙隔離內部 CA 的
.crt
檔案。檔案通常會以anthos-creds
命名空間中的trust-store-internal-only
名稱,以密鑰形式儲存在控制平面。
與上一個步驟類似,建立以 Harbor 叢集外部網址命名的資料夾,並將
.crt
檔案保留在該資料夾中。
建立 Kubernetes 映像檔提取密鑰
由於您使用的是私人 Harbor 專案,因此必須建立 Kubernetes 映像檔提取密鑰。
新增 Harbor 專案機器人帳戶。按照 Harbor 使用者介面中的步驟建立機器人帳戶,並複製機器人密鑰權杖: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account。
請注意新的機器人專案帳戶名稱,其語法如下:
<PREFIX><PROJECT_NAME>+<ACCOUNT_NAME>
舉例來說,機器人專案帳戶名稱格式類似
harbor@library+artifact-account
。如要進一步瞭解如何在 Harbor 中找出機器人專案帳戶名稱,請參閱 Harbor 說明文件: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#view-project-robot-accounts。
使用 Harbor 專案機器人帳戶和密碼權杖登入 Docker:
docker login ${INSTANCE_URL}
系統提示時,請插入
Username
的機器人專案帳戶名稱和Password
的密鑰權杖。為映像檔提取密鑰設定任意名稱:
export SECRET=SECRET
建立映像檔提取作業所需的密鑰:
kubectl create secret docker-registry ${SECRET} \ --from-file=.dockerconfigjson=DOCKER_CONFIG \ -n NAMESPACE
更改下列內容:
DOCKER_CONFIG
:.docker/config.json
檔案的路徑。NAMESPACE
:您建立的密鑰命名空間。
將容器映像檔推送至代管 Harbor 登錄檔
在本教學課程中,您將下載 nginx
網路伺服器映像檔並推送至代管的 Harbor 登錄檔,然後使用該映像檔將範例 nginx 網路伺服器應用程式部署至 Kubernetes 叢集。nginx 網路伺服器應用程式可從公開的 Google Cloud Artifact Registry 取得。
使用外部網路,將
nginx
映像檔從 Google Cloud Artifact Registry 提取至本機工作站:docker pull gcr.io/cloud-marketplace/google/nginx:1.25
設定圖片名稱。完整圖片名稱的格式如下:
${INSTANCE_URL}/${HARBOR_PROJECT}/nginx
使用存放區名稱標記本機映像檔:
docker tag gcr.io/cloud-marketplace/google/nginx:1.25 ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
將
nginx
容器映像檔推送到受管理 Harbor 登錄檔:docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
部署範例容器應用程式
您現在可以將 nginx
容器映像檔部署至設備叢集。
Kubernetes 會以 Pod
資源的形式呈現應用程式,Pod 是可擴充的單位,其中包含一或多個容器。Pod 是 Kubernetes 中最小的可部署單位。通常,您會部署一組可擴充的 Pod 副本,並將這些副本一起分散到叢集各處。您可以透過 Kubernetes Deployment
部署一組副本。
在本節中,您將建立 Kubernetes Deployment
,以便在叢集上執行 nginx
容器應用程式。這個 Deployment 有備用資源或 Pod。一個 Deployment
Pod 只包含一個容器:nginx
容器映像檔。您也會建立 Service
資源,為用戶提供穩定方式,將要求傳送至 Deployment
的 Pod。
部署 nginx 網路伺服器:
建立及部署 Kubernetes
Deployment
和Service
自訂資源:kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \ create -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25 ports: - containerPort: 80 imagePullSecrets: - name: ${SECRET} --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - port: 80 protocol: TCP type: LoadBalancer EOF
確認 Deployment 已建立 Pod:
kubectl get pods -l app=nginx -n ${NAMESPACE}
輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE nginx-deployment-1882529037-6p4mt 1/1 Running 0 1h nginx-deployment-1882529037-p29za 1/1 Running 0 1h nginx-deployment-1882529037-s0cmt 1/1 Running 0 1h
建立網路政策,允許所有網路流量進入命名空間:
kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \ create -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: annotations: name: allow-all spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 podSelector: {} policyTypes: - Ingress EOF
匯出
nginx
服務的 IP 位址:export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \ -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
使用
curl
測試nginx
伺服器 IP 位址:curl http://$IP
後續步驟
- 如要瞭解如何管理容器,請參閱容器說明文件。