【发布时间】:2018-07-05 14:26:44
【问题描述】:
是否可以在没有公共 IP 地址的情况下部署入口控制器 (nginx)?
谢谢!
【问题讨论】:
-
@sokolata-- 您使用的是哪个云提供商以及您指的是哪个入口控制器?
标签: nginx kubernetes kubernetes-ingress
是否可以在没有公共 IP 地址的情况下部署入口控制器 (nginx)?
谢谢!
【问题讨论】:
标签: nginx kubernetes kubernetes-ingress
是否可以在没有公共 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 控制器。
【讨论】:
helm install stable/nginx-ingress --set controller.service.annotations."cloud\.google\.com/load-balancer-type"="Internal" 为我工作:)
假设您想在 GKE 中部署一个没有公共 IP 地址的入口控制器 (nginx)。以下是对我有用的方法。
使用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"
要让 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 地址。
将以下内容添加到您的 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 的示例主机名创建的。
希望这会有所帮助。
【讨论】: