借助 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 项目。
准备环境
如需完成本文档,您必须拥有以下资源:
创建托管式 Harbor 注册表
GDC 网闸隔离配置提供 Harbor as a Service,这是一项全代管式服务,可让您使用 Harbor 存储和管理容器映像。
如需使用 Harbor as a Service,您必须先创建 Harbor 注册表实例和 Harbor 项目。
创建 Harbor 注册表实例
如需创建 Harbor Container Registry 实例,请完成以下步骤:
控制台
在导航菜单中,从 CI/CD 部分选择 Harbor Container Registry。
选择要在其中创建 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 Container Registry 实例:
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 页面中,点击创建 Harbor 项目。
输入项目的名称。
点击创建。
将 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 项目。
点击机器人账号。
选择新建机器人账号。
为新机器人账号命名,并定义任何其他设置。
点击 Add(添加)。
机器人账号名称和密钥会显示在成功屏幕上。 请勿关闭此界面,以便在下一步中参考。
如需了解详情,请参阅 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 控制台成功屏幕上提供的机器人项目名称作为用户名,并输入密钥令牌作为密码。
为映像拉取密钥设置任意名称:
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 是否已由 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创建网络政策,以允许所有网络流量进入命名空间:
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 Container Registry。
点击前往 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 集群的各项资源,如计算实例、磁盘和网络资源:
后续步骤
探索资源层次结构和资源隔离的相关细节。
了解集群架构。
阅读 GDC 的 Kubernetes 容器文档,了解如何管理部署到 Kubernetes 集群的容器。
了解如何在部署容器工作负载后管理 Kubernetes 集群。
探索设置容器工作负载和其他服务资源的最佳实践。