是否可以在没有公共IP地址的情况下部署入口控制器(nginx(?
谢谢!
在没有公共IP地址的情况下部署入口控制器(nginx(?
毫无疑问,是的,如果入口控制器的Service
是type: NodePort
,那么入口控制器的私有 IP 地址是每个Node
的 IP 地址,位于指向Service
的:80
和:443
的端口上。秘密地,这正是type: LoadBalancer
正在发生的事情,只是在负载均衡器的IP地址和Node
端口的绑定之间映射的云提供商的额外糖衣。
因此,为了关闭该循环:如果您希望拥有 100% 的内部入口控制器,请使用hostNetwork: true
并将入口控制器的ports:
绑定为主机的端口 80 和 443; 然后,创建一个 DNS(A 记录|CNAME 记录(,用于解析为群集中每个Node
的地址的每个虚拟主机,以及 poof:100% 非面向 Internet 的入口控制器。
Kubernetes Engine 中的内部 IP 入口
假设您要在 GKE 中部署没有公共 IP 地址的入口控制器 (nginx(。以下是对我有用的东西。
1. 安装带有适当注释的 Nginx-Ingress 控制器
使用 stable/nginx-ingresshelm chart 在 GKE 集群中安装 ingress-nginx 控制器。
根据此 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 控制器的入口资源示例如下所示:
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
对于上面的示例,使用引用此中型文章的示例主机名创建密钥和证书。
希望这有帮助。