在某些使用场景中,您可能需要调整Nginx Ingress Controller的网络访问类型以控制允许被访问的客户端范围,例如内部服务只允许通过私网访问的情况。通过配置,您可以使Nginx Ingress Controller只支持公网访问、只支持私网访问或同时支持公网和私网访问。
在集群中,Nginx Ingress Controller使用LoadBalancer类型的Service作为网络入口。Service使用的传统型负载均衡 CLB支持公网与私网类型。其中公网类型CLB仅支持公网访问,私网类型CLB支持私网访问,您可针对应用场景进行选择,也可以同时使用两种类型的CLB,同时提供公网与私网访问。
当您通过容器服务管理控制台创建集群并在其中安装Nginx Ingress Controller组件时,您可以为其选择公网或私网类型。组件安装后,如果您需要切换Nginx Ingress Controller的网络类型,您需要通过重新部署Nginx Ingress Controller所使用的Service以完成切换。关于配置已有的负载均衡实例注释,详情请参见使用已有的负载均衡。
前提条件
已安装Nginx Ingress Controller组件。具体操作,请参见管理Nginx Ingress Controller组件。
已通过kubectl工具连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
操作步骤
由私网类型调整为公网类型
创建并将以下示例拷贝到nginx-ingress-lb.yaml中。
apiVersion: v1 kind: Service metadata: name: new-nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer externalTrafficPolicy: "Local" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx
执行以下命令,创建公网LoadBalancer类型的Service。
kubectl apply -f nginx-ingress-lb.yaml
执行以下命令,查看新创建公网类型的Service。
kubectl -n kube-system get svc | grep new-nginx-ingress-lb
预期输出:
new-nginx-ingress-lb LoadBalancer 192.168.*.** 120.26.**.** 80:30275/TCP,443:30899/TCP 52m
使用新建的公网Service进行测试访问,您可选择为新的Service配置DNS。确认新的Service可以按Ingress完成正常转发后,即可执行下一步骤。
执行以下命令,删除当前Nginx Ingress Controller使用的Service。
重要该操作会导致现有的私网类型Nginx Ingress Controller失效。在操作前,请确认您理解此操作会造成的影响、验证了新的Service正常工作,并在流量低峰期完成下列操作。
kubectl delete svc -n kube-system nginx-ingress-lb
由公网类型调整为私网类型
创建并将以下示例拷贝到nginx-ingress-lb.yaml中。
apiVersion: v1 kind: Service metadata: name: new-nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # 指明负载均衡实例地址类型为私网类型。 spec: type: LoadBalancer externalTrafficPolicy: "Local" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx
执行以下命令,创建私网LoadBalancer类型的Service。
kubectl apply -f nginx-ingress-lb.yaml
执行以下命令,查看新创建的私网类型的Service。
kubectl -n kube-system get svc | grep new-nginx-ingress-lb
预期输出:
new-nginx-ingress-lb LoadBalancer 192.168.*.** 172.2**.** 80:30275/TCP,443:30899/TCP 5h
使用新建的私网Service进行测试访问。确认新的Service可以按Ingress完成正常转发后,即可执行下一步骤。
执行以下命令,删除当前Nginx Ingress Controller使用的Service。
重要该操作会导致现有的公网类型Nginx Ingress Controller失效。在操作前,请确认您理解此操作会造成的影响、验证了新的Service正常工作,并在流量低峰期完成下列操作。
kubectl delete svc -n kube-system nginx-ingress-lb
同时支持私网和公网类型
对于一些特殊场景,您期望容器集群内的服务既能允许公网访问,同时又希望能被同一个VPC下的其他服务直接访问(不经过公网)。您需要为Nginx Ingress Controller所属的Pod部署两个不同网络类型的Service来达成这种效果:
如果您目前的Nginx Ingress Controller是公网类型,那么您可以添加一个名为nginx-ingress-lb-intranet的私网类型的Service,用于绑定一个私网类型的负载均衡实例。
如果您目前的Nginx Ingress Controller是私网类型,那么您可以添加一个名为nginx-ingress-lb-internet的公网类型的Service,用于绑定一个公网类型的负载均衡实例。
创建并将以下示例拷贝到nginx-ingress-lb.yaml中。
添加私网类型的Service
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb-intranet namespace: kube-system labels: app: nginx-ingress-lb annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # 指明负载均衡实例地址类型为私网类型。 spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx
添加公网类型的Service
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb-internet namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx
执行以下命令,创建新的Service。
kubectl apply -f nginx-ingress-lb.yaml