通过阿里云负载均衡暴露的服务(Service),在集群外可通过负载均衡域名或<IP:服务端口>
的方式访问服务,在集群内可通过<服务名:服务端口>
的方式访问服务。本文以Nginx应用为例,介绍如何通过使用已有负载均衡的服务来公开应用。
前提条件
已创建ACK集群或ACK Serverless集群。具体操作,请参见创建ACK托管集群、创建ACK专有集群、创建ACK Serverless集群。
已通过负载均衡控制台创建CLB或NLB实例,且该实例与ACK集群处于同一地域。如果尚未创建,请参见创建和管理CLB实例和创建和管理NLB实例。
使用说明
对于指定已有负载均衡,ACK集群的cloud-controller-manager组件版本不同,对应的监听策略也有所不同:
cloud-controller-manager组件为v1.9.3.59-ge3bc999-aliyun及以上版本:在指定已有负载均衡时,cloud-controller-manager默认不再为该实例处理监听。您可以通过添加Annotation(注解)
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
来启用监听配置,或者手动配置该负载均衡的监听规则。cloud-controller-manager组件为v1.9.3.59-ge3bc999-aliyun以下版本:在指定已有负载均衡实例时,cloud-controller-manager会自动生成并管理该实例的后端服务器组,并确保监听器指向这些由K8s管理的后端资源,即使这些监听器可能之前是由您手动配置的。
注意事项
在使用已有负载均衡公开应用之前,建议您先了解相关注意事项。详细信息,请参见:
步骤一:部署示例应用
本文以Nginx无状态应用为例,指导您如何在ACK中通过负载均衡类型的Service暴露应用。
控制台操作指导
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面,单击使用镜像创建,配置应用的基本信息、容器配置、高级配置等。
在应用基本信息页签中,配置应用名称,本示例为my-nginx,其他参数保持默认值,然后单击下一步。
在容器配置页签中,设置容器镜像名称、端口,其他参数保持默认值,然后单击下一步。
配置项
取值
镜像名称
单击选择镜像,在选择镜像及版本对话框单击制品中心页签,然后搜索
nginx
,选择名称为openanolis/nginx的镜像仓库,单击选择镜像版本,设置镜像的版本,完成后单击确定。端口
名称:nginx。
容器端口:80。
在高级配置页签中,保持默认,单击创建,完成Nginx应用的创建。
kubectl操作指导
使用以下示例应用的YAML内容,创建名为my-nginx.yaml文件。
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: my-nginx # 示例应用的名称。 labels: app: nginx spec: replicas: 2 # 设置副本数量。 selector: matchLabels: app: nginx # 对应服务中Selector的值需要与其一致,才可以通过服务公开此应用。 template: metadata: labels: app: nginx spec: # nodeSelector: # env: test-team containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # 需要在服务中暴露该端口。
执行以下命令,部署示例应用my-nginx。
kubectl apply -f my-nginx.yaml
执行以下命令,确认示例应用状态正常。
kubectl get deployment my-nginx
预期输出:
NAME READY UP-TO-DATE AVAILABLE AGE my-nginx 2/2 2 2 50s
步骤二:通过使用已有负载均衡的服务公开应用
您可以通过控制台和kubectl两种方式来创建LoadBalancer类型的服务,并通过其公开应用。
控制台操作指导
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。在服务页面,单击创建,在创建服务对话框中设置服务相关的参数。
配置项
描述
示例
服务名称
输入Service(服务)的名称。
my-nginx-svc
服务类型
选择Service类型,Service网络支持以下模式,分别对接不同来源和类型的客户端的访问,包括:
选择负载均衡的服务类型。
单击使用已有CLB,然后在下拉列表选择已创建的CLB实例。
本示例中的CLB实例为新创建,需要为其创建监听,因此选中强制覆盖已有监听。
外部流量策略
您的服务类型为节点端口或负载均衡时,才能设置外部流量策略。关于外部流量策略的详细介绍,请参见Service快速入门。
Local:流量只发给本节点的Pod。
Cluster:流量可以转发到集群中其他节点上的Pod。
Local
服务关联
选择服务要绑定的后端应用。若不进行关联部署,则不会创建相关的Endpoints对象。关于服务关联的详细介绍,请参见services-without-selectors。
名称:app
值:my-nginx
端口映射
添加服务端口(对应Service YAML文件中的
port
)和容器端口(对应Service YAML文件中的targetPort
),容器端口需要与后端的Pod中暴露的容器端口一致。80
注解
为该服务添加一个注解(Annotation),配置负载均衡的参数。更多参数,请参见通过Annotation配置传统型负载均衡CLB和通过Annotation配置网络型负载均衡NLB。
重要请勿复用集群的API Server的负载均衡实例,否则将导致集群访问异常
本示例中,将该服务的收费方式设置为按带宽收费,带宽峰值设置为2 Mbit/s,从而控制服务的流量。如下所示:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type:paybybandwidth
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth:2
标签
为该服务添加一个标签,标识该服务。
无
单击确定。
在服务页面,单击目标服务名称,进入服务详情页面,在基本信息区域,单击该服务的外部端点,例如39.106.XX.XX:80,访问示例应用。
Kubectl操作指导
创建Service。
使用以下示例服务的YAML内容,创建名为my-nginx-svc.yaml的文件。
修改
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id
,请将${YOUR_LB_ID}替换为您通过负载均衡管理控制台创建的负载均衡实例ID。在使用已有的负载均衡实例时,默认情况下不会为该负载均衡创建监听或覆盖已有监听。如有需要覆盖监听,可以设置
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners
为"true"
。本示例中,负载均衡实例为新创建,需要为其创建监听,因此设为true
。更多注解请参见通过Annotation配置传统型负载均衡CLB和通过Annotation配置网络型负载均衡NLB。将selector修改为my-nginx.yaml示例应用文件中matchLabels的值(即:
app: nginx
),从而将该服务关联至后端应用。
apiVersion: v1 kind: Service # 定义资源对象为Service。 metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${YOUR_LB_ID} service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true' labels: app: nginx name: my-nginx-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer
字段
说明
kind
定义资源对象为Service。
metadata
定义Service的名称、Label和命名空间等基本信息。
metadata.annotations
支持丰富的负载均衡相关的注解(Annotations)。例如,在上面的YAML示例中,
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type
指定Service的访问方式为intranet
(私网访问)。更多注解,请参见通过Annotation配置传统型负载均衡CLB。spec.selector
定义Service的选择器。Service会根据Selector和Pod Label的匹配关系,确定Service所要关联暴露的后端Pod。
spec.ports.port
定义Service暴露给ClusterIP的端口,集群内部客户端访问Service的入口,即
clusterIP:port
。spec.ports.targetPort
定义后端Pod的端口。从
port
进来的流量,经由kube-proxy流入到后端Pod的targetPort
上,最后进入容器。spec.type
定义Service的被访问方式。
LoadBalancer
:使用阿里云负载均衡公开服务。当Service没有指定已有负载均衡时,默认创建的负载均衡实例类型为公网。您可以通过设置注解为intranet
,来创建私网访问的Service以及相应的私网负载均衡。更多信息,请参见通过Annotation配置传统型负载均衡CLB和通过Annotation配置网络型负载均衡NLB。ClusterIP
:在集群内部公开服务,可用于集群内部访问。NodePort
:使用节点的端口映射到后端Service,集群外可以通过节点IP:NodePort
访问。ExternalName
:将服务映射到DNS。
执行以下命令,创建名为my-nginx-svc的服务,并通过其公开应用。
kubectl apply -f my-nginx-svc.yaml
执行以下命令,确认LoadBalancer类型的服务已成功创建。
kubectl get svc my-nginx-svc
预期输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-nginx-svc LoadBalancer 172.21.5.82 39.106.XX.XX 80:30471/TCP 5m
执行以下命令,访问示例应用。
curl <YOUR-External-IP> # 请将<YOUR-External-IP>替换为上面获取到的EXTERNAL-IP地址。
预期输出:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
传统型负载均衡CLB
新建CLB资源
新建CLB(Classic Load Balancer)时,您可以根据新建CLB资源描述进行创建。更多信息,请参见创建和管理CLB实例。
名称 | 描述 |
名称 | 自定义CLB的名称。 |
访问方式 | 根据需要可选择公网访问和私网访问。 |
计费方式 | 根据需要可选按规格计费(PayBySoec)和按量计费(PayByCLCU)更多信息,请参见CLB计费概述。 |
IP版本 | 根据需要可选择IPv4和IPv6。 |
调度算法 | 支持轮询(RR)或加权轮询(WRR)两种策略。RR(默认取值):按照访问顺序依次将外部请求依序分发到后端服务器;WRR:权重值越高的后端服务器,被轮询到的次数(概率)也越高。 |
访问控制 | 提供监听级别的访问控制。详细信息,请参见访问控制。 |
健康检查 | 支持TCP和HTTP协议。开启健康检查后,您可以通过健康检查来判断后端服务器的业务可用性。健康检查原理,请参见CLB健康检查工作原理。 |
其他 | 您还可以通过Annotation配置传统型负载均衡。详细信息,请参见通过Annotation配置传统型负载均衡CLB。 |
使用已有资源
您可以从下拉菜单中选择已有的CLB(Classic Load Balancer)实例进行复用。可以选择是否勾选强制覆盖已有监听,更多信息请参见,使用已有的负载均衡,并强制覆盖已有监听。
复用CLB实例存在一些限制,以及相关的注意事项,详细信息请参见Service的负载均衡配置注意事项。
配置相关资源
名称 | 描述 |
调度算法 | 支持轮询(RR)或加权轮询(WRR)两种策略。RR(默认取值):按照访问顺序依次将外部请求依序分发到后端服务器;WRR:权重值越高的后端服务器,被轮询到的次数(概率)也越高。 |
访问控制 | 提供监听级别的访问控制。详细信息,请参见访问控制。 |
健康检查 | 支持TCP和HTTP协议。开启健康检查后,您可以通过健康检查来判断后端服务器的业务可用性。健康检查原理,请参见负载均衡健康检查工作原理。 |
其他 | 您还可以通过Annotation配置传统型负载均衡。详细信息,请参见通过Annotation配置传统型负载均衡CLB。 |
网络型负载均衡NLB
新建NLB资源
新建网络型负载均衡NLB(Network Load Balancer ),您可以根据新建NLB资源描述进行创建。更多信息,请参见创建和管理NLB实例。
名称 | 描述 |
名称 | 自定义NLB的名称。仅新建NLB需要配置。 |
访问方式 | 根据需要可选择公网访问和私网访问。 |
计费方式 | 按量计费。更多信息,请参见NLB产品计费。 |
IP版本 | 根据需要可选择IPv4和双栈。 |
调度算法 | 选择一种调度算法。
|
健康检查 | 开启或关闭健康检查。
|
其他 | 您还可以通过Annotation配置网络型负载均衡。详细信息请参见通过Annotation配置网络型负载均衡NLB。 |
专有网络 | 集群默认专有网络地域和VPC ID。 |
虚拟交换机 | 您可以选择集群默认专有网络下,已支持的可用区对应的虚拟交换机,还可以单击创建虚拟交换机选择新建。 |
使用已有资源
您可以从下拉菜单中选择已有的NLB(Network Load Balancer)实例进行复用。还可以根据需要是否勾选强制覆盖已有监听,详细信息请参见使用已有的负载均衡。
复用NLB实例存在一些限制,以及相关的注意事项,详细信息请参见Service的负载均衡配置注意事项
配置相关资源
名称 | 描述 |
调度算法 | 选择一种调度算法。
|
健康检查 | 开启或关闭健康检查。
|
其他 | 您还可以通过Annotation配置网络型负载均衡。详细信息请参见通过Annotation配置网络型负载均衡NLB。 |
专有网络 | 集群默认专有网络地域和VPC ID。 |
虚拟交换机 | 您可以选择集群默认专有网络下,已支持的可用区对应的虚拟交换机,还可以单击创建虚拟交换机选择新建。 |
后续操作
如果您有查看、更新、删除Service的需求,例如需要修改Service所关联的公网负载均衡,可通过如下操作实现。
控制台操作指导
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在服务页面,单击目标服务操作列的更新或删除,对Service进行查看、更新、删除操作。
kubectl操作指导
更新Service
方式1:执行以下命令,更新Service。
kubectl edit service my-nginx-svc
方式2:手动删除旧的Service,修改YAML文件后,重新创建Service。
kubectl apply -f my-nginx-svc.yaml
查看Service
执行以下命令,查看Service。
kubectl get service my-nginx-svc
预期输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx-svc LoadBalancer 172.21.XX.XX 192.168.XX.XX 80:31599/TCP 5m
删除Service
执行以下命令,删除Service。
kubectl delete service my-nginx-svc