DNSのカスタマイズ
Verrazzanoシステムおよびアプリケーション・エンドポイントのDNS構成のカスタマイズ
ネットワーク・トラフィックとは、ネットワーク上を流れるデータのことです。このドキュメントのコンテキストでは、方向に基づくトラフィックと、コンポーネント・タイプ(システムまたはアプリケーション)に関連するトラフィックという2つの観点からネットワーク・トラフィックを考えることが有用です。トラフィックの方向は、南北トラフィック(クラスタへの入出)または東西トラフィック(クラスタ内に留まる)のいずれかです。
最初にトラフィックのクラスタへの進入について説明し、次にトラフィックがクラスタに入った後にどのように流れるかについて説明します。
イングレスという用語には複数の意味があるため、コンテキストで理解する必要があります。この用語は、「クラスタへのイングレス」のようにクラスタへの外部アクセスを意味する場合があります。Kubernetes Ingressリソースを指す場合もあります。また、Pod内のコンテナへのネットワーク・イングレスを意味するために使用される場合もあります。ここでは、クラスタへの一般的なイングレスとKubernetes Ingressリソースの両方の意味で使用します。
インストール中、Verrazzanoは、システム・コンポーネントとアプリケーションの両方にアクセスするために必要なネットワーク・リソースを作成します。次のイングレスおよびロード・バランサの説明は、Verrazzanoインストールというコンテキストでの説明です。
クラスタの外部からPodに到達するには、LoadBalancerまたはNodePortサービスを使用して外部IPアドレスを公開する必要があります。Verrazzanoは、2つのLoadBalancerサービスを作成します。1つはシステム・コンポーネント・トラフィック用、もう1つはアプリケーション・トラフィック用です。サービスがトラフィックをクラスタに入れる仕様は、基礎となるKubernetesプラットフォームによって異なります。Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE)では、LoadBalancerタイプ・サービスを作成すると、Oracle Cloud Infrastructureロード・バランサが作成され、ポッドのセットにロード・バランシングされるように構成されます。
システム・コンポーネントへのイングレスを提供するために、VerrazzanoはNGINXロード・バランサを含むNGINX Ingress Controllerをインストールします。Verrazzanoは、Kubernetes Ingressリソースを作成して、イングレスを必要とするシステム・コンポーネントごとにイングレスを構成します。Ingressリソースを使用して、エンドポイント・ホスト名およびTLS証明書とともにKubernetesサービスへのHTTP/HTTPSルートを指定します。Ingress自体は何もしません。単なるリソースです。サービス・ルーティングを処理するよう基礎となるKubernetesロード・バランサを構成してIngressリソースを監視し、調整するためにイングレス・コントローラが必要です。NGINX Ingress Controllerは、Ingressリソースを処理し、イングレス・ルート情報などを使用してNGINXを構成します。
NGINX Ingress Controllerは、次に示すようにLoadBalancerサービスです:
$ kubectl get service -n ingress-nginx
# Sample output
ingress-controller-ingress-nginx-controller           LoadBalancer
OKEの例を使用すると、Oracle Cloud Infrastructureロード・バランサに入るトラフィックはNGINXロード・バランサにルーティングされ、その後、そこから、イングレスに記述されているサービスに属するポッドにルーティングされます。
Verrazzanoはアプリケーションへのイングレスも提供しますが、NGINXではなくEnvoyプロキシであるIstioイングレス・ゲートウェイを使用します。Istioには、メッシュに入るトラフィック用のホスト、ポート、証明書などのロード・バランサ情報を提供するGatewayリソースがあります。詳細は、Istio Gatewayを参照してください。Ingressに対応するIngressコントローラが必要なのと同様に、Gatewayリソースにもコントローラが必要で、対応するIstioイングレス・ゲートウェイ・コントローラがあります。ただし、Ingressとは異なり、Gatewayリソースにはサービス・ルーティング情報はありません。Istio VirtualServiceリソースによって処理されます。GatewayとVirtualServiceの組合せは、Ingressよりも多くの機能が提供されるため、基本的にはIngressのスーパーセットです。つまり、Istioイングレス・ゲートウェイは、GatewayおよびVirtualServiceリソースの両方の情報を使用してクラスタへのイングレスを提供します。
Verrazzanoはインストール中にアプリケーションを作成しないため、その時点でGatewayおよびVirtualServiceを作成する必要はありません。ただし、インストール時に、Verrazzanoは、LoadBalancerサービスであるIstioイングレス・ゲートウェイおよびClusterIPサービスであるIstioエグレス・ゲートウェイを作成します。
$ kubectl get service -n istio-system
# Sample output
istio-ingressgateway   LoadBalancer
OKEユース・ケースを再度使用すると、別のOracle Cloud Infrastructureロード・バランサが作成され、トラフィックがIstioイングレス・ゲートウェイ・ポッド(Envoyプロキシなど)にルーティングされます。
Verrazzanoをインストールするときに、オプションでドメインの外部DNSを指定できます。その場合、VerrazzanoはExternalDNSを使用してDNSレコードを作成するだけでなく、Ingressリソースにホスト名を構成します。そのホスト名を使用して、NGINX Ingress Controllerからシステム・コンポーネントにアクセスできます。
システム・トラフィックには、システムPodに入出するすべてのトラフィックが含まれます。
南北トラフィックには、Kubernetesクラスタに入出するすべてのシステム・トラフィックが含まれます。
次に、NGINX Ingress Controllerを介してクラスタ外部のクライアントからアクセスされるVerrazzanoシステム・コンポーネントの一覧を示します:
次の表に、クラスタ外部の宛先へのリクエストを開始するVerrazzanoシステム・コンポーネントを示します。
| コンポーネント | 宛先 | 説明 | 
|---|---|---|
| argoCD | Git Webフック(GitHub、GitLab、Bitbucket) | Gitリポジトリに接続するためのGit WebフックへのArgo CD接続。 | 
| cert-manager | Let’s Encrypt | 署名付き証明書を取得します。 | 
| ExternalDNS | 外部DNS | 外部DNSにDNSエントリを作成および削除します。 | 
| Fluentd | OpenSearch | 管理対象クラスタのFluentdは、管理クラスタのOpenSearchをコールします。 | 
| Prometheus | Prometheus | 管理クラスタのPrometheusは、管理対象クラスタのPrometheusからメトリックをスクレイピングします。 | 
| Rancherエージェント | Rancher | 管理対象クラスタのRancherエージェントは、管理クラスタのRancherにリクエストを送信します。 | 
| Verrazzano認証プロキシ | Keycloak | リダイレクトを含む認証のためにKeycloakをコールします。 | 
| Verrazzanoプラットフォーム・オペレータ | Kubernetes APIサーバー | 管理対象クラスタのマルチクラスタ・エージェントは、管理クラスタのAPIサーバーをコールします。 | 
次の表に、クラスタ内の宛先にトラフィックを送信するVerrazzanoシステム・コンポーネントを示します。ただし、次の例外があります:
| コンポーネント | 宛先 | 説明 | 
|---|---|---|
| argoCD | Kubernetes APIサーバー | Kubernetesリソースに対するCRUD操作を実行します。 | 
| cert-manager | Kubernetes APIサーバー | Kubernetesリソースに対するCRUD操作を実行します。 | 
| Fluentd | OpenSearch | FluentdはOpenSearchにデータを送信します。 | 
| Grafana | Prometheus | Prometheusデータのコンソール。 | 
| OpenSearchダッシュボード | OpenSearch | OpenSearchのコンソール。 | 
| NGINX Ingress Controller | Kubernetes APIサーバー | Kubernetesリソースに対するCRUD操作を実行します。 | 
| Istio | Kubernetes APIサーバー | Kubernetesリソースに対するCRUD操作を実行します。 | 
| Rancher | Kubernetes APIサーバー | Kubernetesリソースに対するCRUD操作を実行します。 | 
| Verrazzano認証プロキシ | Keycloak | トークン認証のためにKeycloakをコールします。 | 
| Verrazzano認証プロキシ | VMIコンポーネント | OpenSearchダッシュボード、Grafanaなどのコンソールにアクセスします。 | 
| Verrazzano認証プロキシ | Kubernetes APIサーバー | Kubernetesリソースに対するCRUD操作を実行します。 | 
| Verrazzanoアプリケーション・オペレータ | Kubernetes APIサーバー | Kubernetesリソースに対するCRUD操作を実行します。 | 
| Verrazzanoモニタリング・オペレータ | Kubernetes APIサーバー | Kubernetesリソースに対するCRUD操作を実行します。 | 
| Verrazzanoオペレータ | Kubernetes APIサーバー | Kubernetesリソースに対するCRUD操作を実行します。 | 
| Verrazzanoプラットフォーム・オペレータ | Kubernetes APIサーバー | Kubernetesリソースに対するCRUD操作を実行します。 | 
| Verrazzanoプラットフォーム・オペレータ | Rancher | 管理対象クラスタをRancherに登録します。 | 
この表は、各システム・コンポーネント・スクレイピング・ターゲットのPrometheusトラフィックを示しています。
| ターゲット | 説明 | 
|---|---|
| argoCD | Envoyメトリック | 
| cadvisor | Kubernetesメトリック | 
| Grafana | Envoyメトリック | 
| Istiod | Istioコントロール・プレーン・メトリック | 
| Istiod | Envoyメトリック | 
| Istioエグレス・ゲートウェイ | Envoyメトリック | 
| Istioイングレス・ゲートウェイ | Envoyメトリック | 
| Keycloak | Envoyメトリック | 
| MySQL | Envoyメトリック | 
| NGINX Ingress Controller | Envoyメトリック | 
| NGINX Ingress Controller | NGINXメトリック | 
| NGINXデフォルト・バック・エンド | Envoyメトリック | 
| ノード・エクスポータ | ノード・メトリック | 
| OpenSearch | Envoyメトリック | 
| OpenSearchダッシュボード | Envoyメトリック | 
| Prometheus | Envoyメトリック | 
| Prometheus | Prometheusメトリック | 
| Verrazzanoコンソール | Envoyメトリック | 
| Verrazzano API | Envoyメトリック | 
| WebLogicオペレータ | Envoyメトリック | 
システム・コンポーネントのいくつかはコントローラで、一部はWebフックです。Webフックは、コンポーネントHTTPSポートでKubernetes APIサーバーによってコールされ、APIペイロードがAPIサーバーに到達する前に検証または変更されます。
次のコンポーネントはWebフックを使用します:
アプリケーション・トラフィックには、Verrazzanoアプリケーションとの間のすべてのトラフィックが含まれます。
Verrazzanoのインストール後に、アプリケーションをIstioメッシュにデプロイできます。その際、アプリケーションへのイングレスが必要になる可能性があります。前述したように、これはGatewayおよびVirtualServiceリソースを使用してIstioで実行できます。ApplicationConfigurationでIngressTraitを使用すると、Verrazzanoによってこれらのリソースが作成されます。インストール中に作成されたIstioイングレス・ゲートウェイは、メッシュ内のすべてのアプリケーションによって共有され、Gatewayリソースは、インストール中に作成されたIstioイングレス・ゲートウェイにバインドされます。これは、Gatewayのセレクタ・フィールドによって行われます
   selector:
     istio: ingressgateway
