全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:配置Ingress Controller CLB的公网和私网类型

更新时间:Jun 27, 2024

本文介绍了在ACK集群中如何自定义配置Nginx Ingress Controller使用的负载均衡(Classic Load Balancer,简称CLB)的网络类型,例如公私网转换、同时支持公私网等。

前提条件

操作步骤

通过容器服务管理控制台创建集群并在其中安装Nginx Ingress Controller组件时,您可以选择公网或私网类型的负载均衡实例。创建集群后,如果您需要切换CLB实例的网络类型,或需要指定IP作为流量入口点,您可以参考以下配置。

私网配置成公网的CLB

您可以调整Nginx Ingress Controller私网类型为公网类型,使ACK集群内的服务能够在公网上公开访问。

image
  1. 创建公网CLB实例,请参见创建和管理CLB实例

    说明

    在对应的VPC网络下申请一个期望规格的CLB。

  2. 使用以下示例Service的YAML内容,创建名为nginx-ingress-lb.yaml文件。通过以下示例Annotation来配置Nginx Ingress Controller使用该CLB实例。您可以执行kubectl apply -f nginx-ingress-lb.yaml命令,创建公网类型的Service。

    # nginx ingress slb service
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
      annotations:
        # 修改为您的公网CLB实例ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: <YOUR_LOADBALANCER_ID>
        # 是否自动创建CLB端口监听(会覆写已有端口监听),也可手动创建端口监听。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
    spec:
      type: LoadBalancer
      # route traffic to other nodes
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        # select app=ingress-nginx pods
        app: ingress-nginx

    更多注释请参见通过Annotation配置传统型负载均衡CLB

  3. 配置Nginx Ingress Controller的网络类型时,将Service删除并重建。

    执行以下命令,删除私网类型的Service。

    kubectl delete svc -n kube-system nginx-ingress-lb

    执行以下命令,创建公网类型的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

公网配置成私网的CLB

您可以调整Nginx Ingress Controller公网类型为私网类型,使ACK集群内的服务只对在同一个VPC内的其他服务进行调用访问。

image
  1. 创建私网CLB实例,请参见创建和管理CLB实例

    说明

    在对应的VPC网络下申请一个期望规格的CLB实例。

  2. 使用以下示例Service的YAML内容,创建名为nginx-ingress-lb.yaml文件。通过以下示例Annotation来配置Nginx Ingress Controller使用该CLB实例。您可以执行kubectl apply -f nginx-ingress-lb.yaml命令,创建私网类型的Service。

    # nginx ingress slb service
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
      annotations:
        # 指明CLB实例地址类型为私网类型。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet
        # 修改为您的私网CLB实例ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: <YOUR_LOADBALANCER_ID>
        # 是否自动创建CLB端口监听(会覆写已有端口监听),也可手动创建端口监听。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: 'true'
    spec:
      type: LoadBalancer
      # route traffic to other nodes
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        # select app=ingress-nginx pods
        app: ingress-nginx

    更多注释请参见通过Annotation配置传统型负载均衡CLB

  3. 配置Nginx Ingress Controller的网络类型时,将Service删除并重建。

    执行以下命令,删除公网类型的Service。

    kubectl delete svc -n kube-system nginx-ingress-lb

    执行以下命令,创建私网类型的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

同时使用私网和公网的CLB

对于一些特殊场景,您期望容器集群内的服务既能允许公网访问,同时又希望能被同一个VPC下的其他服务直接访问(不经过公网)。您只需额外部署一个nginx-ingress-lb-intranet服务。

如果之前您部署Nginx Ingress Controller组件时,默认选择的是私网SLB,那么您可以为其创建一个名为nginx-ingress-lb-public的Service,用于绑定一个公网SLB实例。可以在nginx-ingress-lb-public Service下引用这个SLB实例ID,注意需要调整Annotation为internet,即:"service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet"。更多Annotation详情,请参见通过Annotation配置传统型负载均衡CLB

image
  1. 创建私网CLB实例,请参见创建和管理CLB实例

    说明

    在对应的VPC网络下申请一个期望规格的SLB实例。

  2. 新建Intranet Nginx Ingress Controller服务。

    使用以下示例Service的YAML内容,创建名为nginx-ingress-lb-intranet.yaml文件。您可以使用kubectl apply -f nginx-ingress-lb-intranet.yaml创建nginx-ingress-lb-intranet的Service。

    # intranet nginx ingress slb service
    apiVersion: v1
    kind: Service
    metadata:
      # 这里服务取名为nginx-ingress-lb-intranet。
      name: nginx-ingress-lb-intranet
      namespace: kube-system
      labels:
        app: nginx-ingress-lb-intranet
      annotations:
        # 指明CLB实例地址类型为私网类型。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet
        # 修改为您的私网CLB实例ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: <YOUR_INTRANET_SLB_ID>
        # 是否自动创建CLB端口监听(会覆写已有端口监听),也可手动创建端口监听。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: 'true'
    spec:
      type: LoadBalancer
      # route traffic to other nodes
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        # select app=ingress-nginx pods
        app: ingress-nginx
  3. 执行以下命令,创建nginx-ingress-lb-intranet的Service。

    kubectl apply -f  nginx-ingress-lb-intranet.yaml
  4. 执行以下命令,查看nginx-ingress-lb的Service,会出现两个Nginx Ingress Controller服务:一个配置的是公网CLB实例,一个是VPC私网CLB实例。

    kubectl -n kube-system get svc | grep nginx-ingress-lb
    nginx-ingress-lb            LoadBalancer   172.1*.*.**    47.96.2**.**   80:31456/TCP,443:30016/TCP   5h
    nginx-ingress-lb-intranet   LoadBalancer   172.19.*.***   192.16*.*.**   80:32394/TCP,443:31000/TCP   7m