文档

自建Kubernetes集群使用ALB Ingress最佳实践

更新时间:

本文指导您如何在阿里云云上自建的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概述

ALB Ingress场景示例

注意事项

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

  • AlbConfig、Namespace、Ingress和Service这些资源的名称不能以aliyun开头。

前提条件

  • 您已拥有阿里云云上自建Kubernetes v1.20版本以上集群,并可通过kubectl工具连接该集群。关于如何下载和安装kubectl工具,请参见安装和设置kubectl

  • 您已为云上自建集群开启SNAT公网访问能力。具体操作,请参见使用公网NAT网关SNAT功能访问互联网

  • 云上自建的集群使用controller镜像时,请注意:

配置步骤

配置步骤

以下步骤涉及文件修改,请您了解对应的文件名称和用途。

步骤

文件名称

文件用途

步骤一:部署alb-ingress-controller

load-balancer-controller.yaml

基于模板修改

用于部署alb-ingress-controller

步骤二:创建AlbConfig及IngressClass资源

alb.yaml

自建并修改

用于创建albconfig及ingressClass资源,并同步完成ALB实例的创建

步骤三:部署测试应用

test-service.yaml

自建并修改

用于部署测试服务

步骤四:创建Ingress

test-ingress.yaml

自建并修改

用于创建Ingress

步骤一:部署alb-ingress-controller

本文中alb-ingress-controller使用InCluster模式启动,通过配置监听Service、Endpoint、Node等资源的权限,使用load-balancer-controller.yaml文件部署alb-ingress-controller,相关的ServiceAccount、Deployment、ConfigMap已经预置,您只需要针对实际情况执行以下修改。

  1. 修改load-balancer-controller.yaml文件,将Deployment对应的镜像修改为可用的镜像地址。

    load-balancer-controller.yaml文件用于部署alb-ingress-controller。

    修改前:

    image: registry.cn-beijing.aliyuncs.com/wg/alb:pure-ctl

    修改后:

    image: alibabacloudslb/alibaba-load-balancer-controller:v1.1.2  #已完成x86编译的镜像
  2. 修改load-balancer-controller.yaml文件,在ConfigMap文件中配置AccessKey ID与AccessKey Secret。

    说明

    您可以使用需要创建ALB实例的阿里云账号登录RAM控制台,然后在AccessKey页面查看AccessKey ID与AccessKey Secret。

    修改前:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: load-balancer-config
      namespace: kube-system
    data:
      cloud-config.conf: |-
        {
            "Global": {
                "routeTableIDs": ""
            }
        }

    修改后:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: load-balancer-config
      namespace: kube-system
    data:
      cloud-config.conf: |-
        {
            "Global": {
                "AccessKeyID": "VndV***",              #请填写AccessKeyID,AccessKeyID需要base64编码
                "AccessKeySecret": "UWU0NnUyTFdhcG***" #请填写AccessKeySecret,AccessKeySecret需要base64编码
            }
        }
                            
  3. 通过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
  4. 执行以下命令验证alb-ingress-controller部署结果。

    kubectl -n kube-system get all | grep load-balancer

    如下图所示,pod运行状态为Running,表示部署成功。

    alb-ingress-controller部署验证

步骤二:创建AlbConfig及IngressClass资源

创建albconfig及ingressClass资源成功后,即可同步完成ALB实例的创建。

  1. 创建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支持的地域与可用区,请参见支持的地域与可用区

  2. 通过kubectl连接集群,执行以下命令,提交alb.yaml文件进行部署。

    kubectl apply -f alb.yaml

    预期输出:

    AlbConfig.alibabacloud.com/alb-demo created
    ingressclass.networking.k8s.io/alb created
  3. 查看ALB实例创建结果。

步骤三:部署测试应用

本文使用测试镜像来创建Deployment资源,并使用该Deployment资源部署测试应用。

  1. 创建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
  2. 通过kubectl连接集群,执行以下命令,提交test-service.yaml文件进行部署。

    kubectl apply -f test-service.yaml

    预期输出:

    deployment "test01" created
    service "test01-service" created
    deployment "test02" created
    service "test02-service" created
  3. 执行以下命令,验证测试服务是否部署成功。

    kubectl get svc,deploy  

    如果收到以下回复,代表测试服务部署成功。部署测试服务

步骤四:创建Ingress

Ingress对应ALB实例中的转发规则。本文使用基于路径的转发功能进行配置,更多高级功能请参见ALB Ingress的详细使用手册

  1. 创建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
  2. 通过kubectl连接集群,执行以下命令,提交test-ingress.yaml文件进行部署。

    kubectl apply -f test-ingress.yaml

    预期输出:

    ingress "test-ingress" created
  3. 执行以下命令,验证test-ingress资源创建结果。

    kubectl get ingress

    如果收到以下回复,代表test-ingress资源创建成功。创建Ingress

步骤五:结果验证

本文列出了验证ALB Ingress访问后端服务的两种方法。

测试方法1:通过ALB DNS名称直接访问

  1. 执行以下命令,获取ALB实例的DNS名称。

    kubectl get ingress

    预期输出:

    NAME           CLASS    HOSTS                         ADDRESS                                               PORTS   AGE
    test-ingress   alb      demo.domain.ingress.top       alb-3lzokczr3c******z7.cn-hangzhou.alb.aliyuncs.com   80      50s
  2. 执行以下命令,使用ALB实例访问test01服务。

    curl -H Host:demo.domain.ingress.top http://alb-3lzokczr3c******z7.cn-hangzhou.alb.aliyuncs.com/test01
  3. 执行以下命令,使用ALB实例访问test02服务。

    curl -H Host:demo.domain.ingress.top http://alb-3lzokczr3c******z7.cn-hangzhou.alb.aliyuncs.com/test02

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

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

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

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

    curl http://demo.domain.ingress.top/test01

    结果验证1

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

    curl http://demo.domain.ingress.top/test02

    结果验证2

如果您在使用过程中有任何疑问,请加入钉群ALB客户交流群(钉群号:31945843)咨询。

相关文档

ALB Ingress概述及功能介绍:

  • 本页导读 (1)