在某些使用场景中,您可能需要调整Nginx Ingress Controller的网络访问类型以控制允许被访问的客户端范围,例如内部服务只允许通过私网访问的情况。通过配置,您可以使Nginx Ingress Controller只支持公网访问、只支持私网访问或同时支持公网和私网访问。
前提条件
已安装Nginx Ingress Controller组件。具体操作,请参见管理Nginx Ingress Controller组件。
已通过kubectl工具连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
操作步骤
当您通过容器服务管理控制台创建集群并在其中安装Nginx Ingress Controller组件时,您可以为其选择公网或私网类型。组件安装后,如果您需要切换Nginx Ingress Controller的网络类型,您需要通过重新部署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: 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 nginx-ingress-lb
预期输出:
nginx-ingress-lb LoadBalancer 192.168.*.** 120.26.**.** 80:30275/TCP,443:30899/TCP 52m
由公网类型调整为私网类型
执行以下命令,删除当前Nginx Ingress Controller使用的Service。
kubectl delete svc -n kube-system nginx-ingress-lb
创建并将以下示例拷贝到nginx-ingress-lb.yaml中。
apiVersion: v1 kind: Service metadata: name: 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 nginx-ingress-lb
预期输出:
nginx-ingress-lb LoadBalancer 192.168.*.** 172.2**.** 80:30275/TCP,443:30899/TCP 5h
同时支持私网和公网类型
对于一些特殊场景,您期望容器集群内的服务既能允许公网访问,同时又希望能被同一个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