Verrazzanoは、IngressTraitごとにGateway/VirtualServiceペアを作成します。次に、Verrazzanoによって作成されるこの2つのリソースの例を示します。
Gatewayを次に示します。ここでは、ホスト名と証明書はどちらもVerrazzanoによって生成されます。
apiVersion: v1
items:
- apiVersion: networking.istio.io/v1beta1
  kind: Gateway
  metadata:
   ...
    name: hello-helidon-hello-helidon-gw
    namespace: hello-helidon
  ...
  spec:
    selector:
      istio: ingressgateway
    servers:
    - hosts:
      - hello-helidon-appconf.hello-helidon.1.2.3.4.nip.io
      port:
        name: HTTPS
        number: 443
        protocol: HTTPS
      tls:
        credentialName: hello-helidon-hello-helidon-appconf-cert-secret
        mode: SIMPLE
VirtualServiceを次に示します。Gatewayを参照し、サービス・ルーティング情報が含まれることに注意してください。
apiVersion: v1
items:
- apiVersion: networking.istio.io/v1beta1
  kind: VirtualService
  metadata:
  ...
    name: hello-helidon-ingress-rule-0-vs
    namespace: hello-helidon
  spec:
    gateways:
    - hello-helidon-hello-helidon-gw
    hosts:
    - hello-helidon-appconf.hello-helidon.1.2.3.4.nip.io
    HTTP:
    - match:
      - uri:
          prefix: /greet
      route:
      - destination:
          host: hello-helidon
          port:
            number: 8080
