【问题标题】:Kubernetes Ingress Controller with private IP具有私有 IP 的 Kubernetes 入口控制器
【发布时间】:2018-07-05 14:26:44
【问题描述】:

是否可以在没有公共 IP 地址的情况下部署入口控制器 (nginx)?

谢谢!

【问题讨论】:

  • @sokolata-- 您使用的是哪个云提供商以及您指的是哪个入口控制器?

标签: nginx kubernetes kubernetes-ingress


【解决方案1】:

是否可以在没有公共 IP 地址的情况下部署入口控制器 (nginx)?

毫无疑问,是的,如果 Ingress 控制器的 Service 属于 type: NodePort,那么 Ingress 控制器的私有 IP 地址是 每个 Node 的 IP 地址,在端口上指向Service:80:443。秘密地,这正是 type: LoadBalancer 所发生的事情,只是在负载均衡器的 IP 地址和绑定到 Node 的端口之间的云提供商映射的额外糖衣。

所以,要关闭这个循环:如果您希望拥有一个 100% 的内部 Ingress 控制器,则使用 hostNetwork: true 并将 Ingress 控制器的 ports: 绑定为 主机 的端口80和443;然后,为每个虚拟主机创建一个 DNS(A 记录|CNAME 记录),解析为集群中每个 Node 的地址,然后噗:100% 非面向 Internet 的 Ingress 控制器。

【讨论】:

  • 如果您的云提供商支持,例如 GCP,您还可以将 nginx-controller 服务公开为具有内部 IP 的 LoadBalancer 类型
  • @PatrickW 我正在寻找类似的东西。您能详细介绍一下这种方法吗?是稳定图表中的注解或掌舵变量还是直接编辑yaml文件?
  • 在 GCP 上,您添加一个 annotation to the service type LoadBalancer, cloud.google.com/load-balancer-type: "internal"。不过,您需要重新创建服务,您无法编辑已经存在的服务
  • 谢谢。这个命令helm install stable/nginx-ingress --set controller.service.annotations."cloud\.google\.com/load-balancer-type"="Internal" 为我工作:)
  • @mdaniel :非常感谢一个具体的例子。
【解决方案2】:

Google Kubernetes Engine 中的内部 IP 入口

假设您想在 GKE 中部署一个没有公共 IP 地址的入口控制器 (nginx)。以下是对我有用的方法。

1。使用适当的注释安装 Nginx-Ingress 控制器

使用stable/nginx-ingress helm chart 将ingress-nginx controller 安装到 GKE 集群中。

根据这个GCP document,我们可以创建一个带有cloud.google.com/load-balancer-type: "Internal"注解的负载均衡器资源来创建一个内部负载均衡器。运行以下命令将控制器添加到 GKE。

helm install --name ingress-controller stable/nginx-ingress \
--set controller.service.annotations."cloud\.google\.com/load-balancer-type"="Internal"

2。使用此控制器部署入口资源

要让 Ingress 资源使用控制器,请将 kubernetes.io/ingress.class: nginx 注解添加到您的 Ingress 资源中。

使用 nginx-ingress 控制器的示例 Ingress 资源如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
  name: nginx-test
spec:
  rules:
    - host: www.example.com
      http:
        paths:
        - backend:
            serviceName: my-service-1
            servicePort: 80
          path: /tasks
        - backend:
            serviceName: my-service-2
            servicePort: 80
          path: /

现在使用kubectl 命令,您可以看到分配给您的入口资源的 IP 是一个内部 IP 地址。

3。如果您也想使用 TLS(可选)

将以下内容添加到您的 YAML 清单中:

  ...
  rules:
  ...
  tls:
  - hosts:
    - www.example.com
    secretName: my-certs

在上面的示例中,my-certs 是一个 Kubernetes 机密,包含使用以下命令创建的服务器密钥、证书和 CA 证书:

kubectl create secret generic my-certs --from-file=tls.crt=server.crt --from-file=tls.key=server.key --from-file=ca.crt=ca.crt

对于上面的示例,密钥和证书是使用引用此Medium Article 的示例主机名创建的。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-01-26
    • 2020-02-23
    • 2022-01-26
    • 2020-06-09
    • 2021-07-17
    • 2021-11-20
    • 2019-01-21
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多