在没有负载均衡器的情况下公开Goog​​le Container Engine上的端口80和443


23

目前,我正在从事一个小型的业余项目,一旦准备好,我将使其开源。此服务正在Google Container Engine上运行。我选择GCE是为了避免配置麻烦,成本负担得起并学习新东西。

我的Pod运行正常,我创建了一个服务,其类型LoadBalancer可以在端口80和443上公开该服务。这完美地工作了。

但是,我发现对于每种LoadBalancer服务,都会创建一个新的Google Compute Engine负载均衡器。这个负载均衡器非常昂贵,对于单个实例上的一个业余项目而言,确实已经完成了。

为了降低成本,我正在寻找一种无需负载均衡器即可暴露端口的方法。

到目前为止,我已经尝试过:

有没有办法在没有负载均衡器的情况下为Google Container Engine上的单个实例公开端口80和443?

Answers:


10

是的,通过服务上的externalIP。我使用的示例服务:

apiVersion: v1
kind: Service
metadata:
  name: bind
  labels:
    app: bind
    version: 3.0.0
spec:
  ports:
    - port: 53
      protocol: UDP
  selector:
    app: bind
    version: 3.0.0
  externalIPs:
    - a.b.c.d
    - a.b.c.e

请注意,配置文件中列出的IP必须是GCE上的内部IP。


谢谢!但是我想我错过了一些东西。该服务已部署,但无法从Internet获得。我设置了正确的防火墙规则。服务显示正确的信息externalIp
Ruben Ernst

对不起,我很晚才回答,忘了我花了很多时间在同样的问题上。列出的IP必须是内部 IP,而不是外部IP(至少在GCE上)。
ConnorJC

谢谢,这就是解决方案!不幸的是,我还不允许投票...我放弃了此评论,让您知道此答案与上面的评论(这是关键)相结合,解决了我的问题!
鲁宾·恩斯特

1
您(或@RubenErnst)是否会扩大答案?特别是,“ GCE上列出的IP必须是内部IP。” 您是指哪个IP?您是否可以使用分配给您的单节点群集的静态IP来工作?
布雷特

@Brett:对不起,我的回复很晚。同时您的问题已经回答了吗?
鲁本·恩斯特

4

除了ConnorJC出色且可行的解决方案:在此问题中还描述了相同的解决方案: Kubernetes-是否可以避免使用GCE负载均衡器来降低成本?

“ internalIp”是指计算实例的(也就是节点的)内部ip(如在Google Cloud Platform-> Google Compute Engine-> VM Instances上看到的)

注释提示为什么应配置内部ip而不是外部ip。

此外,在为端口80和443配置了服务之后,我必须创建一个防火墙规则以允许向我的实例节点的流量:

gcloud compute firewall-rules create your-name-for-this-fw-rule --allow tcp:80,tcp:443 --source-ranges=0.0.0.0/0

设置完成后,我可以通过http(s):// externalIp访问我的服务


使用节点内部IP可以达到目的。👍这样的命名混乱!
詹姆斯

1

如果只有一个吊舱,则可以使用它hostNetwork: true来实现此目的:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: caddy
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: caddy
    spec:
      hostNetwork: true # <---------
      containers:
      - name: caddy
        image: your_image
        env:
        - name: STATIC_BACKEND # example env in my custom image
          value: $(STATIC_SERVICE_HOST):80

请注意,这样做,您的Pod将继承主机的DNS解析器,而不继承Kubernetes。这意味着您不能再通过DNS名称解析群集服务。例如,在上面的示例中,您无法通过http:// static访问该static服务。您仍然可以通过环境 IP注入的群集IP访问服务。

此解决方案比使用服务的externalIP更好,因为它绕过了kube-proxy,您将收到正确的源IP。


1

将@ConnorJC @derMikey的答案综合为对我有用的东西:

给定在Compute Engine实例上运行的群集池:

gce vm name: gke-my-app-cluster-pool-blah`
internal ip: 10.123.0.1
external ip: 34.56.7.001 # will be publically exposed

我提供了服务:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-app
  name: my-app-service
spec:
  clusterIP: 10.22.222.222
  externalIPs:
  - 10.123.0.1 # the instance internal ip
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: my-app
  type: ClusterIP

然后为项目中的所有(?)ips打开防火墙:

gcloud compute firewall-rules create open-my-app --allow tcp:80,tcp:443 --source-ranges=0.0.0.0/0

然后my-app可以通过 GCE实例公用IP34.56.7.001(而不是群集ip)进行访问


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.