東西トラフィックを管理するには、メッシュ内の各サービスをVirtualServiceおよびオプションのDestinationRuleを使用してルーティングする必要があります。これらのリソースなしでも東西トラフィックを送信できますが、カスタム・ルーティングやロード・バランシングは行われません。Verrazzanoは東西トラフィックを構成しません。Bob’s Booksの例のbobs-books-comp.yamlのbobbys-front-endについて考えてみます。Bob’s Booksをデプロイすると、IngressTraitのためbobbys-front-endに対してVirtualServiceが作成されますが、アプリケーションの他のサービスにはVirtualServicesはありません。bobbys-front-endがbobbys-helidon-stock-applicationにリクエストを送信する場合、この東西トラフィックは、ソースPodと宛先PodのEnvoyサイドカー・プロキシを介してbobbys-helidon-stock-applicationに送信されますが、カナリア・デプロイメントまたはカスタム・ロード・バランシングを指定できるbobbys-helidon-stock-applicationを表すVirtualServiceはありません。これは手動で設定できるものですが、Verrazzanoでは構成されません。
Verrazzanoはネットワーク・プロキシを複数の場所で使用します。2つのプロキシ製品はEnvoyおよびNGINXです。次の表に、どのプロキシが使用され、どのPodで実行されるかを示します。
| 使用方法 | プロキシ | Pod | ネームスペース | 説明 | 
|---|---|---|---|---|
| システム・イングレス | NGINX | ingress-controller-ingress-nginx-controller-* | ingress-nginx | Verrazzanoシステム・コンポーネントへの外部アクセスを提供します。 | 
| Verrazzano認証プロキシ | NGINX | verrazzano-authproxy-* | verrazzano-system | Kubernetes APIおよびシングル・サインオン(SSO)用のVerrazzano認証プロキシ・サーバー。 | 
| アプリケーション・イングレス | Envoy | istio-ingressgateway-* | istio-system | Verrazzanoアプリケーションへの外部アクセスを提供します。 | 
| アプリケーション・エグレス | Envoy | istio-egressgateway-* | istio-system | アプリケーション・エグレス・トラフィックの制御を提供します。 | 
| Istioメッシュ・サイドカー | Envoy | ingress-controller-ingress-nginx-controller-* | ingress-nginx | Istioメッシュ内のNGINX Ingress Controller。 | 
| Istioメッシュ・サイドカー | Envoy | ingress-controller-ingress-nginx-defaultbackend-* | ingress-nginx | Istioメッシュ内のNGINXデフォルト・バックエンド。 | 
| Istioメッシュ・サイドカー | Envoy | fluentd-* | verrazzano-system | Istioメッシュ内のFluentd。 | 
| Istioメッシュ・サイドカー | Envoy | keycloak-* | keycloak | Istioメッシュ内のKeycloak。 | 
| Istioメッシュ・サイドカー | Envoy | mysql-* | keycloak | Istioメッシュ内のKeycloakが使用するMySQL。 | 
| Istioメッシュ・サイドカー | Envoy | verrazzano-api-* | verrazzano-system | Istioメッシュ内のVerrazzano API。 | 
| Istioメッシュ・サイドカー | Envoy | verrazzano-console-* | verrazzano-system | Istioメッシュ内のVerrazzanoコンソール。 | 
| Istioメッシュ・サイドカー | Envoy | vmi-system-es-master-* | verrazzano-system | Istioメッシュ内のOpenSearch。 | 
| Istioメッシュ・サイドカー | Envoy | vmi-system-es-data-* | verrazzano-system | Istioメッシュ内のOpenSearch。 | 
| Istioメッシュ・サイドカー | Envoy | vmi-system-es-ingest-* | verrazzano-system | Istioメッシュ内のOpenSearch。 | 
| Istioメッシュ・サイドカー | Envoy | vmi-system-kibana-* | verrazzano-system | Istioメッシュ内のOpenSearchダッシュボード。 | 
| Istioメッシュ・サイドカー | Envoy | vmi-system-grafana-* | verrazzano-system | Istioメッシュ内のGrafana。 | 
| Istioメッシュ・サイドカー | Envoy | weblogic-operator-* | verrazzano-system | Istioメッシュ内のWebLogic Kubernetesオペレータ。 | 
| Istioメッシュ・サイドカー | Envoy | prometheus-prometheus-operator-kube-p-prometheus-* | verrazzano-monitoring | Istioメッシュ内のPrometheus。 | 
一部のVerrazzanoコンポーネントは、Kubernetesクラスタ間でトラフィックを送信します。これらのコンポーネントは、Verrazzanoエージェント、Verrazzano認証プロキシおよびPrometheusです。
次の表に、管理クラスタと管理対象クラスタの間のリクエストを開始するVerrazzanoシステム・コンポーネントを示します。これらのリクエストはすべて、それぞれの宛先クラスタのNGINX Ingress Controllerを経由します。
ポート443のトラフィックは、管理対象クラスタから管理クラスタと、管理クラスタから管理対象クラスタへの両方向で許可する必要があります。また、管理クラスタでRancherが有効になっていない場合、管理対象クラスタは管理クラスタのKubernetes APIサーバー・ポート(通常はポート6443)にアクセスする必要もあります。
| ソース・クラスタ | ソース・コンポーネント | 宛先クラスタ | 宛先コンポーネント | 説明 | 
|---|---|---|---|---|
| 管理 | Prometheus | 管理対象 | Prometheus | 管理対象クラスタでメトリックをスクレイピングします。 | 
| 管理 | argoCD | 管理対象 | Rancherプロキシ | Argo CDは、Argo CDの管理対象クラスタ登録に必要なリソースを作成するために、Rancherプロキシに接続します。 | 
| 管理 | Verrazzanoコンソール | 管理対象 | Verrazzano認証プロキシ | 管理クラスタ・プロキシは、Kubernetes APIリクエストを管理対象クラスタ・プロキシに送信します。 | 
| 管理 | Verrazzanoクラスタ・オペレータ | 管理対象 | Rancherプロキシ | 管理クラスタは、登録の更新を管理対象クラスタに送信し、管理対象クラスタのCA証明書を取得します。 | 
| 管理対象 | Fluentd | 管理 | OpenSearch | FluentdはログをOpenSearchに送信します。 | 
| 管理対象 | Rancherエージェント | 管理 | Rancher | RancherエージェントはRancherにリクエストを送信します。 | 
| 管理対象 | Verrazzano認証プロキシ | 管理 | Keycloak | プロキシはKeycloakにリクエストを送信します。 | 
| 管理対象 | Verrazzanoエージェント | 管理 | RancherプロキシまたはKubernetes APIサーバー | 管理対象クラスタ・エージェントは、アプリケーション・オペレータで、Rancherプロキシ(Rancherが有効な場合)または管理クラスタのKubernetes APIサーバーにリクエストを送信します。 | 
マルチクラスタ・トポロジでは、Verrazzanoプラットフォーム・オペレータには、管理クラスタのKubernetes APIサーバーにリクエストを送信する、管理対象クラスタで実行されているエージェント・スレッドがあります。管理クラスタのKubernetes APIサーバーのURLは、ユーザーによって管理対象クラスタに登録されます。
マルチクラスタ・トポロジでは、Verrazzano認証プロキシは管理クラスタと管理対象クラスタの両方で実行されます。管理クラスタでは、認証プロキシはKeycloakサービスを使用して、クラスタ内のKeycloakに接続します。管理対象クラスタでは、認証プロキシは、管理クラスタで実行されているNGINX Ingress Controllerを介して管理クラスタのKeycloakに接続します。
シングル・サインオン(SSO)の場合、認証プロキシは、クラスタ内またはクラスタ・イングレスを介して、Keycloakにリクエストを送信する必要もあります。リクエストが認証ヘッダーなしで認証プロキシに入ると、プロキシはNGINX Ingress Controllerを介してKeycloakにリクエストを送信し、リクエストはクラスタから退出します。それ以外の場合は、認証プロキシが管理クラスタ上にある場合、リクエストはクラスタ内のKeycloakに直接送信されます。認証プロキシが管理対象クラスタ上にある場合は、管理クラスタのKeycloakにリクエストを送信する必要があります。
クラスタ内の単一のPrometheusサービスは、システム・コンポーネントとアプリケーションのPodからメトリックをスクレイピングします。HTTPSを使用したIstioメッシュ内のPodのスクレイピング、およびHTTPを使用したメッシュ外のPodのスクレイピングも行います。マルチクラスタの場合、管理クラスタのPrometheusは、管理対象クラスタのNGINX Ingress Controllerを介して、管理対象クラスタのPrometheusからメトリックをスクレイピングします。
Verrazzanoシステムおよびアプリケーション・エンドポイントのDNS構成のカスタマイズ
Verrazzano管理およびアプリケーション・エンドポイントの外部ロード・バランサ
Verrazzano NGINXおよびIstioイングレス設定のカスタマイズ
Verrazzanoシステムおよびアプリケーション・エンドポイントのOCIでのロード・バランサのカスタマイズ