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

借助 Google Distributed Cloud (GDC) 网闸隔离配置中的共享集群,您可以在整个组织的隔离故障域中运行容器化应用。将一个工作负载附加到项目后,您可以在专用命名空间中管理这些工作负载。在本教程中,您将配置一个代管式 Harbor 注册表,从 Docker Hub 推送示例 NGINX 映像,并部署 Web 服务器。

此工作流适用于应用运营商组中为组织创建工作负载的开发者。如需了解详情,请参阅 GDC 网闸隔离配置文档的受众群体。

目标

  • 创建托管式 Harbor 注册表。
  • 将容器映像推送到代管式 Harbor 注册表。
  • 创建共享 Kubernetes 集群。
  • 将示例容器应用部署到集群。

费用

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

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

使用预计费用信息中心预测账单的未来 SKU 费用。

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

准备工作

如需完成本文档中的任务,您必须请求必要的权限并准备环境。

与您的基础架构团队和管理员合作,将应用二进制文件传输到经过网闸隔离的工作站,或直接在持续集成和持续交付 (CI/CD) 服务器上运行本教程。

申请 IAM 角色

您必须拥有特定角色,才能获得完成本教程工作流所需的权限。您必须请求范围限定为您的项目和组织的角色。

组织角色

如需创建、删除、修改或查看共享 Kubernetes 集群,请让您的 IAM 组织管理员为您授予用户集群管理员 (user-cluster-admin) 角色。此角色未绑定到命名空间。

如果您没有创建共享集群的权限,请让平台管理员为您创建一个。

项目角色

请让您的 IAM 项目管理员根据要执行的任务,在项目命名空间中为您授予以下角色:

  • 命名空间管理员 (namepspace-admin):创建、删除、修改和查看项目资源。在项目中部署容器工作负载需要此角色。

  • Harbor Instance Admin (harbor-instance-admin):创建、删除、修改和查看 Harbor 资源,包括 Harbor 实例。

  • Harbor Instance Viewer (harbor-instance-viewer):查看和选择 Harbor 实例。

  • Harbor Project Creator (harbor-project-creator):创建和查看 Harbor 项目。

准备环境

如需完成本文档,您必须拥有以下资源:

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

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

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

  4. 登录可用区级 Management API 服务器,并使用用户身份生成其 kubeconfig 文件。将 kubeconfig 路径设置为环境变量:

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

创建托管式 Harbor 注册表

GDC 网闸隔离配置提供 Harbor as a Service,这是一项全代管式服务,可让您使用 Harbor 存储和管理容器映像。

如需使用 Harbor as a Service,您必须先创建 Harbor 注册表实例和 Harbor 项目。

创建 Harbor 注册表实例

如需创建 Harbor Container Registry 实例,请完成以下步骤:

控制台

  1. 在导航菜单中,从 CI/CD 部分选择 Harbor Container Registry。

  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 Container Registry 实例:

    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 页面中,点击创建 Harbor 项目。

  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. 点击 Add(添加)。

    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. 为映像拉取密钥设置任意名称:

    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 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
    
  3. 验证 Pod 是否已由 Deployment 创建:

    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 Container Registry。

  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 集群的各项资源,如计算实例、磁盘和网络资源:

后续步骤