容器服务ACK使用ALB Ingress最佳实践
ALB Ingress是基于阿里云应用型负载均衡ALB(Application Load Balancer) 实现的Ingress服务,适用于有明显波峰波谷的业务场景。本文以容器集群ACK使用ALB Ingress访问服务为例介绍。
注意事项
容器集群ACK的Kubernetes版本需选择1.18及以上版本。
如果您使用的是Flannel网络插件,则ALB Ingress后端Service服务仅支持NodePort和LoadBalancer类型。
前提条件
您已创建一个ACK托管版或专有版集群。具体操作,请参见创建Kubernetes托管版集群和创建Kubernetes专有版集群。
已通过kubectl工具连接ACK集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
操作步骤

步骤一:安装ALB Ingress Controller
方式一:创建集群时安装ALB Ingress Controller
创建ACK托管集群或ACK专有集群时,在Ingress参数配置区域,选择安装ALB Ingress。具体操作,请参见创建ACK Pro版集群。
方式二:在组件管理页面安装ALB Ingress Controller
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,单击网络页签,在ALB Ingress Controller组件区域,单击安装。
说明该组件暂时不支持以下地域:华北5(呼和浩特)和华南2(河源)。
在安装组件ALB Ingress Controller对话框,单击确定。
步骤二:(可选)授予ALB Ingress Controller访问权限
仅ACK专有版集群需要授予ALB Ingress Controller访问权限,其他集群无需为ALB Ingress Controller设置访问权限,即可使用ALB Ingress。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后单击集群资源页签。
在集群资源页签,单击Worker RAM角色右侧的KubernetesWorkerRole-****。
在RAM控制台确认并修改信任策略和RAM权限策略。
在K8sWorkerRole-****页面,单击信任策略管理页签。
查看当前信任策略是否与以下内容一致,若不一致,请单击修改信任策略,在修改信任策略面板修改为以下内容后单击确定。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
在K8sWorkerRole-****页面,单击权限管理页签,然后单击K8sWorkerRolePolicy-****权限策略名称。
在权限策略管理页面,查看是否包含以下ALB Ingress权限。若不完全包含,请单击修改策略内容。在修改策略内容面板添加以下内容后,单击确定。
{ "Action": [ "alb:TagResources", "alb:UnTagResources", "alb:ListServerGroups", "alb:ListServerGroupServers", "alb:AddServersToServerGroup", "alb:RemoveServersFromServerGroup", "alb:ReplaceServersInServerGroup", "alb:CreateLoadBalancer", "alb:DeleteLoadBalancer", "alb:UpdateLoadBalancerAttribute", "alb:UpdateLoadBalancerEdition", "alb:EnableLoadBalancerAccessLog", "alb:DisableLoadBalancerAccessLog", "alb:EnableDeletionProtection", "alb:DisableDeletionProtection", "alb:ListLoadBalancers", "alb:GetLoadBalancerAttribute", "alb:ListListeners", "alb:CreateListener", "alb:GetListenerAttribute", "alb:UpdateListenerAttribute", "alb:ListListenerCertificates", "alb:AssociateAdditionalCertificatesWithListener", "alb:DissociateAdditionalCertificatesFromListener", "alb:DeleteListener", "alb:CreateRule", "alb:DeleteRule", "alb:UpdateRuleAttribute", "alb:CreateRules", "alb:UpdateRulesAttribute", "alb:DeleteRules", "alb:ListRules", "alb:CreateServerGroup", "alb:DeleteServerGroup", "alb:UpdateServerGroupAttribute", "alb:DescribeZones", "alb:CreateAcl", "alb:DeleteAcl", "alb:ListAcls", "alb:AddEntriesToAcl", "alb:AssociateAclsWithListener", "alb:ListAclEntries", "alb:RemoveEntriesFromAcl", "alb:DissociateAclsFromListener", "alb:EnableLoadBalancerIpv6Internet", "alb:DisableLoadBalancerIpv6Internet" ], "Resource": "*", "Effect": "Allow" }, { "Action": "ram:CreateServiceLinkedRole", "Resource": "*", "Effect": "Allow", "Condition": { "StringEquals": { "ram:ServiceName": [ "alb.aliyuncs.com", "audit.log.aliyuncs.com", "logdelivery.alb.aliyuncs.com" ] } } }, { "Action": [ "yundun-cert:DescribeSSLCertificateList", "yundun-cert:DescribeSSLCertificatePublicKeyDetail", "yundun-cert:CreateSSLCertificateWithName", "yundun-cert:DeleteSSLCertificate" ], "Resource": "*", "Effect": "Allow" }
说明多个策略内容需要用英文半角逗号(,)分隔。
确认ECS实例的RAM角色状态是否正常。
在集群管理页左侧导航栏,选择 。
在节点页面,单击目标节点的实例ID,例如i-2ze5d2qi9iy90pzb****。
在目标实例页面,单击实例详情页签,然后在其它信息区域的RAM角色右侧查看是否存在该ECS实例的RAM角色。
若没有对应的RAM角色,请为ECS实例指定RAM角色。具体操作,请参见步骤二:指定RAM角色创建并设置ECS实例。
手动删除alb-ingress-controller的Pod并确认重建后Pod的状态。
通过kubectl连接集群,执行以下命令,查询alb-ingress-controller的Pod名称。
kubectl -n kube-system get pod | grep alb-ingress-controller
预期输出:
NAME READY STATUS RESTARTS AGE alb-ingress-controller-*** 1/1 Running 0 60s
执行以下命令删除alb-ingress-controller的Pod。
替换
alb-ingress-controller-***
为上个步骤中获取到的实际值。kubectl -n kube-system delete pod alb-ingress-controller-***
预期输出:
pod "alb-ingress-controller-***" deleted
等待几分钟后,执行以下命令查看重建后Pod的状态。
kubectl -n kube-system get pod
预期输出:
NAME READY STATUS RESTARTS AGE alb-ingress-controller-***2 1/1 Running 0 60s
从预期输出可得,重建后Podalb-ingress-controller-***2的状态为Running。
步骤三:创建AlbConfig
创建并拷贝以下内容到alb-test.yaml文件中,用于创建AlbConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-wz9e2usil7e5an1xi**** - vSwitchId: vsw-wz92lvykqj1siwvif**** listeners: - port: 80 protocol: HTTP
参数
说明
spec.config.name
(可选)表示ALB实例的名称。
spec.config.addressType
(必选)表示ALB的地址类型。取值如下:
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 Ingress支持的地域与可用区,请参见支持的地域与可用区。
执行以下命令,创建AlbConfig。
kubectl apply -f alb-test.yaml
预期输出:
AlbConfig.alibabacloud.com/alb-demo created
创建并拷贝以下内容到alb.yaml文件中,用于创建IngressClass。
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-demo
1.19及之后版本集群
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
执行以下命令,创建IngressClass。
kubectl apply -f alb.yaml
预期输出:
ingressclass.networking.k8s.io/alb created
查看ALB实例创建结果。
方式一:执行以下命令查看ALB实例ID。
kubectl get albconfig alb-demo
方式二:登录应用型负载均衡ALB控制台,在控制台查看已创建的ALB实例。
步骤四:部署服务
创建并拷贝以下内容到cafe-service.yaml文件中,用于部署两个名称分别为
coffee
和tea
的Deployment,以及两个名称分别为coffee-svc
和tea-svc
的Service。apiVersion: apps/v1 kind: Deployment metadata: name: coffee spec: replicas: 2 selector: matchLabels: app: coffee template: metadata: labels: app: coffee spec: containers: - name: coffee image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: coffee-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: coffee type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: name: tea spec: replicas: 1 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: NodePort
执行以下命令,部署两个Deployment和两个Service。
kubectl apply -f cafe-service.yaml
预期输出:
deployment "coffee" created service "coffee-svc" created deployment "tea" created service "tea-svc" created
执行以下命令,查看服务状态。
kubectl get svc,deploy
预期输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE coffee-svc NodePort 172.16.231.169 <none> 80:31124/TCP 6s tea-svc NodePort 172.16.38.182 <none> 80:32174/TCP 5s NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/coffee 2 2 2 2 1m deploy/tea 1 1 1 1 1m
步骤五:配置Ingress
创建并拷贝以下内容到cafe-ingress.yaml文件中。
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: cafe-ingress spec: ingressClassName: alb rules: - host: demo.aliyundoc.com http: paths: # 配置Context Path。 - path: /tea backend: serviceName: tea-svc servicePort: 80 # 配置Context Path。 - path: /coffee backend: serviceName: coffee-svc servicePort: 80
1.19及之后版本集群
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress spec: ingressClassName: alb rules: - host: demo.aliyundoc.com http: paths: # 配置Context Path - path: /tea pathType: ImplementationSpecific backend: service: name: tea-svc port: number: 80 # 配置Context Path - path: /coffee pathType: ImplementationSpecific backend: service: name: coffee-svc port: number: 80
执行以下命令,配置
coffee
和tea
服务对外暴露的域名和path
路径。kubectl apply -f cafe-ingress.yaml
预期输出:
ingress "cafe-ingress" created
执行以下命令获取ALB实例的DNS名称。
kubectl get ing
预期输出:
NAME CLASS HOSTS ADDRESS PORTS AGE cafe-ingress alb demo.aliyundoc.com alb-3lzokczr3c******z7.cn-hangzhou.alb.aliyuncs.com 80 50s
步骤六:访问服务
测试方法1:通过ALB DNS名称直接访问
执行以下命令,通过ALB实例的DNS名称访问
coffee
服务:curl -H Host:demo.aliyundoc.com http://alb-3lzokczr3c******z7.cn-hangzhou.alb.aliyuncs.com/coffee
执行以下命令,通过ALB实例的DNS名称访问
tea
服务:curl -H Host:demo.aliyundoc.com http://alb-3lzokczr3c******z7.cn-hangzhou.alb.aliyuncs.com/tea
测试方法2:通过域名解析访问
将您的常用域名通过CNAME方式解析到步骤三:创建AlbConfig创建的ALB实例的DNS名称上。
具体操作,请参见(可选)步骤四:设置域名解析。本文假设您将自定义域名
http://demo.aliyundoc.com
解析到ALB实例的公网服务域名。执行以下命令,使用ALB实例访问
coffee
服务。curl http://demo.aliyundoc.com/coffee
执行以下命令,使用ALB实例访问
tea
服务。curl http://demo.aliyundoc.com/tea
相关文档
容器集群ACK使用ALB Ingress服务高级用法,请参见:
容器集群ASK使用ALB Ingress的操作及高级用法,请参见:
自建Kubernetes集群使用ALB Ingress最佳实践, 请参见自建Kubernetes集群使用ALB Ingress最佳实践。