如何配置容器服务Kubernetes版Nginx Ingress Controller的私网SLB

更新时间:

概述

本文主要介绍如何配置容器服务Kubernetes版Nginx Ingress Controller的私网SLB。

 

详细信息

背景

当您通过阿里云容器服务申请一个Kubernetes版集群,集群初始化时会自动部署一套Nginx Ingress Controller,默认其挂载在公网SLB实例上。

 

配置私网SLB

如果您希望集群内的服务不对外公开,即只对同一个VPC内其他服务调用访问,那么您可以通过调整Nginx Ingress Controller服务的配置来完成。

  1. 在对应的VPC网络下,申请一个期望规格的SLB实例。
  2. 使用如下YAML格式文件,配置Nginx Ingress Controller服务。通过应用容器集群kube-system/nginx-ingress-lb服务即可配置使用指定的私网SLB实例。
    # nginx ingress slb service
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
      annotations:
        service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
        service.beta.kubernetes.io/alicloud-loadbalancer-id: [$SLB_ID]
        #service.beta.kubernetes.io/alicloud-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
    注:
    • alicloud-loadbalancer-address-type: intranet选项指明SLB实例地址类型为私网类型。
    • [$SLB_ID]为私网SLB实例ID。
    • alicloud-loadbalancer-force-override-listeners: 'true'选项自动创建SLB端口监听。

 

同时使用私网SLB和公网SLB

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

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

  1. 在对应的VPC网络下,申请一个期望规格的SLB实例。
  2. 使用如下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:
        service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
        # 修改为您的私网SLB实例ID
        service.beta.kubernetes.io/alicloud-loadbalancer-id: [$SLB_ID]
        #service.beta.kubernetes.io/alicloud-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
    注:本文的name参数为nginx-ingress-lb-intranet,可根据现场实际情况进行取名。
  3. 成功创建kube-system/nginx-ingress-lb-intranet服务后,可以看到如下两个Nginx Ingress Controller服务,一个配置的是公网SLB实例,一个是VPC私网SLB实例。
    kubectl -n kube-system get svc | grep nginx-ingress-lb
    nginx-ingress-lb            LoadBalancer   XX.XX.XX.XX   a.b.c.d<公网>   80:31456/TCP,443:30016/TCP   5h
    nginx-ingress-lb-intranet   LoadBalancer   XX.XX.XX.XX   e.f.g.h<内网>   80:32394/TCP,443:31000/TCP   7m
  4. 此时当通过Ingress对外暴露服务时,即可以通过公网SLB来访问该服务,同一个VPC下的其他服务又可以直接通过私网SLB来访问该服务。

 

适用于

  • 容器服务 Kubernetes 版