使用私有IP的Kubernetes Ingress控制器

8

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

谢谢!


@sokolata-- 你在使用哪个云服务提供商,你所指的入口控制器是哪一个? - Sourav
2个回答

6
有没有可能部署一个没有公共IP地址的Ingress Controller(Nginx)?
毫无疑问,可以。如果Ingress Controller的Service类型为NodePort,则Ingress Controller的私有IP地址是每个节点的IP地址,端口指向Service的:80和:443端口。事实上,这正是使用type: LoadBalancer时发生的情况,只不过云提供商提供了一个额外的负载均衡器IP地址和绑定到节点端口之间的映射。
因此,要完全内部化Ingress Controller,可以使用hostNetwork: true并将Ingress Controller的端口:绑定到主机的端口80和443;然后,为每个虚拟主机创建一个DNS记录(A记录|CNAME记录),解析到集群中每个节点的地址,完成:百分之百非互联网面向的Ingress Controller。

3
如果您的云提供商支持,例如GCP,您还可以将nginx-controller服务公开为具有内部IP的LoadBalancer类型。 - Patrick W
@PatrickW 我正在寻找类似的东西。你能说得更多关于这种方法吗?它是一个注释还是Helm变量在稳定图表中,还是直接编辑YAML文件? - Amit Yadav
1
在GCP上,您可以向服务类型LoadBalancer添加一个注释,cloud.google.com/load-balancer-type:"internal"。但需要重新创建服务,无法编辑已经存在的服务。 - Patrick W
谢谢。这个命令 helm install stable/nginx-ingress --set controller.service.annotations."cloud\.google\.com/load-balancer-type"="Internal" 对我很有用 :) - Amit Yadav
@mdaniel:非常感谢您提供一个具体的例子。 - smaikap

3

Google Kubernetes Engine 中的内部 IP 入口

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

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

使用 stable/nginx-ingress Helm chart 在我们的 GKE 集群中安装ingress-nginx controller

根据这个 GCP 文档,我们可以创建一个带有 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. 使用此控制器部署入口资源

为了让入口资源使用该控制器,请在您的入口资源中添加 kubernetes.io/ingress.class: nginx 注释。

一个使用 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文章

希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接