部署容器化网络服务器应用


本教程介绍如何在完全隔离的 Google Distributed Cloud (GDC) 环境中上传容器应用,并在 Kubernetes 集群上运行该应用。容器化工作负载在项目命名空间内的 Kubernetes 集群上运行。集群在逻辑上与项目和彼此分离,以提供不同的故障网域和隔离保证。不过,您必须确保集群已关联到项目,以便在项目中管理容器化工作负载。

部署容器应用的最大障碍之一是将应用的二进制文件传输到与外界隔绝的数据中心。与您的基础架构团队和管理员合作,将应用传输到工作站,或直接在持续集成和持续交付 (CI/CD) 服务器上实现本教程。

本教程使用 Artifact Registry 中提供的示例 Web 服务器应用。 Google Cloud

目标

  • 创建受管理的 Harbor 注册表。
  • 将容器映像推送到受管理的 Harbor 注册表。
  • 创建 Kubernetes 集群。
  • 将示例容器应用部署到集群。

费用

由于 GDC 旨在经过网闸隔离的数据中心内运行,因此结算流程和信息仅限于 GDC 部署,不受其他 Google 产品管理。

如需根据您的预计使用量来估算费用,请使用价格计算器

您可以使用“预计费用”信息中心来预测账单中未来 SKU 的费用。

如需跟踪存储和计算消耗量,请使用结算使用情况信息中心

准备工作

  1. 确保您拥有一个项目来管理容器化部署。 如果您还没有项目,请创建一个项目

  2. 将项目命名空间设置为环境变量:

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. 下载并安装 gdcloud CLI

  4. 请让您的组织 IAM 管理员为您授予以下角色:

    • 项目命名空间的 Namespace Admin 角色 (namepspace-admin)。 此角色是必需的,用于在项目中部署容器工作负载。

    • 项目命名空间的 Harbor Instance Admin 角色 (harbor-instance-admin)。此角色是读写所有 Harbor 资源所必需的。删除 Harbor 实例也需要此权限。

    • 项目命名空间的 Harbor Instance Viewer 角色 (harbor-instance-viewer)。需要此角色才能查看和选择 Harbor 实例。

    • 项目命名空间的 Harbor Project Creator 角色 (harbor-project-creator)。此角色是访问和管理 Harbor 项目所必需的。

    • 用户集群管理员角色 (user-cluster-admin)。此角色是创建 Kubernetes 集群所必需的,并且不绑定到命名空间。

  5. 登录到区域管理 API 服务器,并使用用户身份生成其 kubeconfig 文件。将 kubeconfig 路径设置为环境变量:

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

创建受管理的 Harbor 注册表

GDC air-gapped 提供 Harbor 即服务,这是一项全代管式服务,可让您使用 Harbor 存储和管理容器映像。

如需将 Harbor 用作服务,您必须先创建 Harbor 注册表实例和 Harbor 项目。

创建 Harbor 注册表实例

如需创建 Harbor 容器注册表实例,请完成以下步骤:

控制台

  1. 在导航菜单中,从 CI/CD 部分选择 Harbor 容器注册表

  2. 选择要在哪个可用区中创建 Harbor 实例。Harbor 实例是可用区级资源,必须在每个可用区中手动创建,以确保高可用性。

  3. 点击创建实例

  4. 输入实例的名称,并接受 Harbor 托管式服务条款。

  5. 点击创建实例

  6. 确认您的新 Harbor 实例是否已显示在 Harbor 实例部分。

  7. 点击前往 Harbor 实例外部链接,并记下实例网址。例如,实例网址格式类似于 harbor-1.org-1.zone1.google.gdc.test。实例网址不得包含 https:// 前缀。

  8. 将实例网址设置为变量,以便在本教程的后续部分中使用:

    export INSTANCE_URL=INSTANCE_URL
    

    INSTANCE_URL 替换为 Harbor 代码库实例的网址。

    例如:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

