本文介绍了在ACK集群中如何自定义配置Nginx Ingress Controller使用的负载均衡(Classic Load Balancer,简称CLB)的网络类型,例如公私网转换、同时支持公私网等。
前提条件
已创建ACK托管集群或ACK专有集群并安装了Nginx ingress Controller组件。更多详情,请参见创建集群。
已通过kubectl连接Kubernetes集群。具体操作,请参见通过Kubectl连接Kubernetes集群。
操作步骤
通过容器服务管理控制台创建集群并在其中安装Nginx Ingress Controller组件时,您可以选择公网或私网类型的负载均衡实例。创建集群后,如果您需要切换CLB实例的网络类型,或需要指定IP作为流量入口点,您可以参考以下配置。
私网配置成公网的CLB
您可以调整Nginx Ingress Controller私网类型为公网类型,使ACK集群内的服务能够在公网上公开访问。
创建公网CLB实例,请参见创建和管理CLB实例。
说明在对应的VPC网络下申请一个期望规格的CLB。
使用以下示例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。
配置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内的其他服务进行调用访问。
创建私网CLB实例,请参见创建和管理CLB实例。
说明在对应的VPC网络下申请一个期望规格的CLB实例。
使用以下示例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。
配置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。
创建私网CLB实例,请参见创建和管理CLB实例。
说明在对应的VPC网络下申请一个期望规格的SLB实例。
新建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
执行以下命令,创建
nginx-ingress-lb-intranet
的Service。kubectl apply -f nginx-ingress-lb-intranet.yaml
执行以下命令,查看
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