当前位置: 首页 > 知识库问答 >
问题:

创建没有GCP负载平衡器的kubernetes nginx入口

谢泽语
2023-03-14

所以我正在使用库伯内特斯作为一个辅助项目,它很棒。运行像我这样的小项目更便宜(一个3-5个实例的小集群基本上为我提供了大约30美元/月的GCP所需的一切)。

我唯一努力的领域是尝试使用kubernetes入口资源映射到集群并扇出到我的微服务(它们是小型Go或节点后端)。我有入口映射到不同服务的配置设置,没有问题。

我知道,在创建入口资源时,您可以很容易地让GCP启动负载平衡器。这很好,但这也意味着每月增加20美元,增加了项目成本。一旦/如果这件事得到一些牵引力,可以忽略,但现在,为了更好地理解库伯内特斯,我想做以下几点:

    null

有没有办法使用库伯内特斯和入口资源来完成这件事?

谢啦!

共有3个答案

傅涵忍
2023-03-14

您还可以制作一个nginx-ingress图表,让它提取一个临时IP,然后将其升级到静态。这将为您留下一个L7单区域负载均衡器。

本指南介绍了它。如果您使用库贝-lego,您可以忽略TLS内容,它与nginx-ingress一样有效

https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/static-ip

林祯
2023-03-14

TLDR:如果您想在3000以下的端口上提供您的网站/Web服务,那么不,这是不可能的。如果有人能找到一种方法,我很想知道怎么做。

我在尝试在低于3000的端口上服务时使用的两种主要方法包括:

  • Installing the nginx-ingress controller service to be of type NodePort, listening on ports 80 and 443. However, this results in the following error:
    Error: UPGRADE FAILED: Service "nginx-ingress-controller" is invalid:
    spec.ports[0].nodePort: Invalid value: 80: provided port is not in the
    valid range. The range of valid ports is 30000-32767
    

    如果您可以在3000以上的端口上使用,请参阅下面的说明。

    我已经尝试删除我的负载均衡器,这是我能想到的最好的解决方案。它有以下缺陷:

    • 用于访问网页的端口不是通常的80和443,因为从节点公开这些端口并不简单。如果我弄明白了,我会稍后更新

    以及以下好处:

    • 没有负载平衡器

    假设您已经安装了Helm(如果您不遵循以下步骤:在GKE上安装Helm),请创建一个类型为NodePort的nginx入口。

    helm install \
      --name nginx-ingress \
      stable/nginx-ingress \
      --set rbac.create=true \
      --set controller.publishService.enabled=true \
      --set controller.service.type=NodePort \
      --set controller.service.nodePorts.http=30080 \
      --set controller.service.nodePorts.https=30443
    

    为您的路由创建入口定义。

    # my-ingress-resource.yaml
    
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: reverse-proxy
      namespace: production # Namespace must be the same as that of target services below.
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/ssl-redirect: "false" # Set to true once SSL is set up.
    spec:
      rules:
      - http:
          paths:
          - path: /api
            backend:
              serviceName: backend
              servicePort: 3000
          - path: /
            backend:
              serviceName: frontend
              servicePort: 80
    

    然后安装它

    kubectl apply -f my-ingress-resource.yaml
    

    找到集群的标签。

    gcloud compute instances list
    

    如果集群实例的名称如下

    gke-cluster-1-pool-1-fee097a3-n6c8
    gke-cluster-1-pool-1-fee097a3-zssz
    

    那么您的集群标签就是gke-cluster-1-pool-1-fee097a3。

    转到GCP防火墙页面。确认在导航栏中选择了正确的项目。

    单击“创建防火墙规则”。给这条规则起个像样的名字。您可以将大多数设置保留为默认设置,但超过“目标标记”下的集群标记。将源IP范围设置为0.0.0.0/0。在“协议和端口”下,将“允许所有”更改为“指定的协议和端口”。选中TCP框,并在输入字段中输入30080、30443。单击“创建”。

    转到https://console.cloud.google.com/networking/addresses/并单击“保留静态地址”。给它一个描述性名称,并选择正确的区域。选择正确的区域后,您应该能够单击“附加到”下拉列表并选择一个库伯内特斯节点。单击“保留”。

    保留静态IP后,通过查看外部IP地址列表,找出授予了哪个静态IP。

    将其复制到浏览器中,然后固定一个端口(<代码>

秦景福
2023-03-14

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

---
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

现在,使用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

现在,假设您的静态IP附加到任何运行库贝-proxe的kubernetes节点,更新DNS以指向静态IP,您应该能够访问myapp.example.com:32080,入口将您映射回您的应用程序。

一些额外的事情:

如果您想使用低于32080的端口,请记住,如果您使用的是CNI网络,那么hostport将出现问题。建议在端口80上侦听负载平衡器,我想您可以将nginx设置为执行代理传递,但这会变得很困难。这就是为什么建议使用云提供商的负载平衡器:)

 类似资料:
  • 有一个入口配置,比如 gke创建了nginx ingress负载平衡器,但也创建了另一个具有后端的负载平衡器,就像如果没有选择nginx,而是选择gcp作为ingress一样。 下面的屏幕截图以红色显示了两个意外的LB,蓝色显示了两个nginx ingress LB,分别用于我们的qa和prod env。 kubectl的输出获取服务 gcp gke服务视图中错误信息入口的屏幕截图 这是意料之中的

  • 我正在尝试设置应用型负载均衡,以将流量转发到AWS中的Nginx入口控制器。要设置Nginx入口控制器,我使用的是从安装说明中获得的YML。 部署后,一切正常,流量正确转发到EKS pod。但是,上面的YML文件正在aws中创建“经典负载均衡器”,因为我想创建“应用型负载均衡器”。我将“service.beta.kubernetes.io/aws-load-balancer-type: elb”更

  • 在Kubernetes中创建负载平衡器类型的服务时,它是创建一个全新的外部负载平衡器,还是只为负载平衡器类型的第一个服务创建一个负载平衡器,并将该负载平衡器重新用于负载平衡器类型的所有后续服务? 这个问题特别重要,因为为每个服务构建一个单独的负载平衡器对我来说成本太高。 如果它特定于云提供商,我使用Azure,但我很想知道其他云提供商是否不同。

  • 是否可以在没有负载均衡器的情况下在库伯内特斯中使用入口控制器功能(在数字海洋中)。 是否有其他机制允许域名映射到Kubernetes服务;例如,如果我在Kubernetes集群上托管两个WordPress站点: == 域名如何在不显式输入端口号的情况下映射到容器端口8080。 感谢任何帮助。

  • 这意味着Zookeeper将负载均衡器理解为一个客户机,并与之建立联系。但是负载均衡器只是ping TCP2181就出来了。