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

本教程介绍了如何在 Google Distributed Cloud (GDC) 气隙设备环境中上传容器应用,并在该设备环境中运行该应用。在本教程中,您将学习如何创建 Harbor 项目、将映像上传到 Harbor 以及创建工作负载。容器化工作负载在项目命名空间内运行。

GDC 经过网闸隔离的设备环境随附一个名为 tear-harbor 的预配置 Harbor 注册表,位于名为 tear 的 GDC 项目中。您将在此示例中使用此注册表。

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

目标

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

准备工作

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

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

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

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

    • 项目命名空间的 Namespace Admin 角色 (namespace-admin)。 您需要此角色才能在项目中部署容器工作负载。

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

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

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

    export KUBECONFIG=CLUSTER_KUBECONFIG
    

在注册表中创建 Harbor 项目

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

如需使用 Harbor as a Service,您必须在 tear-harbor 注册表实例中创建一个 Harbor 项目来管理容器映像:

  1. 您需要 tear-harbor 的网址。列出实例的网址:

    gdcloud harbor instances describe tear-harbor --project=tear
    

    输出类似于 harbor-1.org-1.zone1.google.gdc.test

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

    export INSTANCE_URL=INSTANCE_URL
    
  3. 在创建项目之前,您必须使用上一步中的网址登录 Harbor。使用浏览器打开此网址,然后登录 Harbor 实例。

  4. 创建 Harbor 项目:

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=tear \
        --instance=tear-harbor
    

    HARBOR_PROJECT 替换为要创建的 Harbor 项目的名称。您无法在任何项目命名空间中创建 Harbor 项目。您必须使用 tear 项目。

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

    export HARBOR_PROJECT=HARBOR_PROJECT
    

配置 Docker

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

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

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

  3. 由于 tear-harbor 是预配置的 Harbor 注册表,因此您必须信任由 Google Distributed Cloud 气隙内部 CA 签名的证书:

    1. 向您的 IO 询问以下信息:

      1. Harbor 集群的外部网址。
      2. 经过网闸隔离的 Google Distributed Cloud 内部 CA 的 .crt 文件。该文件通常以 trust-store-internal-only 名称作为 Secret 存储在控制平面中,位于 anthos-creds 命名空间中。
    2. 与上一步类似,创建一个以 Harbor 集群的外部网址命名的文件夹,并将 .crt 文件保留在该文件夹中。

创建 Kubernetes 映像拉取 Secret

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

  1. 添加 Harbor 项目机器人账号。按照 Harbor 界面中的步骤创建机器人账号并复制机器人密钥令牌: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account

  2. 请注意新的机器人项目账号名称,其语法如下:

    <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

  3. 使用 Harbor 项目机器人账号和密钥令牌登录 Docker:

    docker login ${INSTANCE_URL}
    

    出现提示时,请为 Username 插入机器人项目账号名称,并为 Password 插入 Secret 令牌。

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

    export SECRET=SECRET
    
  5. 创建拉取映像所需的 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 中获取。

  1. 使用外部网络将 nginx 映像从 Google Cloud Artifact Registry 拉取到本地工作站:

    docker pull gcr.io/cloud-marketplace/google/nginx:1.25
    
  2. 设置映像的名称。完整映像名称的格式如下:

    ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx
    
  3. 使用代码库名称标记本地映像:

    docker tag gcr.io/cloud-marketplace/google/nginx:1.25 ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  4. 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 服务器:

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

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

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

      curl http://$IP
    

后续步骤

  • 如需了解如何管理容器,请参阅容器文档。