gdcloud

  1. 创建新的 Harbor 容器注册表实例:

    gdcloud harbor instances create INSTANCE_NAME \
        --project=PROJECT \
    

    替换以下内容:

    • INSTANCE_NAME:Harbor 实例的名称。
    • PROJECT:GDC 项目的名称。
  2. 列出实例的网址:

    gdcloud harbor instances describe INSTANCE_NAME \
        --project=PROJECT
    

    输出类似于以下内容:

    # Several lines of code are omitted here.
    status:
      url: https://harbor-1.org-1.zone1.google.gdc.test
    
  3. 将实例网址设置为变量,以便在本教程的后续部分中使用:

    export INSTANCE_URL=INSTANCE_URL
    

    INSTANCE_URL 替换为 Harbor 代码库实例的网址。请确保实例网址不包含 https:// 前缀。

    例如:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

在注册表中创建 Harbor 项目

您必须在 Harbor 注册表实例中创建一个 Harbor 项目,才能管理容器映像:

控制台

  1. Harbor Container Registry 页面中,点击 Create A Harbor Project

  2. 输入项目的名称。

  3. 点击创建

  4. 将 Harbor 项目名称设置为一个变量,以便在本教程后面部分使用:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

gdcloud

  1. 创建新的 Harbor 项目:

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=PROJECT \
        --instance=INSTANCE_NAME
    

    替换以下内容:

    • HARBOR_PROJECT:要创建的 Harbor 项目的名称。
    • PROJECT:GDC 项目的名称。
    • INSTANCE_NAME:Harbor 实例的名称。
  2. 将 Harbor 项目名称设置为一个变量,以便在本教程后面部分使用:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

配置 Docker

如需在 Harbor 注册表中运行 Docker,请完成以下步骤:

  1. 将 Docker 配置为信任 Harbor as a Service。如需了解详情,请参阅配置 Docker 以信任 Harbor 根 CA

  2. 配置 Docker 对 Harbor 的身份验证。如需了解详情,请参阅配置 Docker 身份验证以用于 Harbor 注册表实例

创建 Kubernetes 映像拉取 Secret

由于您使用的是专用 Harbor 项目,因此必须创建 Kubernetes 映像拉取 Secret。

  1. 添加一个 Harbor 项目机器人账号作为您的服务账号。

    1. 在 Harbor 控制台中,选择您的 Harbor 项目。

    2. 点击机器人账号

    3. 选择新建机器人账号

    4. 为新的机器人账号命名,并定义任何其他设置。

    5. 点击添加

    6. 成功屏幕上会显示机器人账号名称和密钥。 请保持此界面处于打开状态,以便在下一步中参考。

    如需了解详情,请参阅 Harbor 的文档:https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account

  2. 在新的终端窗口中,使用 Harbor 项目机器人账号和密钥令牌登录 Docker:

    docker login ${INSTANCE_URL}
    

    当系统提示时,请在用户名中插入机器人项目名称,并在密码中插入上一步中从 Harbor 控制台成功屏幕上获得的密钥令牌。

  3. 为映像拉取 Secret 设置任意名称:

    export SECRET=SECRET
    
  4. 创建拉取映像所需的 Secret:

    kubectl create secret docker-registry ${SECRET}  \
        --from-file=.dockerconfigjson=DOCKER_CONFIG \
        -n ${NAMESPACE}
    

    DOCKER_CONFIG 替换为 .docker/config.json 文件的路径。

  5. 确认您的 Secret 是否位于 GDC 项目命名空间中:

    kubectl get secrets -n ${NAMESPACE}
    

    输出类似于以下内容:

    NAME          TYPE                               DATA     AGE
    my-secret     kubernetes.io/dockerconfigjson     1        23s
    

将容器映像推送到受管理的 Harbor 注册表

在本教程中,您将下载 nginx Web 服务器映像并将其推送到受管理的 Harbor 注册表中,然后使用该映像将示例 nginx Web 服务器应用部署到 Kubernetes 集群。nginx Web 服务器应用可从公共 Docker Hub 代码库获取。

  1. 使用外部网络将 nginx 映像从 Docker Hub 拉取到本地工作站:

    docker pull nginx
    
  2. 使用代码库名称标记本地映像:

    docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  3. nginx 容器映像推送到您的受管 Harbor 注册表:

    docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    

