我根据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的常见导出服务。我希望我的解释清楚,如果你有什么不明白的地方,请告诉我。
如果你愿意,我可以创建一个公共问题跟踪器来请求这个功能,这样你就可以关注这个问题的任何更新。然而,如果有的话,我无法提供何时实施的估计时间。