通过阿里云负载均衡 SLB(Server Load Balancer)暴露的服务(Service),在集群外可通过SLB域名或<IP:服务端口>
的方式访问服务,在集群内可通过<服务名:服务端口>
的方式访问服务。本文以Nginx应用为例,介绍如何在ACS集群中通过使用已有负载均衡的服务来公开应用。
前提条件
已存在通过SLB控制台创建的SLB实例,且该实例与ACS集群处于同一地域。本示例中使用公网CLB实例,如果没有创建,请参见创建和管理CLB实例。
注意事项
复用SLB使用限制
被复用的SLB需要满足以下限制条件:
支持复用通过SLB控制台手动创建的SLB,不支持复用Cloud Controller Manager(CCM)自动创建的SLB及集群APIServer SLB。
如果您需要在ACS集群中复用私网类型的SLB,则该SLB需要和ACS集群处于同一VPC下。
复用SLB的地址类型必须与服务的访问类型一致:
当服务为公网访问(即
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "internet"
)时,所用SLB的地址类型必须为公网;当服务为内部访问(即
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
)时,所用SLB的地址类型必须为私网。
多个服务不能同时使用一个SLB的同一个监听端口。
跨集群复用已有SLB时,需要确保两个集群的命名空间+Service组合名称不一致。
CCM只为
Type=LoadBalancer
类型的服务配置SLB。对于非LoadBalancer类型的服务,不会为其配置负载均衡。重要当
Type=LoadBalancer
的服务变更为其他类型时,CCM会删除为该SLB添加的配置,从而造成无法通过该SLB访问服务。CCM使用声明式API,会在一定条件下自动根据服务的配置刷新SLB配置。当
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
时,您自行在SLB控制台上修改的配置均存在被覆盖的风险。重要请勿在SLB控制台上手动修改ACS创建并维护的SLB的任何配置,否则有配置丢失的风险,造成服务不可访问。
已创建的LoadBalancer类型Service不支持重新指定SLB。如果您需要更换SLB,请重新创建Service。
SLB配额限制
步骤一:部署示例应用
以下应用部署通过kubectl命令行方式进行。
使用以下示例应用的YAML内容,创建名为my-nginx.yaml的文件。
执行以下命令,部署示例应用my-nginx。
kubectl apply -f my-nginx.yaml
执行以下命令,确认示例应用状态正常。
kubectl get deployment my-nginx
返回结果示例:
NAME READY UP-TO-DATE AVAILABLE AGE my-nginx 3/3 3 3 50s
步骤二:通过使用已有SLB的服务公开应用
您可以通过控制台和kubectl两种方式来创建LoadBalancer类型的服务,并通过其公开应用。
通过控制台创建服务
登录容器计算服务控制台,在左侧导航栏选择集群。
在集群页面,单击目标集群ID,然后在左侧导航栏,选择网络 > 服务。
在服务页面,单击左上角的创建。
在创建服务对话框中,设置服务的相关参数。
配置项
描述
示例
名称
输入服务的名称。
my-nginx-svc
服务类型
选择服务类型,即服务访问的方式。
创建服务:
服务类型:负载均衡 (LoadBalancer)
负载均衡类型:传统型负载均衡 CLB
选择资源:使用已有资源
强制覆盖已有监听:勾选
服务关联
选择关联该服务要绑定的后端应用。若不进行关联部署,则不会创建相关的Endpoints对象,您也可自己进行绑定,请参见services-without-selectors。
通过+引用工作负载标签选择my-nginx:
名称:app
值:nginx
端口映射
添加服务端口(对应Service YAML文件中的
port
)和容器端口(对应Service YAML文件中的targetPort
),容器端口需要与后端的Pod中暴露的容器端口一致。服务端口:80
容器端口:80
协议:TCP
注解
为该服务添加一个注解(Annotation),配置负载均衡的参数。更多注解,请参见通过Annotation配置传统型负载均衡CLB。
本示例中,将该服务的收费方式设置为按带宽收费,带宽峰值设置为2 Mbit/s,从而控制服务的流量。
设置付费模式:
名称:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type
值:paybybandwidth
设置带宽:
名称:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth
值:2
标签
为该服务添加一个标签,标识该服务。
无
单击创建,在服务页面,可以看到新创建的服务。
通过该服务在外部 IP 地址(External IP)列的实际IP地址,如39.106.XX.XX:80,访问示例应用。
通过kubectl创建服务
使用以下示例服务的YAML内容,创建名为my-nginx-svc.yaml的文件。
修改
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id
的值,请替换${YOUR_LB_ID}为您通过负载均衡管理控制台创建的SLB实例ID。使用已有的SLB实例时,默认情况下不会为该SLB创建监听或覆盖已有监听。如有需要,请设置
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners
为true
。本示例中,SLB实例为新创建,需要为其创建监听,因此设为true
。更多注解,请参见通过Annotation配置传统型负载均衡CLB。将
selector
修改为my-nginx.yaml
示例应用文件中matchLabels
的值(即:app: nginx
),从而将该服务关联至后端应用。
apiVersion: v1 kind: 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
执行以下命令创建名为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/TCP 5m
执行curl <YOUR-External-IP>命令访问示例应用,请将<YOUR-External-IP>替换为上面获取到的
EXTERNAL-IP
实际地址。curl 39.106.XX.XX
返回结果示例:
<!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>