本文档介绍了如何在 Google Distributed Cloud (GDC) 网闸隔离配置中部署高可用性 (HA) Kubernetes 容器应用。为确保弹性,您必须跨多个可用区部署应用并配置存储复制,以便在发生意外停机或本地灾难时可以恢复应用及其数据。
本文档适用于负责创建弹性容器工作负载的应用开发者。
如需了解详情,请参阅适用于 GDC 网闸隔离配置文档的受众群体。
目标
- 在 GDC 领域中的两个或更多可用区中创建 Kubernetes 集群。
- 配置全球负载均衡。
- 将容器工作负载部署到每个可用区级 Kubernetes 集群。
- 预配存储空间并将其挂接到 Pod。
- 使用块存储或对象存储区配置存储复制。
准备工作
如需为本文档中的任务做好准备,您必须获取必要的权限并验证您的环境。
请求 IAM 角色和权限
请与您的 IAM 组织管理员联系,申请获得以下角色:
- 命名空间管理员 (
namespace-admin):在共享集群中创建和修改容器工作负载。 - User Cluster Admin (
user-cluster-admin):创建和修改共享集群。 - 用户集群开发者 (
user-cluster-developer):在共享集群中创建和修改节点池。 - Harbor Instance Admin (
harbor-instance-admin):创建和修改 Harbor 实例、Harbor 项目和容器映像。 - Project Network Policy Admin (
global-project-networkpolicy-admin):跨可用区创建和修改项目网络政策。 - Global Load Balancer Admin (
global-load-balancer-admin):创建和修改全球负载均衡器。 - Volume Replication Global Admin (
app-volume-replication-admin-global):管理块存储资源的卷复制关系。 - Bucket Project Admin (
global-project-bucket-admin):创建和修改双区域存储桶。
如需了解详情,请参阅角色说明。
准备环境
确认您的经过网闸隔离环境中具有以下工具和配置:
安装并配置 gdcloud CLI,然后设置可用区级和全局上下文。如需了解详情,请参阅使用工具访问可用区。
安装 kubectl CLI,并为全局 API 服务器、Management API 服务器和 Kubernetes 集群设置适当的 kubeconfig 文件。如需了解详情,请参阅手动生成 kubeconfig 文件。
验证您的 GDC Universe 是否有多个可用可用区。如需了解详情,请参阅列出 Universe 中的可用区。
在多个可用区中创建 Kubernetes 集群
如需创建高可用性容器应用,您必须在 GDC 宇宙的每个可用区中创建一个单独的共享 Kubernetes 集群。
如需详细了解可用的集群配置选项,请参阅 Kubernetes 集群配置。
控制台
在导航菜单中,依次选择 Kubernetes Engine > 集群。
点击创建集群。
在名称字段中,指定集群的名称。
选择集群的 Kubernetes 版本。
选择要在其中创建集群的可用区。
点击关联项目,然后选择要关联到集群的现有项目。然后,点击保存。创建集群后,您可以在项目详情页面中附加或分离项目。您必须先将项目附加到集群,然后才能在集群中部署容器工作负载。
点击下一步。
为集群配置投放网络设置。创建集群后,您将无法更改这些投放网络设置。Kubernetes 集群默认且唯一支持的互联网协议是互联网协议版本 4 (IPv4)。
指定负载均衡器 IP 地址池大小,例如
20。选择要使用的服务 CIDR(无类别域间路由)。系统会从此范围为已部署的服务(例如负载均衡器)分配 IP 地址。
选择要使用的 Pod CIDR。集群会从此范围中为您的 Pod 和虚拟机分配 IP 地址。
点击下一步。
查看为集群自动生成的默认节点池的详细信息。点击 edit 修改以修改默认节点池。
如需创建其他节点池,请选择添加节点池。修改默认节点池或添加新节点池时,您可以使用以下选项对其进行自定义:
- 为节点池分配名称。创建节点池后,您将无法修改名称。
- 指定要在节点池中创建的工作器节点数。
选择最符合您工作负载要求的机器类别。 查看以下设置列表:
- 机器类型
- CPU
- 内存
点击保存。
点击创建以创建集群。
对 GDC 领域中的每个可用区重复执行这些步骤。确保 Kubernetes 集群位于您希望用于高可用性策略的每个可用区中。
API
如需直接使用 API 创建新的 Kubernetes 集群,请将自定义资源应用于每个 GDC 可用区。
创建
Cluster自定义资源,并将其部署到您所在可用区的 Management API 服务器:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform spec: clusterNetwork: podCIDRSize: POD_CIDR serviceCIDRSize: SERVICE_CIDR initialVersion: kubernetesVersion: KUBERNETES_VERSION nodePools: - machineTypeName: MACHINE_TYPE name: NODE_POOL_NAME nodeCount: NUMBER_OF_WORKER_NODES taints: TAINTS labels: LABELS acceleratorOptions: gpuPartitionScheme: GPU_PARTITION_SCHEME releaseChannel: channel: UNSPECIFIED EOF替换以下内容:
MANAGEMENT_API_SERVER:可用区级 Management API 服务器的 kubeconfig 路径。如需了解详情,请参阅切换到可用区级上下文。CLUSTER_NAME:集群的名称。集群名称不得以-system结尾。-system后缀预留给 GDC 创建的集群。POD_CIDR:分配 Pod 虚拟 IP 地址 (VIP) 的网络范围的大小。如果未设置,则使用默认值21。SERVICE_CIDR:分配服务 VIP 的网络范围的大小。如果未设置,则使用默认值23。KUBERNETES_VERSION:集群的 Kubernetes 版本,例如1.26.5-gke.2100。如需列出可供配置的 Kubernetes 版本,请参阅列出集群可用的 Kubernetes 版本。MACHINE_TYPE:节点池的工作器节点的机器类型。查看可用的机器类型,了解可配置的类型。NODE_POOL_NAME:节点池的名称。NUMBER_OF_WORKER_NODES:要在节点池中预配的工作器节点数。TAINTS:要应用于此节点池的节点的污点。此为可选字段。LABELS:要应用于此节点池的节点的标签。它包含一个键值对列表。此为可选字段。GPU_PARTITION_SCHEME:GPU 分区方案(如果您运行的是 GPU 工作负载),例如mixed-2。如果未设置此字段,则不会对 GPU 进行分区。如需了解可用的多实例 GPU (MIG) 配置文件,请参阅支持的 MIG 配置文件。
针对您希望托管容器应用以实现高可用性策略的每个可用区,重复执行上一步。
配置负载均衡器
如需在不同可用区中的 Pod 之间分配流量,请创建负载均衡器。您可以在全球范围内配置内部和外部负载均衡器,以确保将客户端请求路由到运行状况良好的可用区。
创建全球内部负载均衡器
内部负载均衡器 (ILB) 通过分配给组织的内部 IP 地址池公开组织内的服务。组织外部的任何端点都无法访问 ILB 服务。
完成以下步骤,为容器工作负载创建全球 ILB。
gdcloud
使用 gdcloud CLI 创建以 Pod 工作负载为目标的 ILB。
此 ILB 针对项目中与 Backend 对象中定义的标签匹配的所有工作负载。Backend 自定义资源必须限定在可用区范围内。
如需使用 gdcloud CLI 创建 ILB,请按照以下步骤操作:
在运行 Pod 的每个可用区中创建一个可用区级
Backend资源,以定义 ILB 的端点:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --cluster-name=CLUSTER_NAME \ --zone=ZONE替换以下内容:
BACKEND_NAME:为后端资源选择的名称,例如my-backend。LABELS:选择器,用于定义要为此后端资源使用 Pod 之间的哪些端点,例如app=web。PROJECT:您的项目的名称。CLUSTER_NAME:所定义选择器的范围仅限于的 Kubernetes 集群。如果未指定此字段,则会选择具有给定标签的所有端点。此字段是可选字段。ZONE:要用于此调用的可用区。如需为需要可用区标志的所有命令预设该标志,请运行gdcloud config set core/zone ZONE。可用区标志仅在多可用区环境中可用。此字段是可选字段。
对 GDC 领域中的每个可用区重复此步骤。
创建全局
BackendService资源:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --global替换以下内容:
BACKEND_SERVICE_NAME:后端服务的名称。PROJECT:您的项目的名称。TARGET_PORTS:此后端服务转换的目标端口的英文逗号分隔列表,其中每个目标端口都指定了协议、转发规则上的端口以及后端实例上的端口。您可以指定多个目标端口。 此字段必须采用protocol:port:targetport格式,例如TCP:80:8080。此字段是可选字段。
将
BackendService资源添加到每个可用区中之前创建的Backend资源:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend-zone=ZONE \ --backend=BACKEND_NAME \ --project=PROJECT \ --global替换以下内容:
BACKEND_SERVICE_NAME:全球后端服务的名称。ZONE:后端所在的可用区。BACKEND_NAME:可用区级后端的名称。PROJECT:您的项目的名称。
对您之前创建的每个可用区级后端完成此步骤。
创建一个内部
ForwardingRule资源,用于定义服务可用的虚拟 IP 地址 (VIP):gdcloud compute forwarding-rules create FORWARDING_RULE_INTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=INTERNAL \ --project=PROJECT \ --global替换以下内容:
FORWARDING_RULE_INTERNAL_NAME:转发规则的名称。CIDR:要用于转发规则的 CIDR。此字段是可选字段。 如果未指定,系统会自动从全局 IP 地址池中预留IPv4/32CIDR。指定与此转发规则位于同一命名空间中的Subnet资源的名称。Subnet资源表示全球子网的请求和分配信息。如需详细了解Subnet资源,请参阅管理子网。PROTOCOL_PORT:要在转发规则中公开的协议和端口。此字段必须采用ip-protocol=TCP:80格式。公开的端口必须与实际应用在容器内公开的端口相同。
如需验证配置的 ILB,请确认每个已创建对象的
Ready条件。通过向 VIP 发送curl请求来验证流量:如需获取分配的 VIP,请描述转发规则:
gdcloud compute forwarding-rules describe FORWARDING_RULE_INTERNAL_NAME --global通过向转发规则中字段指定的端口上的 VIP 发送
curl请求来验证流量:curl http://FORWARDING_RULE_VIP:PORT
替换以下内容:
FORWARDING_RULE_VIP:转发规则的 VIP。PORT:转发规则的端口号。
API
使用 KRM API 创建一个以容器工作负载为目标的 ILB。此 ILB 针对项目中与 Backend 对象中定义的标签匹配的所有工作负载。如需使用 KRM API 创建全球 ILB,请按照以下步骤操作:
创建
Backend资源,以定义 ILB 的端点。为容器工作负载所在的每个可用区创建Backend资源:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: APP_NAME EOF替换以下内容:
MANAGEMENT_API_SERVER:可用区级 Management API 服务器的 kubeconfig 路径。如需了解详情,请参阅切换到可用区级上下文。PROJECT:您的项目的名称。BACKEND_NAME:Backend资源的名称。CLUSTER_NAME:所定义选择器的范围仅限于的 Kubernetes 集群。如果未指定此字段,则会选择具有给定标签的所有端点。此字段是可选字段。APP_NAME:容器应用的名称。
您可以为每个可用区使用相同的
Backend资源,也可以为每个可用区创建具有不同标签集的Backend资源。使用之前创建的
Backend资源创建一个BackendService对象。请务必添加HealthCheck资源:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME targetPorts: - port: PORT protocol: PROTOCOL targetPort: TARGET_PORT EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。PROJECT:您的项目的名称。BACKEND_SERVICE_NAME:为BackendService资源选择的名称。HEALTH_CHECK_NAME:您之前创建的HealthCheck资源的名称。BACKEND_NAME:可用区级Backend资源的名称。ZONE:Backend资源所在的可用区。您可以在backendRefs字段中指定多个后端。例如:- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-btargetPorts字段为可选字段。此资源列出了此BackendService资源转换的端口。如果您使用的是此对象,请为以下各项提供值:PORT:服务公开的端口。PROTOCOL:流量必须匹配的第 4 层协议。仅支持 TCP 和 UDP。TARGET_PORT:值转换到的端口,例如8080。在给定对象中,该值不能重复。targetPorts的示例如下所示:targetPorts: - port: 80 protocol: TCP targetPort: 8080
创建一个内部
ForwardingRule资源,用于定义服务可用的虚拟 IP 地址 (VIP)。kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleInternal metadata: namespace: PROJECT name: FORWARDING_RULE_INTERNAL_NAME spec: cidrRef: name: CIDR_NAME ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。PROJECT:您的项目的名称。FORWARDING_RULE_INTERNAL_NAME:为ForwardingRuleInternal资源选择的名称。CIDR_NAME:要用于转发规则的 CIDR 的名称。此字段是可选字段。如果未指定,系统会自动从全局 IP 地址池中预留IPv4/32CIDR。指定与此转发规则位于同一命名空间中的Subnet资源的名称。Subnet资源表示全球子网的请求和分配信息。如需详细了解Subnet资源,请参阅管理子网。PORT:要在转发规则上公开的端口。使用ports字段指定 L4 端口数组,数据包会转发到使用此转发规则配置的后端。必须至少指定一个端口。使用port字段指定端口号。公开的端口必须与实际应用在容器内公开的端口相同。PROTOCOL:要用于转发规则的协议,例如TCP。ports数组中的条目必须如下所示:ports: - port: 80 protocol: TCP
如需验证配置的 ILB,请确认每个已创建对象的
Ready条件。通过向 VIP 发送curl请求来验证流量:检索 VIP:
kubectl get forwardingruleinternal -n PROJECT输出如下所示:
NAME BACKENDSERVICE CIDR READY ilb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True通过向转发规则字段中指定的端口上的 VIP 发送
curl请求来测试流量:curl http://FORWARDING_RULE_VIP:PORT替换以下内容:
FORWARDING_RULE_VIP:转发规则的 VIP。PORT:转发规则中字段的端口号。
创建全球外部负载均衡器
外部负载均衡器 (ELB) 会公开服务,以便从组织外部通过从较大的实例外部 IP 地址池分配给组织的池 IP 地址进行访问。
完成以下步骤,为容器工作负载创建全球 ELB。
gdcloud
使用 gdcloud CLI 创建一个全局 ELB,该 ELB 以项目中与 Backend 对象中定义的标签匹配的所有工作负载为目标。Backend 自定义资源必须限定在可用区范围内。
为了使 ELB 服务正常运行,您必须配置并应用自己的自定义
ProjectNetworkPolicy数据传输政策,以允许流量流向此 ELB 服务的工作负载。网络政策控制对工作负载的访问,而不是负载均衡器本身。ELB 会将工作负载公开给客户网络,因此需要明确的网络政策来允许外部流量流向工作负载端口(例如8080)。指定外部 CIDR 地址,以允许流量流向此 ELB 的工作负载:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如果您尚未为全局 API 服务器生成 kubeconfig 文件,请参阅手动生成 kubeconfig 文件了解详情。PROJECT:您的项目的名称。CIDR:需要从中访问 ELB 的外部 CIDR。此政策是必需的,因为外部负载均衡器使用直接服务器返回 (DSR),该功能会保留来源外部 IP 地址,并在返回路径上绕过负载均衡器。如需了解详情,请参阅为组织外部流量创建全球入站防火墙规则。PORT:负载均衡器后面的 Pod 上的后端端口。此值位于Service资源的清单的.spec.ports[].targetPortfield字段中。此字段是可选字段。
此配置可让项目内的所有资源访问指定的 CIDR 范围。
在每个可用区中创建一个
Backend资源,以定义 ELB 的端点:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --cluster-name=CLUSTER_NAME \ --zone=ZONE替换以下内容:
BACKEND_NAME:后端资源的名称,例如my-backend。LABELS:一个选择器,用于定义要为此后端资源使用 Pod 之间的哪些端点,例如app=web。PROJECT:您的项目的名称。CLUSTER_NAME:所定义选择器的范围仅限于的 Kubernetes 集群。如果未指定此字段,则会选择具有给定标签的所有端点。此字段是可选字段。ZONE:要用于此调用的可用区。如需为需要可用区标志的所有命令预设该标志,请运行gdcloud config set core/zone ZONE。可用区标志仅在多可用区环境中可用。此字段是可选字段。
您可以为每个可用区使用相同的
Backend资源,也可以为每个可用区创建具有不同标签集的Backend资源。创建全局
BackendService资源:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --health-check=HEALTH_CHECK_NAME \ --global替换以下内容:
BACKEND_SERVICE_NAME:为此后端服务选择的名称。PROJECT:您的项目的名称。TARGET_PORTS:此后端服务转换的目标端口的逗号分隔列表,其中每个目标端口都指定了协议、转发规则上的端口以及后端实例上的端口。您可以指定多个目标端口。此字段必须采用protocol:port:targetport格式,例如TCP:80:8080。此字段是可选字段。HEALTH_CHECK_NAME:健康检查资源的名称。此字段是可选字段。
将全局
BackendService资源添加到之前创建的可用区级Backend资源:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --backend-zone=ZONE \ --project=PROJECT \ --global对您之前创建的每个可用区级后端完成此步骤。
创建一个外部
ForwardingRule资源,用于定义服务可用的 VIP:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --project=PROJECT \ --global替换以下内容:
FORWARDING_RULE_EXTERNAL_NAME:转发规则的名称。CIDR:要用于转发规则的 CIDR。此字段是可选字段。 如果未指定,系统会自动从全局 IP 地址池中预留IPv4/32CIDR。指定与此转发规则位于同一命名空间中的Subnet资源的名称。Subnet资源表示全球子网的请求和分配信息。如需详细了解Subnet资源,请参阅管理子网。PROTOCOL_PORT:要在转发规则中公开的协议和端口。此字段必须采用ip-protocol=TCP:80格式。 公开的端口必须与实际应用在容器内公开的端口相同。PROJECT:您的项目的名称。
如需验证配置的 ELB,请确认每个已创建对象的
Ready条件。通过向 VIP 发送curl请求来验证流量:如需获取分配的 VIP,请描述转发规则:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME通过向转发规则的
PROTOCOL_PORT字段中指定的端口上的 VIP 发送curl请求来验证流量:curl http://FORWARDING_RULE_VIP:PORT替换以下内容:
FORWARDING_RULE_VIP:转发规则的 VIP。PORT:转发规则中PROTOCOL_PORT字段的端口号。
API
使用 KRM API 创建一个以 Pod 工作负载为目标的 ELB。此 ELB 针对项目中与 Backend 对象中定义的标签匹配的所有工作负载。如需使用 KRM API 创建可用区级 ELB,请按照以下步骤操作:
为了使 ELB 服务正常运行,您必须配置并应用自己的自定义
ProjectNetworkPolicy数据传输政策,以允许流量流向此 ELB 服务的工作负载。网络政策控制对工作负载的访问,而不是负载均衡器本身。ELB 会将工作负载公开给客户网络,因此需要明确的网络政策来允许外部流量流向工作负载端口(例如8080)。指定外部 CIDR 地址,以允许流量流向此 ELB 的工作负载:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如果您尚未为全局 API 服务器生成 kubeconfig 文件,请参阅手动生成 kubeconfig 文件了解详情。PROJECT:您的项目的名称。CIDR:需要从中访问 ELB 的外部 CIDR。此政策是必需的,因为外部负载均衡器使用直接服务器返回 (DSR),该功能会保留来源外部 IP 地址,并在返回路径上绕过负载均衡器。如需了解详情,请参阅为组织外部流量创建全球入站防火墙规则。PORT:负载均衡器后面的 Pod 上的后端端口。此值位于Service资源的清单的.spec.ports[].targetPortfield字段中。此字段是可选字段。
创建
Backend资源,以定义 ELB 的端点。为工作负载所在的每个可用区创建Backend资源:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: APP_NAME EOF替换以下内容:
MANAGEMENT_API_SERVER:可用区级 Management API 服务器的 kubeconfig 路径。如果您尚未为目标可用区中的 API 服务器生成 kubeconfig 文件,请参阅手动生成 kubeconfig 文件了解详情。PROJECT:您的项目的名称。BACKEND_NAME:Backend资源的名称。CLUSTER_NAME:定义的选择器的范围仅限于的 Kubernetes 集群。如果未指定此字段,则会选择具有给定标签的所有端点。此字段是可选字段。APP_NAME:容器应用的名称。
您可以为每个可用区使用相同的
Backend资源,也可以为每个可用区创建具有不同标签集的Backend资源。使用之前创建的
Backend资源创建BackendService对象:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME EOF替换以下内容:
BACKEND_SERVICE_NAME:为BackendService资源选择的名称。HEALTH_CHECK_NAME:您之前创建的HealthCheck资源的名称。如果您要为 Pod 工作负载配置 ELB,请勿添加此字段。ZONE:Backend资源所在的可用区。您可以在backendRefs字段中指定多个后端。例如:
- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b创建一个外部
ForwardingRule资源,用于定义服务可用的 VIP。kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: name: CIDR_NAME ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF替换以下内容:
FORWARDING_RULE_EXTERNAL_NAME:为ForwardingRuleExternal资源选择的名称。CIDR_NAME:要用于转发规则的 CIDR 的名称。此字段是可选字段。 如果未指定,系统会自动从全局 IP 地址池中预留IPv4/32CIDR。指定与此转发规则位于同一命名空间中的Subnet资源的名称。Subnet资源表示全球子网的请求和分配信息。如需详细了解Subnet资源,请参阅管理子网。PORT:要在转发规则中公开的端口。使用ports字段指定 L4 端口数组,数据包会转发到使用此转发规则配置的后端。必须至少指定一个端口。使用port字段指定端口号。公开的端口必须与实际应用在容器内公开的端口相同。PROTOCOL:要用于转发规则的协议,例如TCP。ports数组中的条目必须如下所示:
ports: - port: 80 protocol: TCP如需验证配置的 ELB,请确认每个已创建对象的
Ready条件。尝试通过向 VIP 发送curl请求来测试流量。检索项目的 VIP:
kubectl get forwardingruleexternal -n PROJECT输出如下所示:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True通过向转发规则中
PORT字段指定的端口上的 VIP 发送 curl 请求来验证流量:curl http://FORWARDING_RULE_VIP:PORT将
FORWARDING_RULE_VIP:PORT替换为转发规则的 VIP 和端口,例如192.0.2.0:80。
将容器工作负载部署到每个可用区级集群
容器工作负载不是全球性资源,这意味着您必须将每个容器应用分别部署到可用区级 Kubernetes 集群中。
登录到托管 Kubernetes 集群的可用区:
gdcloud config set core/zone ZONE验证您的容器映像是否可从托管式 Harbor 注册表中获取。如需了解详情,请参阅部署容器应用教程。
为容器工作负载创建清单文件,并将其部署到可用区级 Kubernetes 集群:
kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: DEPLOYMENT_NAME spec: replicas: NUMBER_OF_REPLICAS selector: matchLabels: run: APP_NAME template: metadata: labels: run: APP_NAME spec: containers: - name: CONTAINER_NAME image: HARBOR_INSTANCE_URL/HARBOR_PROJECT_NAME/IMAGE:TAG EOF替换以下内容:
KUBERNETES_CLUSTER:您要向其部署容器工作负载的可用区级 Kubernetes 集群的 kubeconfig 文件。如果您尚未为可用区级 Kubernetes 集群生成 kubeconfig 文件,请参阅手动生成 kubeconfig 文件了解详情。PROJECT:要在其中部署容器工作负载的项目命名空间。DEPLOYMENT_NAME:容器部署的名称。NUMBER_OF_REPLICAS:部署管理的复制Pod对象的数量。APP_NAME:要在部署中运行的应用的名称。CONTAINER_NAME:容器的名称。HARBOR_INSTANCE_URL:Harbor 实例的网址,例如harbor-1.org-1.zone1.google.gdc.test.。如需检索 Harbor 实例的网址,请参阅查看 Harbor 注册表实例。HARBOR_PROJECT_NAME:Harbor 项目的名称,例如my-project。IMAGE:映像的名称,例如nginx。TAG:要拉取的映像版本的标记,例如1.0。
对 GDC Universe 中的每个可用区重复上述步骤。确保您的容器应用位于高可用性策略所需的每个可用区中。
使用 Kubernetes 公开容器应用
您必须公开容器应用,以允许从 GDC 领域中的其他资源访问该应用。
创建
type: LoadBalancer的Service资源。此资源通过网络公开应用的 Pod。kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT apply -f - <<EOF apiVersion: v1 kind: Service metadata: name: SERVICE_NAME spec: selector: app: APP_NAME ports: - port: 80 protocol: TCP type: LoadBalancer EOF替换以下内容:
KUBERNETES_CLUSTER:您要向其部署容器工作负载的可用区级 Kubernetes 集群的 kubeconfig 文件。PROJECT:容器工作负载所在的项目命名空间。SERVICE_NAME:负载均衡器服务的名称。APP_NAME:您为容器应用应用的标签。
创建
NetworkPolicy自定义资源,以允许所有网络流量进入默认命名空间:kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT apply -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
为 Pod 预配永久性存储
您必须创建 PersistentVolumeClaim 资源 (PVC) 才能为应用 Pod 提供永久性存储。
以下说明介绍了如何使用 GDC standard-rwo StorageClass 创建卷。
创建
PersistentVolumeClaim资源。例如,为其配置ReadWriteOnce访问模式和standard-rwo存储类:kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT apply -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: PVC_NAME spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard-rwo EOF替换以下内容:
KUBERNETES_CLUSTER:Kubernetes 集群的 kubeconfig 文件。PROJECT:要在其中创建 PVC 的项目命名空间。PVC_NAME:PersistentVolumeClaim对象的名称。
PersistentVolume(PV) 对象是动态预配的。检查 Kubernetes 集群中新 PV 的状态:kubectl get pv --kubeconfig KUBERNETES_CLUSTER输出类似于以下内容:
NAME CAPACITY ACCESS MODES STATUS CLAIM STORAGECLASS AGE pvc-uuidd 10Gi RWO Bound pvc-name standard-rwo 60s将容器工作负载配置为使用 PVC。以下是使用
standard-rwoPVC 的 Pod 清单示例:kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT apply -f - <<EOF apiVersion: apps/v1 kind: Pod metadata: name: web-server-deployment labels: app: APP_LABEL spec: containers: - name: CONTAINER_NAME image: HARBOR_INSTANCE_URL/HARBOR_PROJECT_NAME/IMAGE:TAG volumeMounts: - mountPath: MOUNT_PATH name: data volumes: - name: data persistentVolumeClaim: claimName: PVC_NAME EOF替换以下内容:
KUBERNETES_CLUSTER:您要向其部署容器工作负载的 Kubernetes 集群的 kubeconfig 文件。PROJECT:PVC 所在的项目命名空间。APP_LABEL:您为容器应用应用的标签。CONTAINER_NAME:容器的名称。HARBOR_INSTANCE_URL:Harbor 实例的网址,例如harbor-1.org-1.zone1.google.gdc.test.。如需检索 Harbor 实例的网址,请参阅查看 Harbor 注册表实例。HARBOR_PROJECT_NAME:Harbor 项目的名称,例如my-project。IMAGE:映像的名称,例如nginx。TAG:要拉取的映像版本的标记,例如1.0。MOUNT_PATH:Pod 中用于装载卷的路径。PVC_NAME:您创建的 PVC。
配置存储空间复制
GDC 多可用区 Universe 支持存储复制,以实现灾难恢复。此策略可在同一区域中的任意两个可用区之间进行数据复制,确保即使某个可用区不可用,您的应用数据仍可访问。
为容器应用选择以下存储复制类型之一:
创建用于对象存储区的双可用区存储桶
对象存储数据会写入单个存储桶,其数据存储在两个可用区中。与卷复制不同,复制的存储桶在可用区划分期间可写。每次对对象的写入都会产生一个不同的版本,连接性恢复后,两个可用区中的最新版本将成为最终状态。
验证您的基础设施运营商 (IO) 是否已创建
BucketLocationConfig自定义资源,这是对象存储区跨可用区复制所必需的。此资源必须部署到根全局 API 服务器。创建双可用区
Bucket自定义资源:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: object.global.gdc.goog/v1 kind: Bucket metadata: name: BUCKET_NAME namespace: PROJECT spec: location: LOCATION_NAME description: Sample DZ Bucket storageClass: Standard EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 文件。BUCKET_NAME:存储桶的名称。PROJECT:存储桶所在项目的名称。LOCATION_NAME:存储桶中的对象数据所在的物理位置。此名称必须映射到现有BucketLocation资源的名称。如需查询组织的全局 API 服务器以获取可用BucketLocation资源的列表,请运行kubectl --kubeconfig GLOBAL_API_SERVER bucketlocations。如果没有BucketLocation资源,请与您的 IO 联系,确认他们已启用复制功能。
配置跨可用区的异步块存储复制
复制的块存储提供异步复制的卷 (PV),这些卷在主卷和次要卷之间保持块等效性。由于异步性质,次要卷反映的是过去某个时间点(非零 RPO)的主要可用区的状态。辅助卷在仍是复制目标时无法装载,需要手动干预来终止关系并允许写入。
您必须配置跨可用区的存储复制关系,以创建复制的数据,以便在源可用区数据不可用时进行故障切换。如果您要为容器应用使用块存储,则此功能会特别有用。
在开始之前,请验证您的基础架构运营商 (IO) 是否已创建并配置 StorageClusterPeering 和 StorageVirtualMachinePeering 自定义资源,以允许跨可用区进行块存储复制。此资源必须部署到根全局 API 服务器。
创建
VolumeReplicationRelationship自定义资源 YAML 文件,并将其部署到全局 API 服务器:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: storage.global.gdc.goog/v1 kind: VolumeReplicationRelationship metadata: name: PVC_REPL_NAME namespace: PROJECT spec: source: pvc: clusterRef: SOURCE_PVC_CLUSTER pvcRef: SOURCE_PVC zoneRef: SOURCE_ZONE destination: pvc: clusterRef: DEST_PVC_CLUSTER zoneRef: DEST_ZONE EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 文件。PVC_REPL_NAME:卷复制关系的名称。PROJECT:存储基础架构所在的项目。SOURCE_PVC_CLUSTER:托管 PVC 的 Kubernetes 集群。SOURCE_PVC:来源可用区中要复制的 PVC。SOURCE_ZONE:托管 PVC 的来源可用区。DEST_PVC_CLUSTER:要将 PVC 复制到的目标 Kubernetes 集群。DEST_ZONE:要将 PVC 复制到的目标可用区。
在目标可用区中创建
VolumeFailover自定义资源,如果源可用区因任何原因不可用,则会停止复制到目标可用区:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: storage.gdc.goog/v1 kind: VolumeFailover metadata: name: PVC_FAILOVER_NAME namespace: PROJECT spec: volumeReplicationRelationshipRef: PVC_REPL_NAME EOF替换以下内容:
MANAGEMENT_API_SERVER:可用区级 Management API 服务器的 kubeconfig 文件。PVC_FAILOVER_NAME:PVC 故障切换的名称。PROJECT:存储基础架构所在的项目。PVC_REPL_NAME:卷复制关系的名称。