####### INGRESS ####### サービスメッシュ内の複数サービスをホストするためのロードバランサー設定を機能を提供します。 +--------------------+--------------------------------+ | | 設定値 | +====================+================================+ | Chart | ingress | +--------------------+--------------------------------+ 対応サービス ============== * Azure: `Azure ロードバランサー`_ , `Azure Application Gateway`_ * Google Cloud: `Google Network Load Balancer`_, `Google Application Load Balancer`_ * AWS: `AWS Network Load Balancer`_, `AWS Application Load Balancer`_ パッケージの機能 ================ 本パッケージでは、 クラスタにロードバランサーを追加するための以下の機能を提供します。 * ロードバランサーの設定 * Istio Gateway の設定 * サービスメッシュ設定 * TLS 証明書の発行/管理 * ロードバランサーへの WAF 設定 (AWS,Azure の L7 alb のみ) * ロードバランサーでの OIDC 認証設定 (AWS, Google の L7 alb のみ) * Application Gateway の作成及び Ingress Controller のインストール (Azure のみ) ロードバランサーの種類 ---------------------- 本パッケージが作成できるロードバランサーには L7,L4 の二種類があり、それぞれ以下のような特徴があります。 L7 (alb) ~~~~~~~~ ネットワークレイヤー 7 で HTTP/HTTPS 通信に対応したロードバランサー * HTTP(s)によるルーティング機能 * WAF,認証プロキシ等への対応 * マルチリージョンでの利用 HTTP(s)通信が目的の場合は L7 ロードバランサーの利用を推奨します。 HTTP(s)以外の通信への対応状況はクラウドベンダー毎に異なるため、個別に確認が必要です。 L4 ~~~ ネットワークレイヤー 4 で TCP/UDP 通信に対応したロードバランサー HTTP(s) 以外の通信要件が必要な場合にこちらを選択します。 通常 L4 ロードバランサーには HTTP ルーティング機能はありませんが、 CNAP クラスタでは Istio サービスメッシュに自動で組み込まれるため、 別途 nginx 等を導入することなく HTTP ルーティングを行うことができます。 事前準備 ======== 本パッケージがロードバランサーを作成するにあたり、 利用用途に応じて事前準備が必要になる場合があります。 DNS ゾーン ---------- 本パッケージは Kubernetes クラスタにロードバランサーを追加し、外部からクラスタ内ネットワークへの通信を可能にします。 ロードバランサーに割り当てられた IP アドレスの名前解決を行う場合は別途 DNS ゾーンの作成と、 ゾーンの委任が必要になります。 DNS ゾーンの追加には :doc:`dns` パッケージを使用します。 .. important:: ``tls.certs[].type`` に ``letsencrypt`` を選択している場合、DNS 委任後証明書の自動発行に失敗する場合があります。 これは証明書の発行及び更新を管理している cert-manager の仕様の問題のため、 このような問題が発生した場合には、cert-manager の再起動を行うことで証明書が発行されるようになります。 ``kubectl rollout restart deployment -n cert-manager cert-manager-cert-manager`` ネットワーク ------------ プライベートネットワークにロードバランサーを作成する場合は、 ロードバランサーの先のネットワークを事前に準備しておく必要があります。 各クラウドベンダー毎に必要な設定手順が異なるため、後述のサンプルを参考にして、 ネットワークの設定を行います。 パブリックネットワークにロードバランサーを作成する場合は、事前準備は不要です。 固定 IP ------- 本パッケージでパブリックネットワーク向けのロードバランサーに固定 IP を設定したい場合は、 事前に :doc:`public-ip` で IP を発行しておく必要があります。( ``loadBalancer.staticIp`` に設定する) IP の指定が無い場合は自動割り当てされた動的 IP が適用されます。 この IP はロードバランサーが削除されると開放され、再度作成した際には異なる IP が割り当てられます。 * `AWS Elastic IP`_ * `Google Static IP`_ 固定 IP の設定には利用するロードバランサーの設定ごとに以下の設定が必要になります。 +---------+-------------------+----------------------+--------------------+--------------------------------------------------------+----------------------------------------------------------------+ | vendor | loadBalancer.type | loadBalancer.private | staticIp.addresses | stawticIp.resourceRefs | 備考 | +=========+===================+======================+====================+========================================================+================================================================+ || Azure || l7 || fase || 設定不要 || - name: :doc:`public-ip` マニフェスト名 || Application Gateway と PublicIPAddress は | || || || || || - namespace: managed-system || 同じリソースグループに配置されている必要があります | || || || || || - resourceGroup: PublicIPAddress のリソースグループ名 || リソースグループが指定されていない場合は、 | || || || || || || CNAP 共有 Resource Group に配置されているものとして動作します | +---------+-------------------+----------------------+--------------------+--------------------------------------------------------+----------------------------------------------------------------+ | Azure | l7 | true | - IP アドレス | 設定不要 | | +---------+-------------------+----------------------+--------------------+--------------------------------------------------------+----------------------------------------------------------------+ | Azure | l4 | true/false | - IP アドレス | 設定不要 | | +---------+-------------------+----------------------+--------------------+--------------------------------------------------------+----------------------------------------------------------------+ | AWS | l7 | false | 設定不要 | 設定不要 | EKS に自動割り当てされた IP が使用されます | +---------+-------------------+----------------------+--------------------+--------------------------------------------------------+----------------------------------------------------------------+ | AWS | l7 | true | 設定不要 | 設定不要 | EKS に自動割り当てされた IP が使用されます | +---------+-------------------+----------------------+--------------------+--------------------------------------------------------+----------------------------------------------------------------+ || AWS || l4 || false || 設定不要 || - name: :doc:`public-ip` マニフェスト名 || サブネットの数と同数の IP を指定します | || || || || || - namespace: マニフェストの namespace || | +---------+-------------------+----------------------+--------------------+--------------------------------------------------------+----------------------------------------------------------------+ | AWS | l4 | true | - IP アドレス | 設定不要 | サブネットの数と同数の IP を指定します | +---------+-------------------+----------------------+--------------------+--------------------------------------------------------+----------------------------------------------------------------+ || Google || l7 || true/false || 設定不要 || - name: :doc:`public-ip` マニフェスト名 || | || || || || || - namespace: マニフェストの namespace || | +---------+-------------------+----------------------+--------------------+--------------------------------------------------------+----------------------------------------------------------------+ | Google | l4 | true/false | - IP アドレス | 設定不要 | | +---------+-------------------+----------------------+--------------------+--------------------------------------------------------+----------------------------------------------------------------+ Gateway の作成 ==================== 作成したロードバランサーに対応する Istio Gateway リソースを作成します。 BASIC-DEPLOYMENT パッケージで作成したアプリケーションはこの Gateway を指定することで、追加で作成したロードバランサーからのリクエストを 受け付けることができるようになります。 :doc:`basic-deployment` パッケージの ``spec.settings.network.gatewayName`` に Gateway リソースの名前を指定します。 Gateway リソースの名前は ``loadBalancer.gateway.name`` が指定されている場合はその値、指定されていない場合はリリース名 ( Application リソースの名前 )になります。 TLS 証明書 ========== TLS 証明書は以下の3種類に対応しています。 Let's Encrypt ------------- Cert Manager を利用し Let's Encrypt で発行します。 証明書の更新は自動で行われるため、更新作業は発生しません。 CNAP の Cert Manager はプライベート証明書には対応していないため、 プライベートネットワークにロードバランサーを作成する場合は、他の証明書を選択します。 CNAP は Cert Manager の ACME_ を利用した証明書発行に対応します。 デフォルトでは issuer として のマネージド DNS を利用した issuer が設定されており、 通常は ``tls.certs[].issuer`` の設定を行う必要はありません。 独自の issuer を設定する場合は Cert Manager issuer の ACME_ 設定を参考にして ``tls.certs[].issuer`` に solver の値を指定します。 .. code-block:: yaml :caption: http01 solver の例 tls: certs: - issuer: email: user@example2.com server: https://acme-v02.api.letsencrypt.org/directory solvers: - http01: ingress: class: istio type: letsencrypt secret: name: test-tls クラウドマネージド ------------------ 各クラウドベンダーが発行するマネージド証明書です。 証明書の発行及び更新は自動で行われるため、更新作業は発生しません。 (AWS L7 にのみ対応) :ref:`aws-l7-public` セルフマネージド ---------------- 独自に発行した証明書を利用する場合は、各クラウドベンダーのキーマネージメントサービス(KMS)に秘密鍵と証明書をそれぞれ登録しておくことにより利用できます。 * :ref:`TlsTut` 証明書の自動更新は行われないため、期限が切れる前に KMS に登録された証明書を更新する必要があります。 Example ======= 以下のExampleでは、 ``Application`` マニフェストの ``settings`` の部分の定義を載せています。 ``settings`` 以外のマニフェストは下記を参考にしてください。 .. code-block:: yaml :emphasize-lines: 11 apiVersion: managed.msp.sbopsv/v1alpha1 kind: Application metadata: name: ingress-l7 namespace: staging spec: chart: name: ingress version: settings: <ユーザ定義設定> Example1. L4 (Azure, Google Cloud, AWS) --------------------------------------- .. literalinclude:: example/ingress/example_aws_l4_public.yaml :language: yaml :caption: AWS L4 public L4 ロードバランサーを利用する場合は、 ``loadBalancer.ports`` で利用するポートを明示的に指定する必要があります。 ``hostRefs`` にはポートを設定するホストの名前 ``hosts[].name`` を指定します。 サブネットの指定 ~~~~~~~~~~~~~~~~ L4 ロードバランサーに設定するサブネットの設定要件。 AWS """" * リストで複数指定可能 * クラスタと同一のvpc上のsubnetのみ指定可能 * public の場合 * EKS が private subnet に構築されている時は指定必須、 * EKS が public subnet に構築されている時はクラスタネットワークと別の public subnet を指定したい場合にのみ指定する * private の場合 * EKS が private subnet に構築されている時は指定任意 * EKS が public subnet に構築されている時は指定必須 * 現状の CNAP では必ず public subnet に EKS が構築されるので、 事実上 private 接続の時には指定が必須 .. literalinclude:: example/ingress/example_aws_l4_private.yaml :language: yaml :caption: AWS L4 private Azure """"" * リスト形式で記載するが、リストの先頭の値が反映される * クラスタと同一のvnet上のsubnetのみ指定可能 * (armIdではなく単純な)サブネット名を指定 * public の場合は指定無効 * private の場合は指定任意、クラスタネットワークと別の subnet を利用したい時に指定 .. literalinclude:: example/ingress/example_azure_l4_private.yaml :language: yaml :caption: Azure L4 private ロードバランサーに割り当てる IP アドレスを明示する必要があります。 IP アドレスにはロードバランサーを作成するサブネット内の IP アドレスを ``loadBalancer.staticIp.addresses`` に指定します。 Google """""" * リスト形式で記載するが、リストの先頭の値が反映される * クラスタと同一のvpc上のsubnetのみ指定可能 * public の場合は指定無効 * private の場合は指定任意、クラスタネットワークと別の subnet を利用したい時に指定 Example2. Azure L7 Public ------------------------- .. literalinclude:: example/ingress/example_azure_l7_public.yaml :language: yaml Azure で L7 ロードバランサを作成する場合はロードバランサーを配置する subnet とそれを含む vnet を指定する必要があります。 それぞれ ``loaBalancer.azure.appGateway.vnet.name`` ``loadBalancer.subnets`` に設定します。 vnet のリソースグループはデフォルトで CNAP の共有リソースグループが指定されますが、 任意のリソースグループを指定する場合は ``loaBalancer.azure.appGateway.vnet.resourceGroup`` に設定します。 Azure ではパブリック、プライベート共に同一のロードバランサーに複数のドメイン設定を行うことはできません。 ``hosts`` と ``tls.certs`` のリストにはそれぞれ1つの設定のみ定義できます。 Example3. Azure L7 Private -------------------------- .. literalinclude:: example/ingress/example_azure_l7_private.yaml :language: yaml Azure プライベートネットワークで L7 ロードバランサーを作成する際には、 ロードバランサーに割り当てる IP アドレスを明示する必要があります。 IP アドレスにはロードバランサーを作成するサブネット内の IP アドレスを ``loadBalancer.staticIp.addresses`` に指定します。 Example4. Google Cloud L7 Public -------------------------------- .. literalinclude:: example/ingress/example_google_l7_public.yaml :language: yaml Example5. Google Cloud L7 Private --------------------------------- .. literalinclude:: example/ingress/example_google_l7_private.yaml :language: yaml Google でプライベートネットワークに L7 ロードバランサーを作成する際には、 クラスタの属する vpc ネットワーク内にプロキシサブネットを追加し、 ファイアウォールの設定を行っておく必要があります。 * `google 内部ロードバランサー設定`_ .. _aws-l7-public: Example6. AWS L7 Public ----------------------- .. literalinclude:: example/ingress/example_aws_l7_public.yaml :language: yaml AWS の alb で tls を使用する場合。証明書は cloudmanaged を選択する必要があります。 cloudmanaged を選択している場合は ``tls.awsArn`` に事前に発行した証明書の ARN を指定します。 証明書の ARN はロードバランサーに対して1つのみ設定することができます。 AWS で L7 パブリックネットワークにロードバランサーを作成する場合は、クラスタに設定されたサブネットを全て指定する必要があります。 また、ロードバランサーはサブネット毎に作成されるため、固定 IP を設定する場合はサブネットと同数の固定 IP を ``loadBalancer.staticIp.resourceRefs`` に指定する必要があります。 Example7. AWS L7 Private ------------------------ .. literalinclude:: example/ingress/example_aws_l7_private.yaml :language: yaml Values ====== Default values -------------- .. literalinclude:: values/ingress.values.yaml :language: yaml Schema reference ---------------- .. jsonschema:: schema/ingress.schema.json Change Log ========== .. changelog:: :changelog-url: https://msp-project-gcp.an.r.appspot.com/managed/ingress.html :github: https://github.com/sbopsv/MASTER-CONTAINER-HELM-INGRESS/releases/ .. _`Azure ロードバランサー`: https://learn.microsoft.com/ja-jp/azure/load-balancer/ .. _`Azure Application Gateway`: https://learn.microsoft.com/ja-jp/azure/application-gateway/ .. _`Google Network Load Balancer`: https://cloud.google.com/load-balancing/docs/passthrough-network-load-balancer .. _`Google Application Load Balancer`: https://cloud.google.com/load-balancing/docs/application-load-balancer .. _`AWS Network Load Balancer`: https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html .. _`AWS Application Load Balancer`: https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html .. _`google 内部ロードバランサー設定`: https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress?hl=ja#prepare-environment .. _`AWS Elastic IP`: https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html .. _`Google Static IP`: https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address?hl=ja .. _ACME: https://cert-manager.io/docs/configuration/acme/