许多云服务商(比如 Google Compute Engine)定义防火墙以防止服务无意间暴露到 internet 上。 当暴露服务给外网时,你可能需要在防火墙上开启一个或者更多的端口来支持服务。 本文描述了这个过程,以及其他云服务商的具体信息。

负载均衡(LoadBalancer)服务的访问限制

当以 spec.type: LoadBalancer 使用服务时,你可以使用 spec.loadBalancerSourceRanges 指定允许访问负载均衡的 IP 段。 这个字段采用 CIDR 的 IP 段,Kubernetes 会使用这个段配置防火墙。支持这个功能的平台目前有 Google Compute Engine,Google Container Engine 和 AWS。 如果云服务商不支持这个功能,这个字段会被忽略。

假设 10.0.0.0/8 是内部的子网。在下面这个例子中,会创建一个只有集群内部 ip 可以访问的负载均衡器。 集群外部的客户端是无法访问这个负载均衡器的。

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  ports:
    - port: 8765
      targetPort: 9376
  selector:
    app: example
  type: LoadBalancer
  loadBalancerSourceRanges:
  - 10.0.0.0/8

这个例子中,会创建一个只能被 IP 为 130.211.204.1 和 130.211.204.2 的客户端访问的负载据衡器。

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  ports:
    - port: 8765
      targetPort: 9376
  selector:
    app: example
  type: LoadBalancer
  loadBalancerSourceRanges:
  - 130.211.204.1/32
  - 130.211.204.2/32

谷歌计算引擎(Google Compute Engine)

当以 spec.type: LoadBalancer 使用服务时,防火墙会被自动打开。 然而,当以 spec.type: NodePort 使用服务时,防火墙默认 不会 被打开。

Google Compute Engine 的防火墙文档在别处

你可以使用 gcloud 命令行工具添加一个防火墙:

$ gcloud compute firewall-rules create my-rule --allow=tcp:<port>

注意 使用 Google Compute Engine 平台的防火墙时有一个重要的关于安全的注意点:

在 Kubernetes v1.0.0 版本,GCE 防火墙是定义按虚拟机(VM)来的,而不是按 ip 来的。 这就意味着当你在防火墙上打开一个服务端口时,任何在那台虚拟机 IP 上的同一端口的服务 都有被外部访问的潜在可能。注意,这对于其他 Kubernetes 服务来说不是问题,因为他们监 听的 IP 地址与主机节点的外部 IP 地址不同。

考虑一下:

因此,在 Google Compute Engine 或者 Google Container Engine 上开启防火墙端口时请 小心。你可能无意间把其他服务也暴露给了 internet。

这个问题会在 Kubernetes 后续版本中被修复。

其他云服务商

即将更新