本文指导您如何在阿里云云上自建的Kubernetes集群中通过ALB Ingress,来使用阿里云应用型负载均衡ALB(Application Load Balancer)产品。
场景示例
本文以下图场景为例。您已依托阿里云云上资源自建Kubernetes集群,并希望该集群可以通过ALB Ingress转发请求。
您可以通过在自建Kubernetes集群中部署alb-ingress-controller,并创建Ingress和Service资源;alb-ingress-controller会根据Kubernetes集群内的服务配置,将Ingress以转发规则的形式同步到ALB上,同时会通过监听集群的APIServer来观察Ingress的后续变更,并将相应的变化同步到ALB上。ALB感知到变化会动态地将相应流量转发到集群内对应的Pod上。更多信息,请参见ALB Ingress管理。

注意事项
-
如果您使用的是Overlay类型的网络插件,如Flannel,则ALB Ingress后端Service服务仅支持NodePort和LoadBalancer类型。
-
AlbConfig、Namespace、Ingress和Service这些资源的名称不能以aliyun开头。
前提条件
-
您已拥有阿里云云上自建Kubernetes v1.20版本以上集群,并可通过kubectl工具连接该集群。关于如何下载和安装kubectl工具,请参见安装和设置kubectl。
-
您已为云上自建集群开启SNAT公网访问能力。具体操作,请参见使用公网NAT网关SNAT功能访问互联网。
-
云上自建的集群使用controller镜像时,请注意:
-
如果使用私有镜像,可以根据开源文档如何从源码进行controller的部署自行编译上传。
-
通用x86架构的集群可以使用阿里云开放镜像进行测试使用。
-
配置步骤

