将 Google Cloud 中的外部 IP 与 Kubernetes 服务一起使用以将其公开到 Internet

Posted

技术标签:

【中文标题】将 Google Cloud 中的外部 IP 与 Kubernetes 服务一起使用以将其公开到 Internet【英文标题】:Use External IP in Google cloud with Kubernetes service to expose it to the internet 【发布时间】:2021-12-11 00:45:21 【问题描述】:

我有一个在 kubernetes 集群上运行的 phpmyadmin 服务。我想在谷歌云上保留一个外部 IP(静态)以用于此服务,以便可以从 Internet 访问它。 我尝试在 GCP 上保留一个 IP 地址并在 kubernetes 服务文件中使用它,如下所示:

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: phpmyadmin
  name: phpmyadmin
spec:
  externalIPs: [xx.xxx.xxx.xxx]  #the external IP from Google cloud
  ports:
  - name: "8080"
    port: 8080
    targetPort: 80
  selector:
    io.kompose.service: phpmyadmin
status:
  loadBalancer: 

当我指定 spec.type: LoadBalancer 时,可以使用从 type: LoadBalancer 生成的默认 IP 地址从 Internet 访问该服务。

我尝试通过允许端口 8080 上的 Ingress 来更改外部 IP 地址的防火墙规则,但这不起作用。

【问题讨论】:

【参考方案1】:

您应该设置spec.loadBalancerIP,而不是设置exteranlIPs,而spec.type 的值是LoadBalancer

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: phpmyadmin
  name: phpmyadmin
spec:
  ports:
  - name: "8080"
    port: 8080
    targetPort: 80
  selector:
    io.kompose.service: phpmyadmin
  type: LoadBalancer
  loadBalancerIP: "YOUR_IP_ADDRESS"
status:
  loadBalancer: 

Note that exposing your Pods through an external static IP only supports regional load balanced traffic hence your reserved static IP address needs to be regional.

对于全局 IP 地址,您需要通过 Ingress 对象公开 HTTP(s) 负载均衡器

【讨论】:

【参考方案2】:

防火墙规则在实例级别应用。它们无法阻止流量到达负载均衡器本身。

参考:https://cloud.google.com/load-balancing/docs/https/#firewall_rules

您的 GKE LB 服务可能会默认创建 HTTP 负载均衡器,也许您可​​以查看 NLB 负载均衡器:https://cloud.google.com/load-balancing/docs/choosing-load-balancer#summary-of-google-cloud-load-balancers

所有端口:https://cloud.google.com/kubernetes-engine/docs/how-to/service-parameters#all_ports

apiVersion: v1
kind: Service
metadata:
  name: helloworld
  labels:
    app: helloworld
  annotations:
    cloud.google.com/neg: '"exposed_ports": "8080":'
spec:
  ports:
  - name: 8080-8080
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: helloworld
  # Use LoadBalancer type instead of ClusterIP
  type: LoadBalancer

例如:https://spring-gcp.saturnism.me/deployment/kubernetes/load-balancing/external-load-balancing

【讨论】:

以上是关于将 Google Cloud 中的外部 IP 与 Kubernetes 服务一起使用以将其公开到 Internet的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Google Cloud VM 的外部 IP 访问 nginx 容器

如何让我的 Google-service.json 与 Google Cloud Platform 中的 Firestore 一起使用?

将 MySQL Workbench 与 Google Cloud SQL 连接起来

具有外部 IP 的 Google Container Engine,没有负载平衡器

如何防止子域名网址在Google Cloud DNS上更改为URL中的IP地址?

将 google-cloud 与 webpack 集成时遇到问题