配置公网和私网类型的Nginx Ingress Controller

在某些使用场景中,您可能需要调整Nginx Ingress Controller的网络访问类型以控制允许被访问的客户端范围,例如内部服务只允许通过私网访问的情况。通过配置,您可以使Nginx Ingress Controller只支持公网访问、只支持私网访问或同时支持公网和私网访问。

前提条件

操作步骤

当您通过容器服务管理控制台创建集群并在其中安装Nginx Ingress Controller组件时,您可以为其选择公网或私网类型。组件安装后,如果您需要切换Nginx Ingress Controller的网络类型,您需要通过重新部署Nginx Ingress Controller所使用的Service以完成切换。关于配置已有的负载均衡实例注释,详情请参见使用已有的负载均衡

由私网类型调整为公网类型

  1. 执行以下命令,删除当前Nginx Ingress Controller使用的Service。

    kubectl delete svc -n kube-system nginx-ingress-lb
  2. 创建并将以下示例拷贝到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
  3. 执行以下命令,创建公网LoadBalancer类型的Service。

    kubectl apply -f  nginx-ingress-lb.yaml
  4. 执行以下命令,查看新创建公网类型的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

由公网类型调整为私网类型

  1. 执行以下命令,删除当前Nginx Ingress Controller使用的Service。

    kubectl delete svc -n kube-system nginx-ingress-lb
  2. 创建并将以下示例拷贝到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
  3. 执行以下命令,创建公网LoadBalancer类型的Service。

    kubectl apply -f  nginx-ingress-lb.yaml
  4. 执行以下命令,查看新创建的公网类型的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,用于绑定一个公网类型的负载均衡实例。

image
  1. 创建并将以下示例拷贝到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
  2. 执行以下命令,创建新的Service。

    kubectl apply -f  nginx-ingress-lb.yaml