本教程介绍了如何在 Google Distributed Cloud (GDC) 气隙设备环境中上传容器应用,并在该设备环境中运行该应用。在本教程中,您将学习如何创建 Harbor 项目、将映像上传到 Harbor 以及创建工作负载。容器化工作负载在项目命名空间内运行。
GDC 经过网闸隔离的设备环境随附一个名为 tear-harbor
的预配置 Harbor 注册表,位于名为 tear
的 GDC 项目中。您将在此示例中使用此注册表。
本教程使用 Artifact Registry 中提供的示例 Web 服务器应用。 Google Cloud
目标
- 将容器映像推送到受管理的 Harbor 注册表。
- 将示例容器应用部署到集群。
准备工作
确保您拥有一个项目来管理容器化部署。 如果您还没有项目,请创建一个项目。
将项目命名空间设置为环境变量:
export NAMESPACE=PROJECT_NAMESPACE
请让您的组织 IAM 管理员为您授予以下角色:
项目命名空间的 Namespace Admin 角色 (
namespace-admin
)。 您需要此角色才能在项目中部署容器工作负载。项目的 Harbor Instance Viewer 角色 (
harbor-instance-viewer
)。需要此角色才能查看和选择 Harbor 实例。项目命名空间的 Harbor Project Creator 角色 (
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 的身份验证。如需了解详情,请参阅配置 Docker 身份验证以用于 Harbor 注册表实例。
由于
tear-harbor
是预配置的 Harbor 注册表,因此您必须信任由 Google Distributed Cloud 气隙内部 CA 签名的证书:向您的 IO 询问以下信息:
- Harbor 集群的外部网址。
- 经过网闸隔离的 Google Distributed Cloud 内部 CA 的
.crt
文件。该文件通常以trust-store-internal-only
名称作为 Secret 存储在控制平面中,位于anthos-creds
命名空间中。
与上一步类似,创建一个以 Harbor 集群的外部网址命名的文件夹,并将
.crt
文件保留在该文件夹中。
创建 Kubernetes 映像拉取 Secret
由于您使用的是专用 Harbor 项目,因此必须创建 Kubernetes 映像拉取 Secret。
添加 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
插入 Secret 令牌。为映像拉取 Secret 设置任意名称:
export SECRET=SECRET
创建拉取映像所需的 Secret:
kubectl create secret docker-registry ${SECRET} \ --from-file=.dockerconfigjson=DOCKER_CONFIG \ -n NAMESPACE
替换以下内容:
DOCKER_CONFIG
:.docker/config.json
文件的路径。NAMESPACE
:您创建的 Secret 的命名空间。
将容器映像推送到受管理的 Harbor 注册表
在本教程中,您将下载 nginx
Web 服务器映像并将其推送到受管理的 Harbor 注册表中,然后使用该映像将示例 nginx Web 服务器应用部署到 Kubernetes 集群。nginx Web 服务器应用可从公共 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 是 Kubernetes 中最小的可部署单元。通常,您可以将 Pod 部署为可扩缩并分布在整个集群中的副本集。部署副本集的一种方法是通过 Kubernetes Deployment
。
在本部分中,您将创建一个 Kubernetes Deployment
,以便在集群上运行 nginx
容器应用。此 Deployment 具有副本或 pod。一个 Deployment
pod 仅包含一个容器:即 nginx
容器映像。您还可以创建一个 Service
资源,为客户端提供稳定的方法来向 Deployment
的 pod 发送请求。
部署 Nginx Web 服务器:
创建并部署 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
验证部署是否已创建 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
后续步骤
- 如需了解如何管理容器,请参阅容器文档。