背景
我们通过阿里云容器服务申请一个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
具体参考如下:
# 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>
# 是否自动创建SLB端口监听(会覆写已有端口监听),也可手动创建端口监听
#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
通过如上修改(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>
# 是否自动创建SLB端口监听(会覆写已有端口监听),也可手动创建端口监听
#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
成功创建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来访问该服务。