本文指导您如何在阿里云云上自建的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": "VndV***", # 需要base64编码 "AccessKeySecret": "UWU0NnUyTFdhcG***" # 需要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,表示部署成功。
步骤二:创建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
方式二:登录应用型负载均衡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
如果收到以下回复,代表测试服务部署成功。
步骤四:创建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资源创建成功。
步骤五:结果验证
通过域名解析访问
将您的常用域名通过CNAME方式解析到步骤二创建ALB实例的DNS名称上。
具体操作,请参见(可选)步骤四:设置域名解析。本示例中假设您将自定义域名
http://demo.domain.ingress.top
解析到ALB实例的公网服务域名。执行以下命令,使用ALB实例访问test01服务。
curl http://demo.domain.ingress.top/test01
执行以下命令,使用ALB实例访问test02服务。
curl http://demo.domain.ingress.top/test02
如果您在使用过程中有任何疑问,请加入钉群ALB客户交流群(钉群号:31945843)咨询。
相关文档
ALB Ingress概述及功能介绍: