首页 > 解决方案 > 没有负载平衡器的 Google Cloud Kubernetes

问题描述

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

我正在研究如何在谷歌云 kubernetes 引擎上创建一堆服务器。最后用负载均衡器做了一些......虽然现在价格还不错,但我尝试使用 NodePort 服务类型,它绑定到它所绑定的 VM 的本地 IP 地址,而不是外部 IP 或任何东西别的。我将如何将流量路由到节点端口的服务类型?此外,如果 kubernetes 自动执行此操作,我是否可以安全地为节点中的容器创建 SRV 记录以使用可抢占实例/可能的重新分配访问我的服务?

标签: kubernetesgoogle-cloud-platform

解决方案


可以使用Kubernetes NodePort 作为外部服务。

NodePorts 将在您的每台主机上公开一个端口,您可以使用该端口来访问您的服务。

这种方法的缺点是处理端口管理。

应用程序不能假设 HTTPS 是端口 443,或者 MySQL 在端口 3306 上运行。相反,它可能位于 PROD 中的端口 32042 和 DEV 中的 32012 端口上。

考虑以这种方式使用 NodePort 是集群安全性的一个巨大漏洞,而且NodePort 不能暴露标准的低编号端口,如 80 和 443。

apiVersion: v1
kind: Service
metadata:  
  name: my-nodeport-service
spec:
  selector:    
    app: my-app
  type: NodePort
  ports:  
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30036
    protocol: TCP

使用ingress,您可以运行 nginx 等软件负载均衡器,将其公开为所有主机上的端口 80/443,然后控制将任何 HTTP 流量路由到 Kuberbetes 服务。

这最适用于 HTTP/HTTPS 等第 7 层流量。

您可以尝试使用 Ingress 资源和 Ingress 控制器以及外部负载均衡器或公共 IP 来启用基于路径的外部请求到内部服务的路由。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  backend:
    serviceName: other
    servicePort: 8080
  rules:
  - host: foo.mydomain.com
    http:
      paths:
      - backend:
          serviceName: foo
          servicePort: 8080
  - host: mydomain.com
    http:
      paths:
      - path: /bar/*
        backend:
          serviceName: bar
          servicePort: 8080

灵感来自 think-nodeport-kubernetescloud kubernetes nodeport vs ingress文章。


推荐阅读