ALB Ingress Controller

ALB Ingress ControllerはKubernetes IngressをApplication LoadBalancer商品に連動して、HTTP、HTTPSトラフィックを、クラスタ内のPodにルーティングされるようにします。

動作

  • Ingressが生成されると、Ingress ControllerはIngressに設定された値を使用して、Application Load Balancerを生成します。
  • Ingress Ruleに設定されたServiceのNodePortにWorker Nodeに対するTarget Groupを作成してLoad Balancerに登録します。

開始する

開始する前にIngress ControllerをインストールするKubernetes Serviceクラスタとkubectlインストールとkubeconfig設定が先行しなければならない。

クラスタにALB Ingress Controllerをインストールする

次のコマンドを使用すると、kube-system名前空間にalb-ingress-controllerが生成され、それに必要なServiceAccount、ClusterRole、ClusterRoleBindingが生成されます。

kubectl --kubeconfig=$KUBE_CONFIG apply -f https://gist.githubusercontent.com/NaverCloudPlatformDeveloper/cd2f801d1896bca90fd13b9a5c7acc89/raw/6bf88a3e00a8bcca1dd0771070270f4c60040388/nks-alb-ingress-controller_v0.0.1.yaml

使い方

  • kubernetes.io/ingress.class: alb
    • ALB Ingress Controllerを使用するには、Ingress Resourceに kubernetes.io/ingress.class:alb Annotationを追加する必要があります。
  • Service type: NodePort
    • Ingressを介して公開することがServiceはすべてNodePort typeで生成しなければします。
  • Default Rule
    • Default Ruleは、マッチングされたruleが一個もない場合に適用されるruleでspec.backendに設定することができます。
    • 別のruleとuse-annotation設定は不可能であり、設定していない場合、ポート80に設定された基本的なTarget Groupが作成されます。
  • Rule Priority
    • Ingressに定義されたruleの順序によって優先順位が決定されます。一番上のruleの優先順位が1に設定されます。

Ingress Annotations

IngressServiceオブジェクトのannotationを使用して設定を変更することができます。 alb ingress annotationはすべて alb.ingress.kubernetes.io/で始まります。

