在没有 GCP 负载平衡器的情况下创建 kubernetes nginx 入口

mar*_*mas 15 nginx google-cloud-platform kubernetes google-kubernetes-engine kubernetes-ingress

所以我将 Kubernetes 用于一个副项目,它很棒。为我所从事的小型项目运行更便宜(3-5 个实例的小集群基本上可以在 GCP 上以大约 30 美元/月的价格提供我所需的一切)。

我唯一遇到困难的地方是尝试使用 kubernetes Ingress 资源映射到集群并扇出到我的微服务(它们是小型 Go 或 Node 后端)。我有将入口映射到不同服务的配置设置,那里没有问题。

我知道当你创建一个入口资源时,你真的可以很容易地让 GCP 启动一个 LoadBalancer。这很好,但它也代表了另外 20 美元/月,增加了项目成本。一旦/如果这件事得到一些关注,那可以忽略不计,但现在以及为了更好地理解 Kubernetes,我想执行以下操作:

  • 从 GCP 获取静态 IP,
  • 将它与入口资源一起使用
  • 在同一个集群中托管负载均衡器(使用 nginx 负载均衡器)
  • 避免为外部负载均衡器付费

有什么办法甚至可以使用 Kubernetes 和入口资源来完成吗?

谢谢!

jax*_*orm 7

是的,这是可能的。部署您的入口控制器,并使用 NodePort 服务进行部署。例子:

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: nginx-ingress-controller
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32080
    protocol: TCP
    name: http
  - port: 443
    targetPort: 443
    nodePort: 32443
    protocol: TCP
    name: https
  selector:
    k8s-app: nginx-ingress-controller
Run Code Online (Sandbox Code Playgroud)

现在,使用 DNS 条目创建一个入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: my-app-service #obviously point this to a valid service + port
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

现在,假设您的静态 IP 连接到任何运行 kube-proxy 的 kubernetes 节点,更新 DNS 以指向静态 IP,您应该能够访问myapp.example.com:32080并且入口会将您映射回您的应用程序。

一些额外的事情:

如果您想使用低于 32080 的端口,那么请记住,如果您使用的是 CNI 网络,则使用 hostport 会遇到问题。建议让负载均衡器监听 80 端口,我想你可以只设置 nginx 来执行代理传递,但这变得很困难。这就是为什么建议使用您的云提供商的负载均衡器的原因:)