本教程介绍如何在完全隔离的 Google Distributed Cloud (GDC) 环境中上传容器应用,并在 Kubernetes 集群上运行该应用。容器化工作负载在项目命名空间内的 Kubernetes 集群上运行。集群在逻辑上与项目和彼此分离,以提供不同的故障网域和隔离保证。不过,您必须确保集群已关联到项目,以便在项目中管理容器化工作负载。
部署容器应用的最大障碍之一是将应用的二进制文件传输到与外界隔绝的数据中心。与您的基础架构团队和管理员合作,将应用传输到工作站,或直接在持续集成和持续交付 (CI/CD) 服务器上实现本教程。
本教程使用 Artifact Registry 中提供的示例 Web 服务器应用。 Google Cloud
目标
- 创建受管理的 Harbor 注册表。
- 将容器映像推送到受管理的 Harbor 注册表。
- 创建 Kubernetes 集群。
- 将示例容器应用部署到集群。
费用
由于 GDC 旨在经过网闸隔离的数据中心内运行,因此结算流程和信息仅限于 GDC 部署,不受其他 Google 产品管理。
如需根据您的预计使用量来估算费用,请使用价格计算器。
您可以使用“预计费用”信息中心来预测账单中未来 SKU 的费用。
如需跟踪存储和计算消耗量,请使用结算使用情况信息中心。
准备工作
确保您拥有一个项目来管理容器化部署。 如果您还没有项目,请创建一个项目。
将项目命名空间设置为环境变量:
export NAMESPACE=PROJECT_NAMESPACE
请让您的组织 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 集群所必需的,并且不绑定到命名空间。
登录到区域管理 API 服务器,并使用用户身份生成其 kubeconfig 文件。将 kubeconfig 路径设置为环境变量:
export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
创建受管理的 Harbor 注册表
GDC air-gapped 提供 Harbor 即服务,这是一项全代管式服务,可让您使用 Harbor 存储和管理容器映像。
如需将 Harbor 用作服务,您必须先创建 Harbor 注册表实例和 Harbor 项目。
创建 Harbor 注册表实例
如需创建 Harbor 容器注册表实例,请完成以下步骤:
控制台
在导航菜单中,从 CI/CD 部分选择 Harbor 容器注册表。
选择要在哪个可用区中创建 Harbor 实例。Harbor 实例是可用区级资源,必须在每个可用区中手动创建,以确保高可用性。
点击创建实例。
输入实例的名称,并接受 Harbor 托管式服务条款。
点击创建实例。
确认您的新 Harbor 实例是否已显示在 Harbor 实例部分。
点击前往 Harbor 实例外部链接,并记下实例网址。例如,实例网址格式类似于
harbor-1.org-1.zone1.google.gdc.test
。实例网址不得包含https://
前缀。将实例网址设置为变量,以便在本教程的后续部分中使用:
export INSTANCE_URL=INSTANCE_URL
将 INSTANCE_URL 替换为 Harbor 代码库实例的网址。
例如:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
gdcloud
创建新的 Harbor 容器注册表实例:
gdcloud harbor instances create INSTANCE_NAME \ --project=PROJECT \
替换以下内容:
INSTANCE_NAME
:Harbor 实例的名称。PROJECT
:GDC 项目的名称。
列出实例的网址:
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
将实例网址设置为变量,以便在本教程的后续部分中使用:
export INSTANCE_URL=INSTANCE_URL
将 INSTANCE_URL 替换为 Harbor 代码库实例的网址。请确保实例网址不包含
https://
前缀。例如:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
在注册表中创建 Harbor 项目
您必须在 Harbor 注册表实例中创建一个 Harbor 项目,才能管理容器映像:
控制台
在 Harbor Container Registry 页面中,点击 Create A Harbor Project。
输入项目的名称。
点击创建。
将 Harbor 项目名称设置为一个变量,以便在本教程后面部分使用:
export HARBOR_PROJECT=HARBOR_PROJECT
gdcloud
创建新的 Harbor 项目:
gdcloud harbor harbor-projects create HARBOR_PROJECT \ --project=PROJECT \ --instance=INSTANCE_NAME
替换以下内容:
HARBOR_PROJECT
:要创建的 Harbor 项目的名称。PROJECT
:GDC 项目的名称。INSTANCE_NAME
:Harbor 实例的名称。
将 Harbor 项目名称设置为一个变量,以便在本教程后面部分使用:
export HARBOR_PROJECT=HARBOR_PROJECT
配置 Docker
如需在 Harbor 注册表中运行 Docker,请完成以下步骤:
将 Docker 配置为信任 Harbor as a Service。如需了解详情,请参阅配置 Docker 以信任 Harbor 根 CA。
配置 Docker 对 Harbor 的身份验证。如需了解详情,请参阅配置 Docker 身份验证以用于 Harbor 注册表实例。
创建 Kubernetes 映像拉取 Secret
由于您使用的是专用 Harbor 项目,因此必须创建 Kubernetes 映像拉取 Secret。
添加一个 Harbor 项目机器人账号作为您的服务账号。
在 Harbor 控制台中,选择您的 Harbor 项目。
点击机器人账号。
选择新建机器人账号。
为新的机器人账号命名,并定义任何其他设置。
点击添加。
成功屏幕上会显示机器人账号名称和密钥。 请保持此界面处于打开状态,以便在下一步中参考。
如需了解详情,请参阅 Harbor 的文档:https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account。
在新的终端窗口中,使用 Harbor 项目机器人账号和密钥令牌登录 Docker:
docker login ${INSTANCE_URL}
当系统提示时,请在用户名中插入机器人项目名称,并在密码中插入上一步中从 Harbor 控制台成功屏幕上获得的密钥令牌。
为映像拉取 Secret 设置任意名称:
export SECRET=SECRET
创建拉取映像所需的 Secret:
kubectl create secret docker-registry ${SECRET} \ --from-file=.dockerconfigjson=DOCKER_CONFIG \ -n ${NAMESPACE}
将
DOCKER_CONFIG
替换为.docker/config.json
文件的路径。确认您的 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 代码库获取。
使用外部网络将
nginx
映像从 Docker Hub 拉取到本地工作站:docker pull nginx
使用代码库名称标记本地映像:
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
将
nginx
容器映像推送到您的受管 Harbor 注册表:docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
创建一个 Kubernetes 集群
现在,您已将 nginx
容器映像存储在受管理的 Harbor 注册表中,并且可以访问该映像,接下来请创建一个 Kubernetes 集群来运行 nginx Web 服务器。
控制台
在导航菜单中,依次选择 Kubernetes Engine > 集群。
点击创建集群。
在名称字段中,指定集群的名称。
选择要在其中创建 Kubernetes 集群的可用区。Kubernetes 集群是可用区级资源,必须在每个地区中手动创建,以确保高可用性。
点击关联项目,然后选择要关联到集群的项目。 然后点击保存。
点击创建。
等待集群创建完成。当集群可供使用时,集群名称旁边会显示状态
READY
。
API
创建
Cluster
自定义资源并将其保存为 YAML 文件,例如cluster.yaml
:apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform
将
CLUSTER_NAME
值替换为集群的名称。将自定义资源应用到您的 GDC 实例:
kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
使用 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 集群:
登录到 Kubernetes 集群,并使用用户身份生成其 kubeconfig 文件。将 kubeconfig 路径设置为环境变量:
export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
创建并部署 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
清理
为避免因本教程中使用的资源导致您的 GDC 账号产生费用,您必须删除您创建的资源。
删除容器映像
如需从 GDC 隔网环境中删除容器映像,您可以删除包含该映像的 Harbor 实例,也可以保留 Harbor 实例,只删除单个容器映像。
如需从受管理的 Harbor 注册表中删除容器映像,请使用 GDC 控制台:
在导航菜单中,从 CI/CD 部分选择 Harbor 容器注册表。
点击前往 Harbor 实例外部链接。
使用 Harbor 界面删除容器映像。如需了解详情,请参阅删除 Harbor 注册表实例。
删除容器应用
如需删除已部署的容器应用,请删除包含这些资源的 GDC 项目,或者保留 GDC 项目但删除各个资源。
要逐个删除资源,请完成以下步骤:
删除容器应用的
Service
对象:kubectl delete service nginx-service -n ${NAMESPACE}
删除容器应用的
Deployment
对象:kubectl delete deployment nginx-deployment -n ${NAMESPACE}
如果您仅为此教程创建了测试 Kubernetes 集群,请将其删除:
kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \ -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
此命令将删除构成 Kubernetes 集群的资源,如计算实例、磁盘和网络资源:
后续步骤
探索资源层次结构和资源隔离的详细信息。
了解集群架构。
如需了解如何管理部署到 Kubernetes 集群的容器,请参阅 GDC 的 Kubernetes 容器文档。
了解如何在部署容器工作负载后管理 Kubernetes 集群。
了解有关设置容器工作负载和其他服务资源的最佳实践。