创建一个 Kubernetes 集群

现在,您已将 nginx 容器映像存储在受管理的 Harbor 注册表中,并且可以访问该映像,接下来请创建一个 Kubernetes 集群来运行 nginx Web 服务器。

控制台

  1. 在导航菜单中,依次选择 Kubernetes Engine > 集群

  2. 点击创建集群

  3. 名称字段中,指定集群的名称。

  4. 选择要在其中创建 Kubernetes 集群的可用区。Kubernetes 集群是可用区级资源,必须在每个地区中手动创建,以确保高可用性。

  5. 点击关联项目,然后选择要关联到集群的项目。 然后点击保存

  6. 点击创建

  7. 等待集群创建完成。当集群可供使用时,集群名称旁边会显示状态 READY

API

  1. 创建 Cluster 自定义资源并将其保存为 YAML 文件,例如 cluster.yaml

    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: platform
    

    CLUSTER_NAME 值替换为集群的名称。

  2. 将自定义资源应用到您的 GDC 实例:

    kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
    
  3. 使用 GDC 控制台将项目关联到 Kubernetes 集群。目前,您无法使用 API 将项目附加到集群。

如需详细了解如何创建 Kubernetes 集群,请参阅创建 Kubernetes 集群

部署示例容器应用

现在,您可以将 nginx 容器映像部署到 Kubernetes 集群了。

Kubernetes 将应用表示为 Pod 资源,这是可伸缩的单元,包含一个或多个容器。Pod 是 Kubernetes 中最小的可部署单元。通常,您可以将 Pod 部署为可扩缩并分布在整个集群中的副本集。部署副本集的一种方法是通过 Kubernetes Deployment 来完成操作。

在本部分中,您将创建一个 Kubernetes Deployment,以便在集群上运行 nginx 容器应用。此 Deployment 具有副本或 pod。一个 Deployment pod 仅包含一个容器:即 nginx 容器映像。您还可以创建一个 Service 资源,为客户端提供稳定的方法来向 Deployment 的 pod 发送请求。

将 Nginx Web 服务器部署到 Kubernetes 集群:

  1. 登录到 Kubernetes 集群,并使用用户身份生成其 kubeconfig 文件。将 kubeconfig 路径设置为环境变量:

    export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
    
  2. 创建并部署 Kubernetes DeploymentService 自定义资源:

    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
    
  3. 验证部署是否已创建 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
    
  4. 创建网络政策以允许所有网络流量进入命名空间:

    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
    
  5. 导出 nginx 服务的 IP 地址:

      export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  6. 使用 curl 测试 nginx 服务器 IP 地址:

      curl http://$IP
    

清理

为避免因本教程中使用的资源导致您的 GDC 账号产生费用,您必须删除您创建的资源。

删除容器映像

如需从 GDC 隔网环境中删除容器映像,您可以删除包含该映像的 Harbor 实例,也可以保留 Harbor 实例,只删除单个容器映像。

如需从受管理的 Harbor 注册表中删除容器映像,请使用 GDC 控制台:

  1. 在导航菜单中,从 CI/CD 部分选择 Harbor 容器注册表

  2. 点击前往 Harbor 实例外部链接。

  3. 使用 Harbor 界面删除容器映像。如需了解详情,请参阅删除 Harbor 注册表实例

删除容器应用

如需删除已部署的容器应用,请删除包含这些资源的 GDC 项目,或者保留 GDC 项目但删除各个资源。

要逐个删除资源,请完成以下步骤:

  1. 删除容器应用的 Service 对象:

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. 删除容器应用的 Deployment 对象:

    kubectl delete deployment nginx-deployment -n ${NAMESPACE}
    
  3. 如果您仅为此教程创建了测试 Kubernetes 集群,请将其删除:

    kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \
        -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
    

    此命令将删除构成 Kubernetes 集群的资源,如计算实例、磁盘和网络资源:

后续步骤