如何在 Google Cloud Platform 上使用 ClusterIP None 公开 StatefulSet 服务?

How can I expose a StatefulSet service with ClusterIP None on Google Cloud Platform?

如何在 Google 云平台的 Kubernetes 上使用 ClusterIP=None 公开 StatefulSet 服务(cassandra、mysql 等...)?

我需要更改 ClusterIP 配置吗?或者我需要配置 Google Cloud NAT?或者我需要改变其他东西?

谢谢

编辑:我想从互联网上的任何地方从外部 IP 连接到 cassandra

EDIT2:我猜解决方案是使用LoadBalance 而不是ClusterIP,但是当我使用LoadBalance 时,Cassandra 节点找不到种子节点。然后我仍然使用 ClusterIP=None 到 Cassandra 集群,我创建了另一个带有 type=LoadBalance 的 POD 来连接到 Cassandra 并连接到外部。现在它开始工作了:)

ClusterIP 服务不会暴露在 Kubernetes 集群之外。也许您的意思是改用 NodePort 或 LoadBalancer 服务?

如果“expose”是指无需集群 IP 即可到达服务端点的能力,那么只需使用 selector在你的无头服务中,即

apiVersion: v1
kind: Service
metadata:
  name: cassandra
spec:
  clusterIP: None
  selector:
    app: cassandra
  ports:
  - port: 80
    targetPort: 80

更多详情请参考documentation

否则,如果您想在集群外公开您的部署,您将无法使用无头服务来完成。

如果您想在外部公开服务,您将需要一个支持 ClusterIP 的服务,无论是 NodePort 还是 LoadBalancer;即使您使用入口,您也至少需要使用 ClusterIP 服务对其进行备份。

ClusterIP 只是内部的,它为 Kubebernetes 集群提供了一个固定端点来引用您的 deployment/pod 内部 。公开您的服务的最简单方法是使用 NodePort,在这种情况下,您的服务将采用具有高端口号 (30000+) 的外部节点的 IP。在 GCP 上,如果您定义 load-balancer,您将获得一个外部 IP,并且流量将按顺序转发到有状态集中的 pods。如果您使用入口,您的外部 IP 将是您入口的 IP,并且将根据请求 URL 将数据包转发到您的服务(即,您可以将多个 FQDN 映射到一个外部 IP你的 DNS)。

"Headless" 服务主要用于将你的设计与 Kubernetes 解耦。假设您将进行自己的服务发现,我认为这对您的应用程序来说不是一个好的用例。

希望对您有所帮助!