以下步骤涉及文件修改,请您了解对应的文件名称和用途。
|
步骤 |
文件名称 |
文件用途 |
|
load-balancer-controller.yaml 基于模板修改 |
用于部署alb-ingress-controller |
|
|
alb.yaml 自建并修改 |
用于创建albconfig及ingressClass资源,并同步完成ALB实例的创建 |
|
|
test-service.yaml 自建并修改 |
用于部署测试服务 |
|
|
test-ingress.yaml 自建并修改 |
用于创建Ingress |
步骤一:部署alb-ingress-controller
受运营商网络的影响,拉取Deployment镜像可能出现拉取失败的情况。为此,您可以使用私有镜像,根据开源文档如何从源码进行controller的部署自行编译上传。
本文中alb-ingress-controller使用InCluster模式启动,通过配置监听Service、Endpoint、Node等资源的权限,使用load-balancer-controller.yaml文件部署alb-ingress-controller,相关的ServiceAccount、Deployment、ConfigMap已经预置,您只需要针对实际情况执行以下修改。
-
修改load-balancer-controller.yaml文件,将Deployment对应的镜像修改为可用的镜像地址。
load-balancer-controller.yaml文件用于部署alb-ingress-controller。
修改前:
image: ${path/to/your/image/registry}修改后:
image: alibabacloudslb/alibaba-load-balancer-controller:v1.2.0 #已完成x86编译的镜像 -
修改load-balancer-controller.yaml文件,在ConfigMap中配置AccessKey ID与AccessKey Secret。
apiVersion: v1 kind: ConfigMap metadata: name: load-balancer-config namespace: kube-system data: cloud-config.conf: |- { "Global": { "AccessKeyID": "<YOUR_ACCESS_KEY_ID>", # 需要base64编码 "AccessKeySecret": "<YOUR_ACCESS_KEY_SECRET>" # 需要base64编码 } } -
通过kubectl连接集群,执行以下命令,提交修改后的load-balancer-controller.yaml文件进行部署。
kubectl apply -f load-balancer-controller.yaml预期输出:
clusterrole.rbac.authorization.k8s.io/system:load-balancer-controller created serviceaccount/load-balancer-controller created clusterrolebinding.rbac.authorization.k8s.io/system:load-controller-manager created configmap/load-balancer-config created deployment.apps/load-balancer-controller created -
执行以下命令验证alb-ingress-controller部署结果。
kubectl -n kube-system get all | grep load-balancer如下所示,pod运行状态为Running,表示部署成功。
[root@iZ2ze9xxx uoZ test]# kubectl -n kube-system get all | grep load-balancer pod/load-balancer-controller-67985dd48d-qtgl8 1/1 Running 0 61d deployment.apps/load-balancer-controller 1/1 1 1 62d replicaset.apps/load-balancer-controller-67985dd48d 1 1 1 62d
步骤二:创建AlbConfig及IngressClass资源
创建albconfig及ingressClass资源成功后,即可同步完成ALB实例的创建。
-
创建alb.yaml文件并复制以下内容到该文件中。
alb.yaml用于创建AlbConfig及IngressClass资源。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test #alb-test为ALB实例名称 addressType: Internet #Intranet表示私网,Internet表示公网 。 zoneMappings: - vSwitchId: vsw-wz9e2usil7e5an1xi**** #ALB需要至少两个可用区的交换机ID - vSwitchId: vsw-wz92lvykqj1siwvif**** listeners: - port: 80 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-demo #指定的AlbConfig资源说明请关注以下两个参数的配置:
-
albconfig.spec.config.addressType:表示实例网络类型。取值:
-
Internet(默认值):表示公网。每个可用区提供一个公网IP和一个私网IP。公网ALB通过弹性公网IP(Elastic IP Address,简称EIP)提供公网能力,选择公网将会收取弹性公网IP的实例费、带宽或流量费用。
-
弹性公网IP对外提供服务,支持通过互联网访问ALB。
-
私网IP,支持云上VPC内的ECS访问ALB。
-
-
Intranet:表示私网。每个可用区提供一个私网IP,只能通过阿里云内部网络访问ALB,无法从互联网访问。
-
-
spec.config.zoneMappings:用于设置ALB Ingress交换机ID,您需要至少指定两个不同可用区交换机ID,指定的交换机必须在ALB当前所支持的可用区内。关于ALB支持的地域与可用区,请参见支持的地域与可用区。
-
-
通过kubectl连接集群,执行以下命令,提交alb.yaml文件进行部署。
kubectl apply -f alb.yaml预期输出:
AlbConfig.alibabacloud.com/alb-demo create ingressclass.networking.k8s.io/alb created -
查看ALB实例创建结果。
-
方式一:执行以下命令查看ALB实例ID。
kubectl get albconfig alb-demo[root@i-xxx nuoZ test]# kubectl get albconfig alb-demo NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb-demo alb-3lzokczr3c9guq7zz7 alb-3xxx.com 84s -
方式二:登录应用型负载均衡ALB控制台,在控制台查看已创建的ALB实例。
说明需使用步骤一:部署alb-ingress-controllerConfigMap文件中配置的阿里云账号登录控制台。
-
步骤三:部署测试应用
本文使用测试镜像来创建Deployment资源,并使用该Deployment资源部署测试应用。
-
创建test-service.yaml文件并复制以下内容到该文件中。
test-service.yaml用于部署两个名称分别为test01和test02的Deployment,以及两个名称分别为test01和test02的Service。
apiVersion: apps/v1 kind: Deployment metadata: name: test01 spec: replicas: 2 selector: matchLabels: app: test01 template: metadata: labels: app: test01 spec: containers: - name: test01 image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: test01-service spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: test01 type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: name: test02 spec: replicas: 1 selector: matchLabels: app: test02 template: metadata: labels: app: test02 spec: containers: - name: test02 image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: test02-service spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: test02 type: NodePort -
通过kubectl连接集群,执行以下命令,提交test-service.yaml文件进行部署。
kubectl apply -f test-service.yaml预期输出:
deployment "test01" created service "test01-service" created deployment "test02" created service "test02-service" created -
执行以下命令,验证测试服务是否部署成功。
kubectl get svc,deploy如果收到以下回复,代表测试服务部署成功。
[root@iZ2z***uoZ test]# kubectl get svc,deploy NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/cloud-nodeport NodePort 10.xxx.122 <none> 80:31310/TCP 63d service/kubernetes ClusterIP 10.xxx.1 <none> 443/TCP 63d service/test01-service NodePort 10.xxx.121 <none> 80:31254/TCP 9s service/test02-service NodePort 10.xxx.118 <none> 80:30337/TCP 9s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/openresty-deployment 2/2 2 2 63d deployment.apps/test01 2/2 2 2 9s deployment.apps/test02 1/1 1 1 9s
步骤四:创建Ingress
Ingress对应ALB实例中的转发规则。本文使用基于路径的转发功能进行配置,更多高级功能请参见ALB Ingress的详细使用手册。
-
创建test-ingress.yaml文件并复制以下内容到该文件中。
test-ingress.yaml文件用于创建Ingress。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top http: paths: - path: /test01 pathType: Prefix backend: service: name: test01-service port: number: 80 - path: /test02 pathType: Prefix backend: service: name: test02-service port: number: 80 -
通过kubectl连接集群,执行以下命令,提交test-ingress.yaml文件进行部署。
kubectl apply -f test-ingress.yaml预期输出:
ingress "test-ingress" created -
执行以下命令,验证test-ingress资源创建结果。
kubectl get ingress如果收到以下回复,代表test-ingress资源创建成功。
[root@iZ2zxxx test]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE test-ingress alb demo.domain.ingress.top alb-xxx.cn-beijing.alb.aliyuncs.com 80 19s
步骤五:结果验证
通过域名解析访问
-
将您的常用域名通过CNAME方式解析到已创建ALB实例的DNS名称上。具体操作,请参见为ALB配置CNAME解析。
本示例中假设您将自定义域名
demo.domain.ingress.top解析到ALB实例的公网服务域名。 -
执行以下命令,使用ALB实例访问test01服务。
curl http://demo.domain.ingress.top/test01访问该地址后返回 NGINX 后端 Pod 的响应信息,包括 Server address(
10.xxx.xxx.xxx:80)、Server name(test01-648bf46944-kvlhj)、Date(07/Nov/2022:08:16:35 +0000)及 URI(/test01),表明 Ingress 路由已将请求正确转发至 test01 服务对应的后端 Pod。 -
执行以下命令,使用ALB实例访问test02服务。
curl http://demo.domain.ingress.top/test02访问该地址后返回 NGINX 测试页面,显示 Server address 为
10.xxx.20:80,Server name 为test02-76d96f7b8d-6mtnn,URI 为/test02,表明 Ingress 已将请求正确路由至后端 Pod test02。
如果您在使用过程中有任何疑问,请加入钉群ALB客户交流群(钉群号:31945843)咨询。
相关文档
ALB Ingress概述及功能介绍: