是否可以在没有公共IP地址的情况下部署入口控制器(nginx)?
谢谢!
答案 0 :(得分:3)
是否可以在没有公共IP地址的情况下部署入口控制器(nginx)?
毫无疑问,是的,如果Ingress控制器的Service
是type: NodePort
,则Ingress控制器的私有IP地址是每个 Node
的IP地址,在指向:80
的{{1}}和:443
的端口上。秘密地,这正是Service
所发生的一切,只是云提供商的额外糖衣在负载平衡器的IP地址与type: LoadBalancer
的端口绑定之间进行了映射。
因此,要结束该循环:如果您希望拥有100%内部Ingress控制器,请使用Node
并将Ingress控制器的hostNetwork: true
绑定为主机的端口80和443;然后,为每个虚拟主机创建一个DNS(A记录| CNAME记录),该DNS解析为群集中每个ports:
的地址,并欺骗:100%非面向Internet的入口控制器。
答案 1 :(得分:0)
假设您要在GKE中部署没有公共IP地址的入口控制器(nginx)。以下是对我有用的。
使用stable/nginx-ingress掌舵图将ingress-nginx controller安装到GKE群集中。
根据此GCP document,我们可以创建带有cloud.google.com/load-balancer-type: "Internal"
批注的Load Balancer资源,以创建内部Load Balancer。运行以下命令将控制器添加到GKE。
helm install --name ingress-controller stable/nginx-ingress \
--set controller.service.annotations."cloud\.google\.com/load-balancer-type"="Internal"
要使Ingress资源使用控制器,请在您的Ingress资源中添加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地址。
将以下内容添加到您的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的示例主机名创建的。
希望这会有所帮助。