全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:部署Ingress Controller使用私网SLB

更新时间:Jul 19, 2023

容器服务集群可以允许公网访问,也可以被同一个VPC下的其他服务直接访问。本文介绍如何配置阿里云容器服务Kubernetes Ingress Controller使用私网负载均衡SLB(Server Load Balancer)。

前提条件

  • 您已成功创建一个容器服务Kubernetes集群,请参见创建Kubernetes托管版集群

  • 若您使用的是ACK专有版集群,支持通过SSH连接到集群的Master节点,请参见通过SSH连接ACK专有版集群的Master节点

    说明

    由于ACK专有版集群的Master节点由您自行创建并维护,因此为了方便您的维护管理,容器服务ACK支持通过SSH方式连接专有版集群的Master节点。

背景信息

通过阿里云容器服务管理控制台创建的Kubernetes集群在初始化时会自动部署一套Nginx Ingress Controller,默认其挂载在公网SLB实例上。1

配置私网SLB

您可以调整Nginx Ingress Controller服务的配置,使容器集群内的服务仅仅只对同一个VPC内其他服务调用访问。1

  1. 手动申请私网SLB实例,请参见创建和管理CLB实例

    说明

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

  2. 配置Nginx Ingress Controller服务。

    当您成功创建一个私网SLB实例后,您可以通过以下示例注解来配置Nginx Ingress Controller使用该SLB实例,请参见通过Annotation配置负载均衡

    # nginx ingress slb service
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
      annotations:
        # 指明SLB实例地址类型为私网类型。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet
        # 修改为您的私网SLB实例ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: <YOUR_INTRANET_SLB_ID>
        # 是否自动创建SLB端口监听(会覆写已有端口监听),也可手动创建端口监听。
        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

    通过以上注解修改(apply)容器集群kube-system/nginx-ingress-lb服务即可配置使用指定的私网SLB实例。

同时使用私网SLB和公网SLB

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

说明

默认集群初始化时已经创建了一个kube-system/nginx-ingress-lb服务,其生成的是公网SLB实例。

  1. 手动申请私网SLB实例,请参见创建和管理CLB实例

    说明

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

  2. 新建Intranet Nginx Ingress Controller服务。

    当您成功申请一个私网SLB实例后,您可以通过以下YAML新建一个kube-system/nginx-ingress-lb-intranet服务。

    # 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:
        # 指明SLB实例地址类型为私网类型。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet
        # 修改为您的私网SLB实例ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: <YOUR_INTRANET_SLB_ID>
        # 是否自动创建SLB端口监听(会覆写已有端口监听),也可手动创建端口监听。
        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

成功创建kube-system/nginx-ingress-lb-intranet服务后,您可以通过kubectl -n kube-system get svc | grep nginx-ingress-lb命令看到以下两个Nginx Ingress Controller服务:一个配置的是公网SLB实例,一个是VPC私网SLB实例。

 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

此时当您通过Ingress对外暴露服务时,既可以通过公网SLB来访问该服务,同一个VPC下的其他服务也可以直接通过私网SLB来访问该服务。