首页 负载均衡 应用型负载均衡ALB 实践教程 云原生应用 容器服务ACK使用ALB Ingress最佳实践

容器服务ACK使用ALB Ingress最佳实践

更新时间: 2023-10-23 17:51:02

ALB Ingress是基于阿里云应用型负载均衡ALB(Application Load Balancer) 实现的Ingress服务,适用于有明显波峰波谷的业务场景。本文以容器集群ACK使用ALB Ingress访问服务为例介绍。

注意事项

  • 容器集群ACK的Kubernetes版本需选择1.18及以上版本。

  • 如果您使用的是Flannel网络插件,则ALB Ingress后端Service服务仅支持NodePort和LoadBalancer类型。

前提条件

操作步骤

操作步骤

步骤一:安装ALB Ingress Controller

方式一:创建集群时安装ALB Ingress Controller

创建ACK托管集群ACK专有集群时,在Ingress参数配置区域,选择安装ALB Ingress。具体操作,请参见创建ACK Pro版集群

方式二:在组件管理页面安装ALB Ingress Controller

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,单击网络页签,在ALB Ingress Controller组件区域,单击安装

    说明

    该组件暂时不支持以下地域:华北5(呼和浩特)和华南2(河源)。

  4. 安装组件ALB Ingress Controller对话框,单击确定

步骤二:(可选)授予ALB Ingress Controller访问权限

重要

仅ACK专有版集群需要授予ALB Ingress Controller访问权限,其他集群无需为ALB Ingress Controller设置访问权限,即可使用ALB Ingress。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后单击集群资源页签。

  3. 集群资源页签,单击Worker RAM角色右侧的KubernetesWorkerRole-****

  4. RAM控制台确认并修改信任策略和RAM权限策略。

    1. K8sWorkerRole-****页面,单击信任策略管理页签。

    2. 查看当前信任策略是否与以下内容一致,若不一致,请单击修改信任策略,在修改信任策略面板修改为以下内容后单击确定

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "Service": [
                "ecs.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
      }
    3. K8sWorkerRole-****页面,单击权限管理页签,然后单击K8sWorkerRolePolicy-****权限策略名称。

    4. 在权限策略管理页面,查看是否包含以下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"
              }
      说明

      多个策略内容需要用英文半角逗号(,)分隔。

  5. 确认ECS实例的RAM角色状态是否正常。

    1. 在集群管理页左侧导航栏,选择节点管理 > 节点

    2. 节点页面,单击目标节点的实例ID,例如i-2ze5d2qi9iy90pzb****

    3. 在目标实例页面,单击实例详情页签,然后在其它信息区域的RAM角色右侧查看是否存在该ECS实例的RAM角色。

      若没有对应的RAM角色,请为ECS实例指定RAM角色。具体操作,请参见步骤二:指定RAM角色创建并设置ECS实例

  6. 手动删除alb-ingress-controller的Pod并确认重建后Pod的状态。

    1. 通过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
    2. 执行以下命令删除alb-ingress-controller的Pod。

      替换alb-ingress-controller-***为上个步骤中获取到的实际值。

      kubectl -n kube-system delete pod alb-ingress-controller-***

      预期输出:

      pod "alb-ingress-controller-***" deleted
    3. 等待几分钟后,执行以下命令查看重建后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

  1. 创建并拷贝以下内容到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支持的地域与可用区,请参见支持的地域与可用区

  2. 执行以下命令,创建AlbConfig。

    kubectl apply -f alb-test.yaml

    预期输出:

    AlbConfig.alibabacloud.com/alb-demo created
  3. 创建并拷贝以下内容到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
  4. 执行以下命令,创建IngressClass。

    kubectl apply -f alb.yaml

    预期输出:

    ingressclass.networking.k8s.io/alb created
  5. 查看ALB实例创建结果。

    • 方式一:执行以下命令查看ALB实例ID。

      kubectl get albconfig alb-demo     
      查看ALB实例ID
    • 方式二:登录应用型负载均衡ALB控制台,在控制台查看已创建的ALB实例。

步骤四:部署服务

  1. 创建并拷贝以下内容到cafe-service.yaml文件中,用于部署两个名称分别为coffeetea的Deployment,以及两个名称分别为coffee-svctea-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
  2. 执行以下命令,部署两个Deployment和两个Service。

    kubectl apply -f cafe-service.yaml

    预期输出:

    deployment "coffee" created
    service "coffee-svc" created
    deployment "tea" created
    service "tea-svc" created
  3. 执行以下命令,查看服务状态。

    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

  1. 创建并拷贝以下内容到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
  2. 执行以下命令,配置coffeetea服务对外暴露的域名和path路径。

    kubectl apply -f cafe-ingress.yaml

    预期输出:

    ingress "cafe-ingress" created
  3. 执行以下命令获取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名称直接访问

  1. 执行以下命令,通过ALB实例的DNS名称访问coffee服务:

    curl -H Host:demo.aliyundoc.com http://alb-3lzokczr3c******z7.cn-hangzhou.alb.aliyuncs.com/coffee
  2. 执行以下命令,通过ALB实例的DNS名称访问tea服务:

    curl -H Host:demo.aliyundoc.com http://alb-3lzokczr3c******z7.cn-hangzhou.alb.aliyuncs.com/tea

测试方法2:通过域名解析访问

  1. 将您的常用域名通过CNAME方式解析到步骤三:创建AlbConfig创建的ALB实例的DNS名称上。

    具体操作,请参见(可选)步骤四:设置域名解析。本文假设您将自定义域名http://demo.aliyundoc.com解析到ALB实例的公网服务域名。

  2. 执行以下命令,使用ALB实例访问coffee服务。

    curl http://demo.aliyundoc.com/coffee
  3. 执行以下命令,使用ALB实例访问tea服务。

    curl http://demo.aliyundoc.com/tea

相关文档

阿里云首页 负载均衡 相关技术圈