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

本教程介绍了如何在气隙式 Google Distributed Cloud (GDC) 气隙式环境中上传容器应用,并在共享 Kubernetes 集群上运行该应用。容器化工作负载在项目命名空间内的共享 Kubernetes 集群上运行。共享集群在逻辑上与项目相互分离,以提供不同的故障网域和隔离保证。但是,您必须确保共享集群已连接到项目,以便在项目中管理容器化工作负载。

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

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

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

目标

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

费用

由于 GDC 旨在气隙式数据中心内运行,因此结算流程和信息仅限于 GDC 部署,不受其他 Google 产品管理。

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

使用“预计费用”信息中心 来预测发票中未来的 SKU 费用。

如需跟踪存储空间和计算资源消耗量,请使用 “结算使用量”信息中心

准备工作

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

请求 IAM 角色

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

组织角色

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

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

项目角色

请让项目 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 项目。

准备环境

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

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

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

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

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

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

创建托管 Harbor 注册表

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

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

创建 Harbor 注册表实例

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

控制台

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

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

  3. 点击创建实例

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

  5. 点击创建实例

  6. 确认您的新 Harbor 实例存在于 Harbor Instance 部分中。

  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 页面中,点击创建 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 即服务。如需了解详情,请参阅 将 Docker 配置为信任 Harbor 根 CA

  2. 将 Docker 身份验证配置为 Harbor。如需了解详情,请参阅 将 Docker 身份验证配置为 Harbor 注册表实例

创建 Kubernetes 映像拉取 Secret

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

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

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

    2. 点击机器人账号

    3. 选择新建机器人账号

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

    5. 点击添加

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

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

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

    docker login ${INSTANCE_URL}
    

    系统提示时,请在 Harbor 控制台成功屏幕上插入上一步中提供的机器人项目名称作为用户名 ,并插入 Secret 令牌作为密码

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

后续步骤