Annotation デフォルト 適用Resource 説明
alb.ingress.kubernetes.io/listen-ports [{"HTTP":80}] (証明書番号が設定された場合、 [{" HTTPS ":443}] Ingress Listenerのプロトコルおよびポートの設定リスト。
- 使用可能なプロトコル:HTTP,HTTPS
alb.ingress.kubernetes.io/description N/A Ingress ロードバランサのメモ
alb.ingress.kubernetes.io/ssl-certificate-no N/A Ingress プロトコルが HTTPSなリスナーに適用する Certificate Manager の認証番号
- 証明書番号は、Resource Managerのnrnで確認することができます。 (例: nrn:PUB:CertificateManager::000:Certificate/External/${certificateNo}
alb.ingress.kubernetes.io/load-balancer-size small Ingress ロードバランサの負荷処理性能の設定
- 設定可能な値: small, medium, large
alb.ingress.kubernetes.io/network-type public Ingress ロードバランサのネットワークタイプを設定
- プライベート: private, 公認: public
alb.ingress.kubernetes.io/subnet-id kube-system configmap(ncloud-config)lbSubnetNo Ingress ロードバランサの作成のためのロードバランサ専用サブネットのID値であり、生成する場合にのみ使用されます。
alb.ingress.kubernetes.io/actions.${actionName} N/A Ingress Listener Ruleの機能を使用するための設定(下の説明を参照)
alb.ingress.kubernetes.io/conditions.${conditionName} N/A Ingress Ingress RuleのHost、Path条件に追加の条件を適用するための設定(下の説明を参照)
alb.ingress.kubernetes.io/algorithm-type round-robin Ingress, Service Target Groupのロードバランシングアルゴリズムの設定
- 設定可能な値: round-robin, least-connection, source-ip-hash
alb.ingress.kubernetes.io/unhealthy-threshold-count 2 Ingress, Service Health Check 失敗しきい値
alb.ingress.kubernetes.io/healthy-threshold-count 2 Ingress, Service Health Check 成功のしきい値
alb.ingress.kubernetes.io/healthcheck-port TargetGroup ポート Ingress, Service Health Check ポート
alb.ingress.kubernetes.io/healthcheck-path / Ingress, Service Health Check URL パス
alb.ingress.kubernetes.io/healthcheck-interval-seconds 30 Ingress, Service Health Check サイクル(秒)
alb.ingress.kubernetes.io/healthcheck-protocol HTTP Ingress, Service Health Checkプロトコル
- HTTP, HTTPS
alb.ingress.kubernetes.io/backend-protocol HTTP Ingress, Service Target Groupのプロトコル
- HTTP, HTTPS
alb.ingress.kubernetes.io/enable-sticky-session false Ingress, Service Target GroupのSticky Session設定
  • alb.ingress.kubernetes.io/actions.${actionName}: actionsモデルに合わせてjson形式のstringに作成してListener Ruleの追加機能を設定することができます。 Ingressに設定されたRuleのserviceNameを使用しようとする ${actionName}に設定し、servicePortuse-annotationに設定すると、Annotationが適用されます。
Property Type 説明
type string actionのtypeを定義します。
- 設定可能な値 targetGroup, redirection
targetGroup object actionのtypeを targetGroupに設定した場合に使用されます。
targetGroup.targetGroups array トラフィックを転送するserviceのリストです。
targetGroup.targetGroups[n].serviceName string service name
targetGroup.targetGroups[n].servicePort number service port
targetGroup.enableStickySession boolean sticky session有効かどうか
- デフォルト: false
redirection object actionのtypeを redirectionに設定した場合に使用されます。
redirection.host string - デフォルト: #{host}
redirection.path string - デフォルト: /#{path}
redirection.query string - デフォルト: #{query}
redirection.port string redirectionポート
- デフォルト: #{port}
redirection.protocol string - 設定可能なプロトコル: HTTP, HTTPS
- デフォルト: #{protocol}
redirection.statusCode number - 設定可能なコード: 301, 302
  • 例示
    • パス /exampleactionNametargetsなAnnotationを設定して、二つのService(a、b)に重みベースのルーティングになるように設定
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
      name: example-alb-ingress
      annotations:
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
        alb.ingress.kubernetes.io/actions.targets: >
          {"type":"targetGroup","targetGroup":{"targetGroups":[{"serviceName":"a","servicePort":80,"weight":40},{"serviceName":"b","servicePort":80,"weight":60}],"enableStickySession":false}}
      labels:
        app: example-alb-ingress
      spec:
      rules:
        - http:
            paths:
              - path: /example
                backend:
                  serviceName: targets
                  servicePort: use-annotation
      
  • alb.ingress.kubernetes.io/conditions.${conditionName}: conditionsモデルに合わせてjson形式のstringに作成してIngressに定義されたHost、Path条件に加え条件を設定することができます。 Ingress Ruleで ${conditionName}と一致するserviceNameのServiceについての条件を適用します。
Property Type 説明
field string 追加する条件を定義します。
- 設定可能な値 hostHeader, pathPattern
hostHeader object conditionのfieldを hostHeaderに設定した場合に使用されます。
hostHeader.values array hostのリストです。
hostHeader.values[n] string host
pathPattern object conditionのfieldを pathPatternに設定した場合に使用されます。
pathPattern.values array pathのリストです。
pathPattern.values[n] string path
  • 例示
    • 既存のruleに設定されたパス /exampleにhost条件example.comとpath条件 /example2を追加
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
      name: example-alb-ingress
      annotations:
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/conditions.example: >
          [{"field":"hostHeader","hostHeader":{"values":["example.com"]}},{"field":"pathPattern","pathPattern":{"values":["/example2"]}}]
      labels:
        app: example-alb-ingress
      spec:
      rules:
        - http:
            paths:
              - path: /example
                backend:
                  serviceName: example
                  servicePort: 80
      

Example

ルーティングの例

異なる3つのServiceに対してさまざまな方法でルーティングする例です。

次のコマンドを実行すると、3つのSampleのDeploymentとServiceが生成されます。各サービスの名前は navercloudplatformです。

kubectl --kubeconfig=$KUBE_CONFIG apply -f https://gist.githubusercontent.com/NaverCloudPlatformDeveloper/0e6262b996f74229719807cb5ae007fc/raw/3ce72e7961bc2407bfb87e153c94672e6ee6a1cf/nks-alb-ingress-sample-services.yaml

生成されたサービスに対して、以下のように動作するようにIngressを生成してみましょう。

  • 経路別の動作
    • /platform: Service platformにルーティングします。
    • /navercloud: 50対50の重みで navercloud二Serviceにルーティングします。
    • その他のすべてのパス:Service naverにルーティングします。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: sample-alb-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
    alb.ingress.kubernetes.io/description: 'alb ingress controller'
    alb.ingress.kubernetes.io/actions.navercloud: >
      {"type":"targetGroup","targetGroup":{"targetGroups":[{"serviceName":"naver","servicePort":80,"weight":50},{"serviceName":"cloud","servicePort":80,"weight":50}]}}
  labels:
    app: sample-alb-ingress
spec:
  backend:
    serviceName: naver
    servicePort: 80
  rules:
    - http:
        paths:
          - path: /platform
            backend:
              serviceName: platform
              servicePort: 80
          - path: /navercloud
            backend:
              serviceName: navercloud
              servicePort: use-annotation

上記にingress.yamlファイルを作成した後、次のコマンドでクラスタにIngressを生成します。

kubectl --kubeconfig=$KUBE_CONFIG apply -f ./ingress.yaml

Ingressが生成されると、Application Load Balancerを生成し、生成が完了すると、IngressのADDRESSにLoad Balancer接続の情報が更新されていることを確認することができます。

kubectl --kubeconfig=$KUBE_CONFIG get ingress
NAME                 HOSTS   ADDRESS   PORTS   AGE
sample-alb-ingress   *       ing-default-samplealbing-e5bde-1494091-0687c0712561.kr.lb.naverncp.com   80      21s

Load Balancerのアドレスを呼び出してingressに設定したパスがそれぞれ異なるServiceのPodに接続されているServer nameで確認することができます。

  • /navercloud (何度も呼び出してnaver、cloudにルーティング確認)

    $ curl http://ing-default-samplealbing-e5bde-1494091-0687c0712561.kr.lb.naverncp.com/navercloud
    Server address: 198.18.0.160:80
    Server name: cloud-868dcd94cb-7lpl6
    Date: 15/Oct/2020:12:31:25 +0000
    URI: /navercloud
    Request ID: 6eaff95fa4000943b9aea8903ba8e598
    
    $ curl http://ing-default-samplealbing-e5bde-1494091-0687c0712561.kr.lb.naverncp.com/navercloud
    Server address: 198.18.0.75:80
    Server name: naver-5b64c89ff8-gwqxx
    Date: 15/Oct/2020:12:35:59 +0000
    URI: /navercloud
    Request ID: 9aa7cc193798ce3bce89718570fb9cb9
    
  • /platform
    $ curl http://ing-default-samplealbing-e5bde-1494091-0687c0712561.kr.lb.naverncp.com/platform
    Server address: 198.18.0.35:80
    Server name: platform-85f9569d46-9zx6v
    Date: 15/Oct/2020:12:31:34 +0000
    URI: /platform
    Request ID: 2c9ef5533e8eb3421f129a095ab0b418
    
  • /navercloudplatform(設定ではないパス)
    $ curl http://ing-default-samplealbing-e5bde-1494091-0687c0712561.kr.lb.naverncp.com/navercloudplatform
    Server address: 198.18.0.75:80
    Server name: naver-5b64c89ff8-gwqxx
    Date: 15/Oct/2020:12:31:46 +0000
    URI: /navercloudplatform
    Request ID: aa95fbc807f305e6a8a07aa6a57884b2
    

HTTPからHTTPSにリダイレクトする

action typeがredirectionなannotationを活用して、 HTTP(80)に入ってくるトラフィックを HTTPS(443)でredirectする例です。 この例を実行するには、まずドメインが必要であり、そのドメインのCertificate Manager商品に登録された証明書が必要です。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]'
    alb.ingress.kubernetes.io/ssl-certificate-no: "1004"
    alb.ingress.kubernetes.io/actions.ssl-redirect: |
      {"type":"redirection","redirection":{"port": "443","protocol":"HTTPS","statusCode":301}}
  labels:
    app: sample-alb-ingress
  name: sample-alb-ingress
  namespace: sample
spec:
  backend:
    serviceName: my-service
    servicePort: 80
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: ssl-redirect
          servicePort: use-annotation
      - path: /*
        backend:
          serviceName: my-service
          servicePort: 80
  • 80ポートをポート443にredirectionするために二つのportを登録します。

    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]'
    
  • HTTPS リスナーに登録する証明書番号です。認証番号は、Resource Managerのnrnで確認することができます。 (例示: nrn:PUB:CertificateManager::000:Certificate/External/${certificateNo})

    alb.ingress.kubernetes.io/ssl-certificate-no: "1004"
    
  • 443ポートにredirectするactionを登録します。

    alb.ingress.kubernetes.io/actions.ssl-redirect: |
      {"type":"redirection","redirection":{"port": "443","protocol":"HTTPS","statusCode":301}}
    
  • /*パスにトラフィックが入ってくるとssl-redirectに登録したaction設定通り、ポート443でredirectします。(このruleは最上段に位置する必要があります。

    
    - path: /*
      backend:
        serviceName: ssl-redirect
        servicePort: use-annotation
    
  • 443ポートに入ってきたトラフィックがmy-serviceに転送されます。

    - path: /*
      backend:
        serviceName: my-service
        servicePort: 80
    

基本的にはalb-ingress-controllerはingressに登録されたruleをすべてlistenerに同じように登録します。しかし、redirect設定の場合、redirect loopが発生する可能性のあるケースでは、該当するポートのlistenerはredirect ruleを登録しません。したがって、上記の例では、80ポートのリスナーのみredirect ruleが登録されます。

に対する検索結果は~件です。 ""

    に対する検索結果がありません。 ""

    処理中...