无法使用GKE多群集服务导出服务



我根据document1和document2配置GKE多集群服务,灵感来自GKE教程中的多集群服务通信。

不知怎的,我在";注册用于出口的服务";在第二个集群上。

我正在使用以下YAML文件导出第一个(舰队集群(上的ngnix服务

# export.yaml
kind: ServiceExport
apiVersion: net.gke.io/v1
metadata:
namespace: multy-service-poc
name: ngnix-service

并且它可以从另一个集群导出,并且ServiceExport在第一个集群上的状态是True

k describe serviceexport ngnix-service                                                                             
Name:         ngnix-service
Namespace:    multy-service-poc
Labels:       <none>
Annotations:  <none>
API Version:  net.gke.io/v1
Kind:         ServiceExport
Metadata:
Creation Timestamp:  2021-12-11T11:22:37Z
Finalizers:
serviceexport.net.gke.io
Generation:  2
Managed Fields:
API Version:  net.gke.io/v1
Fields Type:  FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:kubectl.kubernetes.io/last-applied-configuration:
Manager:      kubectl-client-side-apply
Operation:    Update
Time:         2021-12-11T11:22:37Z
API Version:  net.gke.io/v1alpha1
Fields Type:  FieldsV1
fieldsV1:
f:metadata:
f:finalizers:
.:
v:"serviceexport.net.gke.io":
f:spec:
f:status:
.:
f:conditions:
Manager:         Google-GKE-MCS
Operation:       Update
Time:            2021-12-11T11:22:39Z
Resource Version:  58873
UID:               a42dc51c-93ff-4526-9c04-9702ed7ba95d
Spec:
Status:
Conditions:
Last Transition Time:  2021-12-11T11:22:38Z
Status:                True
Type:                  Initialized
Last Transition Time:  2021-12-11T11:22:40Z
Status:                True
Type:                  Exported
Events:                    <none>

当我使用相同的YAML文件在第二个集群上导出相同的服务时,它失败了,状态为False

kubectl  describe serviceexport ngnix-service 
Name:         ngnix-service
Namespace:    multy-service-poc
Labels:       <none>
Annotations:  <none>
API Version:  net.gke.io/v1
Kind:         ServiceExport
Metadata:
Creation Timestamp:  2021-12-13T07:29:36Z
Finalizers:
serviceexport.net.gke.io
Generation:  2
Managed Fields:
API Version:  net.gke.io/v1
Fields Type:  FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:kubectl.kubernetes.io/last-applied-configuration:
Manager:      kubectl-client-side-apply
Operation:    Update
Time:         2021-12-13T07:29:36Z
API Version:  net.gke.io/v1alpha1
Fields Type:  FieldsV1
fieldsV1:
f:metadata:
f:finalizers:
.:
v:"serviceexport.net.gke.io":
f:spec:
f:status:
.:
f:conditions:
Manager:         Google-GKE-MCS
Operation:       Update
Time:            2021-12-13T07:31:10Z
Resource Version:  1191220
UID:               45bb42a8-effc-4a9d-95e8-22ff736a54af
Spec:
Status:
Conditions:
Last Transition Time:  2021-12-13T07:30:03Z
Status:                True
Type:                  Initialized
Last Transition Time:  2021-12-13T07:31:10Z
Message:               Conflicting "Project". Using from oldest service export in cluster "projects/mssp-eugene-mcs1/locations/us-east1/clusters/mssp-eugene-mcs-k8s-cluster1"
Reason:                Conflict
Status:                False
Type:                  Exported
Events:                    <none>

我也看到了集线器成员中的集群:

gcloud container hub memberships list --project eugene-mcs1
NAME                          EXTERNAL_ID
eugene-mcs-k8s-cluster2  e943ed80-6a49-4781-897c-57ae3266fb37
eugene-mcs-k8s-cluster1  074d59f2-fce2-491e-a99e-6d2b8587803c

预期的行为是从两个集群导出ngnix服务,并相应地暴露来自两个集群的ngnix pod。

我的配置是使用来自第三个主机项目的Shared VPC的不同项目中的2个K8S集群。

感谢

实际上,GKE多集群服务仅适用于同一主机项目内的集群,即使文档中告诉它适用于不同项目中的集群。
这是谷歌云支持对我的罚单的官方回应:

我收到了来自谷歌产品工程团队的以下反馈:
。。。由于有一个Host项目、一个fleet service项目1和一个service项目2,任何给定服务的后端都必须完全包含在一个项目中;换句话说,后端将仅从单个项目内的集群聚合,尽管它们可以来自该服务项目1中的多个集群(这仍然允许容错,因为这些集群可以来自不同的区域,只是不跨越项目边界(。那些通过VPC共享MCS服务(即yourservice.yournamespace.svc.clusterset.local(的后端,只要服务项目1中的后端存在命名空间(即yournamespace(,就可以使用MCS访问服务项目2。

因此,您的目标服务、所有后台pod(以及所有ServiceExports(都应该在VPC服务项目1中的集群中。为了容错,VPC服务项目1中应该有几个来自不同地区的集群导出该服务。该服务可能在VPC服务项目2中集群,因为VPC服务工程1后台。。。

如上所述,不幸的是,使用来自不同共享VPC服务项目的集群(而不是不同地区的集群(的MCS的高可用性服务目前是不可能的。这是因为MCS工作负载还不能解析具有不同项目ID的常见导出服务。我希望我的解释清楚,如果你有什么不明白的地方,请告诉我。

如果你愿意,我可以创建一个公共问题跟踪器来请求这个功能,这样你就可以关注这个问题的任何更新。然而,如果有的话,我无法提供何时实施的估计时间。

最新更新