将 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,没有负载平衡器