背景
我们通过阿里云容器服务申请一个 K8S 集群, 集群初始化时会自动部署一套 Nginx Ingress Controller, 默认其挂载在公网 SLB 实例上:
配置私网 SLB
但对于部分用户来说, 希望容器集群内的服务仅仅只对同一个 VPC 内其他服务调用访问, 那么我们可以通过调整 Nginx Ingress Controller 服务的配置来完成.
1, 手动申请私网 SLB 实例
我们需要事先手动在对应的 VPC 网络下申请一个期望规格的 SLB 实例.
2, 配置 Nginx Ingress Controller 服务
当我们成功申请一个私网 SLB 实例后, 那么我们可以通过如下注解来配置 Nginx Ingress Controller 使用该 SLB 实例:
service.beta.kubernetes.io/alicloud-loadbalancer-id
注意: 通过 alicloud-loadbalancer-id 注解指定使用已有的 SLB 实例时, 之前手动配置的 Listener 会被覆写; 删除 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:
- # 指明 SLB 实例地址类型为私网类型
- service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
- # 修改为您的私网 SLB 实例 ID
- service.beta.kubernetes.io/alicloud-loadbalancer-id: <YOUR_INTRANET_SLB_ID>
- spec:
- type: LoadBalancer
- # do not route traffic to other nodes
- #externalTrafficPolicy: "Local"
- 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 服务即可.
注意: 默认集群初始化时已经创建了一个 kube-system/nginx-ingress-lb 服务, 其生成的是公网 SLB 实例
1, 手动申请私网 SLB 实例
我们需要事先手动在对应的 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/alicloud-loadbalancer-address-type: intranet
- # 修改为您的私网 SLB 实例 ID
- service.beta.kubernetes.io/alicloud-loadbalancer-id: <YOUR_INTRANET_SLB_ID>
- spec:
- type: LoadBalancer
- # do not route traffic to other nodes
- #externalTrafficPolicy: "Local"
- 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 服务后, 我们可以看到如下两个 Nginx Ingress Controller 服务, 一个配置的是公网 SLB 实例, 一个是 VPC 私网 SLB 实例:
- kubectl -n kube-system get svc | grep nginx-ingress-lb
- nginx-ingress-lb LoadBalancer 172.19.9.26 47.96.223.50 80:31456/TCP,443:30016/TCP 5h
- nginx-ingress-lb-intranet LoadBalancer 172.19.4.140 192.168.2.88 80:32394/TCP,443:31000/TCP 7m
此时当我们通过 Ingress 对外暴露服务时, 即可以通过公网 SLB 来访问该服务, 同一个 VPC 下的其他服务又可以直接通过私网 SLB 来访问该服务.
来源: https://yq.aliyun.com/articles/603655