EKSクラスタ上のAWS負荷バランサコントローラ


Allアプリケーション/ネットワーク負荷バランサを統合するために、EWSクラスタ上でAWS負荷バランサコントローラを有効にする方法を見てみましょう.KubernetesクラスタとのAWSロードバランサの統合のユースケース&ソリューションを提供するためのガイドです.
  • Kubernetes Networking
  • Application Load Balancer

  • AWS Load Balancer Controller on EKS Cluster
  • Creating an EKS Cluster
  • Install the AWS Load Balancer Controller
  • Deploy the Ingress

  • Patterns
  • Application Load Balancer - Traffic Routing
  • Ingress Group - Multiple Ingress Resources Together
  • Custom Domain & SSL Certificate
  • HTTPS Redirect
  • Access Control
  • Custom Attributes & Addons
  • Conclusion

  • クベルネッツネットワーク
    我々は、Kubernetesネットワークの高レベルの概要から始めます.Kubernetesは、ロードバランサ、イングル/出口ゲートウェイ、ネットワークセキュリティポリシー、クラスタ内のトラフィックルーティング、相互TLS認証などのアプリケーションを展開するために必要なすべてのコンポーネントを持っています.
    Ingress そして、クラスタの外からのHTTPとHTTPSルートをservices クラスタ内で.トラフィックルーティングは、Ingressリソースで定義された規則によって制御されます.侵入はサービスに外部到達可能なURLを与えるために構成されるかもしれません、ロードバランス交通、SSL/TLSを終えて、名前ベースの仮想ホスティングを提供してください.角Ingress controller それはまた、トラフィックを処理するためにあなたのエッジルータや追加のフロントエンドを構成することがありますが、通常は、負荷バランサを使用して、インクルードを満たすために責任があります.

    アプリケーションロード
    アプリケーション負荷バランサは、アプリケーション層(OSI)モデルの第7の層で機能する.ロードバランサが要求を受信したあと、それは適用する規則を決定するために優先順位のリスナー規則を評価して、それから規則アクションのために目標グループから目標を選ぶ.アプリケーションのトラフィックの内容に基づいて、異なるターゲットグループへのルート要求にリスナー規則を設定できます.ターゲットは複数のターゲットグループに登録されている場合でも、各ターゲットグループごとに独立して実行される.
    あなたのアプリケーションに要求の全体的な流れを混乱させることなく、お客様のニーズの変更として負荷バランサーからターゲットを追加して削除することができます.弾性ロードバランシングは、時間とともにあなたのアプリケーション変化へのトラフィックとしてあなたのロードバランサを評価します.弾性ロードバランシングは、自動的にワークロードの大多数にスケールすることができます.
    ALBは、ホストまたはパスベースのルーティング、TLS(トランスポート層セキュリティ)終了、WebSocket、HTTP/2、AWS WAF(Webアプリケーションファイアウォール)の統合、統合アクセスログ、およびヘルスチェックを含む複数の機能をサポートしています.

    EKSクラスタ上のAWS負荷バランサコントローラ
    AWS負荷バランサコントローラはKubernetesクラスタ用のAWS弾性負荷バランサを管理するAWSロードバランサコントローラをインストールするとき、コントローラは動的に準備します
  • あなたがクバーネッツ侵入をつくるとき、AWSアプリケーションロードバランサー
  • 型負荷バランサのKubernetesサービスを作成するAWSネットワークロードバランサ(NLB).
  • ターゲット型-インスタンスターゲットとIPターゲットのいずれかを設定できます.

  • 写真https://aws.amazon.com/blogs/opensource/kubernetes-ingress-aws-alb-ingress-controller/
  • Kubernetes APIでイングルリソースが作成されると、ALB Ingress Controllerは変更を監視します.
  • ALB入口コントローラは、Ingressリソースに追加された注釈に基づいてAWSアプリケーションロードバランサを作成します.
  • ターゲットグループは、Ingressリソースで指定されたバックエンドごとに作成されます.
  • アプリケーションロードバランサURLは、パスまたはクエリパームでアクセスされます.
  • Intressリソースで構成された規則に基づいて、リクエストは特定のターゲットグループにリダイレクトされ、CLIP

  • EKSクラスタの作成
    EKSクラスタから始めましょう.EWSコンソールまたはEksctlツールを使用してEKSクラスタを展開できます.このブログ記事では、EKSCTLツールを使ってEKSクラスタを作成します.
    ➜ eksctl create cluster -f cluster.yaml
    
    クラスタYAML設定は以下の通りです.
    apiVersion: eksctl.io/v1alpha5
    kind: ClusterConfig
    
    metadata:
      name: app-lb-demo
      region: us-east-1
    
    iam:
      withOIDC: true   
      serviceAccounts:
        - metadata:
            name: aws-load-balancer
            namespace: kube-system
          wellKnownPolicies:
            awsLoadBalancerController: true  
    
    managedNodeGroups:
      - name: app-lb-demo-ng
        instanceType: t3.medium
        minSize: 1
        maxSize: 2
    

    AWSロードバランサコントローラ

  • EKSチャートレポをヘルムに加えてください
    helm repo add eks https://aws.github.io/eks-charts
    

  • AWS Load Balancer Controller Crds - IngressクラスParamsとターゲットグループバインディングをインストールします
    kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"
    

  • サービスアカウントを渡すことでヘルムチャートをインストールします.false ADNサービスアカウントを作成します.名前= AWS負荷バランサコントローラ
    helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=<cluster-name> --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer
    

  • イングルを展開する
    AWSアプリケーションロードバランサ(ALB)は、Ingressオブジェクトを作成するまで作成されません.ここでサンプル展開ファイルを展開し、Ingressオブジェクトを使用して公開します.
    注:このブログはKubernetes 1.21 +使用してイングルのオブジェクトが更新されます.ALBコントローラのドキュメントを見ているなら、Ingressオブジェクトのいくつかの違いを見ることができます.
    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.0.0/docs/examples/echoservice/echoserver-namespace.yaml &&\
    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.0.0/docs/examples/echoservice/echoserver-service.yaml &&\
    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.0.0/docs/examples/echoservice/echoserver-deployment.yaml
    
    namespace/echoserver created
    service/echoserver created
    deployment.apps/echoserver created
    

    パターン

    アプリケーションロードバランサ
    このingressオブジェクトでは、追加されたリソースタグでアプリケーション負荷バランサに直面しているインターネットを設定しています.規則では、パスがプレフィックスエコーを持つ場合、バックエンドサービスはエコーサーバであり、ポート番号は80です.
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: echoserver
      namespace: echoserver
      annotations:
        **kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/tags: Environment=dev,Team=app**
    spec:
      rules:
        - host: "*.amazonaws.com"
          http:
            paths:
              - path: /echo
                pathType: Prefix
                backend:
                  service:
                    name: echoserver
                    port:
                      number: 80
    
    インクルードが確認され、ALBが準備されることを確認します.ALBがプロポーズされると、ALBアドレスを取得します.
    ➜  flux-demo  k get ingress -A
    NAMESPACE    NAME         CLASS    HOSTS             ADDRESS                                                                   PORTS   AGE
    echoserver   echoserver   <none>   *.amazonaws.com   k8s-echoserv-echoserv-xxxxxxxxxxxxxxxxxxxxx.us-east-1.elb.amazonaws.com   80      10s
    
    URLとパスにリクエストを行い、期待されたレスポンスを受け取るかどうかを確認します.
    ➜  flux-demo  curl http://k8s-echoserv-echoserv-xxxxxxxxxxxxxxxxxxxxx.us-east-1.elb.amazonaws.com/echo -i
    
    HTTP/1.1 200 OK
    Date: Thu, 02 Sep 2021 02:41:57 GMT
    Content-Type: text/plain
    Transfer-Encoding: chunked
    Connection: keep-alive
    Server: nginx/1.10.0
    

    ingressグループ-一緒に複数の摂取リソース
    IngressGroup機能を使用すると、グループの複数のイングルのリソースを一緒にすることができます.コントローラは自動的にingressgroup内のすべてのドレスのingressルールをマージし、単一のALBをサポートします.さらに、ingressで定義されたほとんどの注釈は、そのイングルによって定義されたパスにのみ適用されます.
    まず、別のイングルリソースを作成し、別のアプリケーションロードバランサを作成するかどうかを確認します.
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: echoserver-1
      namespace: echoserver
      annotations:
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/tags: Environment=dev,Team=app
    spec:
      rules:
        - host: "*.amazonaws.com"
          http:
            paths:
              **- path: /echo-test**
                pathType: Prefix
                backend:
                  service:
                    name: echoserver
                    port:
                      number: 80
    
    イングルが作成されたことを確認し、別のalb - getプロビジョニングを見ることができます.それで、我々は異なるアドレスで2つのALBSを得ました.
    ➜  flux-demo  k get ingress -A
    NAMESPACE    NAME           CLASS    HOSTS             ADDRESS                                                                   PORTS   AGE
    echoserver   echoserver     <none>   *.amazonaws.com   k8s-echoserv-echoserv-64b6592087-xxxxxxxxx.us-east-1.elb.amazonaws.com   80      28m
    echoserver   echoserver-1   <none>   *.amazonaws.com   k8s-echoserv-echoserv-6c350fcfc9-xxxxxxxxx.us-east-1.elb.amazonaws.com    80      2m39s
    
    を加えましょう[alb.ingress.kubernetes.io/group.name](http://alb.ingress.kubernetes.io/group.name) 同じ値を持つ両方のingressオブジェクト
    annotations:
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/tags: Environment=dev,Team=app
        alb.ingress.kubernetes.io/group.name: alb-demo-group
    
    いったんイングルを適用すると(削除と再作成-簡単なチェックのために)、両方のingeachが同じALBアドレスを持つのを見ることができます.
    ➜  flux-demo  k get ingress -A
    NAMESPACE    NAME           CLASS    HOSTS             ADDRESS                                                             PORTS   AGE
    echoserver   echoserver     <none>   *.amazonaws.com   k8s-albdemogroup-5364dc26a8-xxxxxxxxx.us-east-1.elb.amazonaws.com   80      5s
    echoserver   echoserver-1   <none>   *.amazonaws.com   k8s-albdemogroup-5364dc26a8-xxxxxxxxx.us-east-1.elb.amazonaws.com   80      5s
    
    ルールはマージされ、アプリケーションロードバランサコントローラで設定するには、グループ内の規則の順序を適用できます.

    カスタムドメインとSSL証明書
    さて、カスタムドメインをALBとSSL証明書にバインドしましょう.SSL証明書をバインドできる2つの方法があります

  • 注釈からの証明書の設定alb.ingress.kubernetes.io/certificate-arn AWS証明書マネージャが管理する1つ以上の証明書のarnを指定します
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxxx:certificate/xxxxxxx
    

  • ドメイン名を使用してSSL証明書の自動発見を設定できます.
    ALBリスナーのためのTLS証明書は、自動的にIngressリソースからホスト名で発見されることができます[alb.ingress.kubernetes.io/certificate-arn](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/ingress/annotations/#certificate-arn) 注釈は指定しません.
    コントローラは、TLS証明書をtls イングル・アンド・ノhost 侵入規則におけるへん場
  • この例では、SSL証明書の自動発見を設定します.
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: echoserver
      namespace: echoserver
      annotations:
        **kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/tags: Environment=dev,Team=app**
    spec:
      rules:
        - host: "dev.spectaflare.com"
          http:
            paths:
              - path: /echo
                pathType: Prefix
                backend:
                  service:
                    name: echoserver
                    port:
                      number: 80
    
    curlコマンドを実行します.
    ➜  flux-demo  curl https://dev.spectaflare.com/echo -i
    HTTP/1.1 200 OK
    

    HTTPSリダイレクト
    HTTPプロトコルのURLはHTTPSプロトコルにリダイレクトするべきです.私たちはalb.ingress.kubernetes.io/actions.${action-name} HTTPトラフィックをhttpsにリダイレクトするイングルを設定する注釈
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: echoserver
      namespace: echoserver
      annotations:
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/tags: Environment=dev,Team=app
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
        alb.ingress.kubernetes.io/ssl-redirect: '443'
    spec:
      rules:
        - host: "dev.sivamuthukumar.com"
          http:
            paths:
              - path: /echo
                pathType: Prefix
                backend:
                  service:
                    name: echoserver
                    port:
                      number: 80
    

    アクセス制御
    ロードバランサのアクセス制御は以下の注釈で制御できる.
    alb.ingress.kubernetes.io/scheme: internal # To enable the internal load balancers
    alb.ingress.kubernetes.io/inbound-cidrs: 10.0.0.0/24 # Inbound CIDRs from your network or VPC
    alb.ingress.kubernetes.io/security-groups: sg-xxxx, sg-yyyy # Security groups you want to attach the load balancer
    

    カスタム属性とアドオン
    バランサを読み込むカスタム属性は注釈を使用して制御できます. alb.ingress.kubernetes.io/load-balancer-attributes
    アプリケーションロードバランサでhttp 2を有効にするために
    alb.ingress.kubernetes.io/load-balancer-attributes: routing.http2.enabled=true
    
    注釈を追加する他の属性をチェックしますhere .
    WAFをアタッチしたり、AngressオブジェクトをアンダーバランサにAWSシールドを有効にすることができます.
    alb.ingress.kubernetes.io/wafv2-acl-arn: <WAFv2 ACL ARN HERE>
    alb.ingress.kubernetes.io/shield-advanced-protection: 'true'
    

    結論
    AWS負荷バランサコントローラは、Kubernetesクラスタで実行されているアプリケーションへのルートトラフィックを構成する弾性ロードバランサを構成し、管理するためにKubernetes固有の方法を提供します.私は、私はあなたにルーティング、ingressグループ、SSL、HTTP HTTPSリダイレクションへのHTTP、および他の先進概念の概念を説明しました.ドキュメントの詳細をチェックすることができますhere . 私は非常にあなたがそれを試して共有するフィードバックと質問を与えることを奨励
    私はsiva - Srとして働いていますComputer Enterprises Inc オーランドから.私はAWSコミュニティビルダー、Auth 0大使と私は雲、コンテナ、IOT、およびdevopsについて多くを書くつもりです.もし興味があれば、あなたがもういないなら私についてきてください.私にTwitterをフォローしたり、私のブログをチェックアウトhttps://blog.sivamuthukumar.com