第1章 ゲートウェイについて


ゲートウェイは、スタンドアロンの Envoy プロキシーデプロイメントと、サービスメッシュのエッジで動作する関連する Kubernetes サービスです。ゲートウェイを設定すると、メッシュに出入りするトラフィックをきめ細かく制御できます。Red Hat OpenShift Service Mesh では、ゲートウェイインジェクションを使用してゲートウェイをインストールします。

1.1. ゲートウェイインジェクションについて

ゲートウェイインジェクションは、サイドカーインジェクションと同じメカニズムを利用して、Envoy プロキシーをゲートウェイ Pod に注入します。ゲートウェイインジェクションを使用してゲートウェイをインストールするには、Istio コントロールプレーンに表示される namespace に Kubernetes Deployment オブジェクトと関連する Kubernetes Service オブジェクトを作成します。Deployment オブジェクトを作成するときに、Istio コントロールプレーンがプロキシーを注入し、プロキシーがゲートウェイとして設定されるように、オブジェクトにラベルおよびアノテーションを付けます。ゲートウェイをインストールしたら、Istio GatewayVirtualService リソースを使用して、Ingress と Egress トラフィックを制御するようにゲートウェイを設定します。

1.1.1. ゲートウェイインジェクションを使用したゲートウェイのインストール

この手順では、ゲートウェイインジェクションを使用してゲートウェイをインストールする方法を説明します。

注記

この手順を使用して、Ingress または Egress ゲートウェイを作成できます。

前提条件

  • OpenShift Service Mesh Operator バージョン 3.0 以降がインストールされている。
  • Istio コントロールプレーンを作成している。
  • IstioCNI リソースを作成している。

手順

  1. ゲートウェイのインストールに使用する namespace を作成します。

    $ oc create namespace <gateway_namespace>
    注記

    ゲートウェイと Istio コントロールプレーンを異なる namespace にインストールします。

    ゲートウェイを専用のゲートウェイ namespace にインストールできます。このアプローチにより、異なる namespace で動作する多くのアプリケーションでゲートウェイを共有できるようになります。または、ゲートウェイをアプリケーション namespace にインストールすることもできます。このアプローチでは、ゲートウェイはその namespace 内のアプリケーション専用のゲートウェイとして機能します。

  2. ゲートウェイデプロイメントのサービスアカウント、ロール、およびロールバインディングを定義する secret-reader.yml という名前の YAML ファイルを作成します。これらの設定により、ゲートウェイは TLS 認証情報を取得するために必要なシークレットを読み取ることができます。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: secret-reader
      namespace: <gateway_namespace>
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: secret-reader
      namespace: <gateway_namespace>
    rules:
      - apiGroups: [""]
        resources: ["secrets"]
        verbs: ["get", "watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name:  secret-reader
      namespace: <gateway_namespace>
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: secret-reader
    subjects:
      - kind: ServiceAccount
        name:  secret-reader
  3. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f secret-reader.yml
  4. ゲートウェイの Kubernetes Deployment オブジェクトを定義する、gateway-deployment.yml という名前の YAML ファイルを作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      selector:
        matchLabels:
          istio: <gateway_name>
      template:
        metadata:
          annotations:
            inject.istio.io/templates: gateway 1
          labels:
            istio: <gateway_name> 2
            sidecar.istio.io/inject: "true" 3
        spec:
          containers:
            - name: istio-proxy
              image: auto 4
              securityContext:
                capabilities:
                  drop:
                  - ALL
                allowPrivilegeEscalation: false
                privileged: false
                readOnlyRootFilesystem: true
                runAsNonRoot: true
              ports:
              - containerPort: 15090
                protocol: TCP
                name: http-envoy-prom
              resources:
                limits:
                  cpu: 2000m
                  memory: 1024Mi
                requests:
                  cpu: 100m
                  memory: 128Mi
          securityContext:
            sysctls:
            - name: net.ipv4.ip_unprivileged_port_start
              value: "0"
          serviceAccountName: secret-reader 5
    1
    Istio コントロールプレーンがデフォルトのサイドカーテンプレートではなく、ゲートウェイインジェクションテンプレートを使用することを示します。
    2
    ゲートウェイのデプロイメントに一意のラベルが設定されていることを確認します。Istio Gateway リソースがゲートウェイワークロードを選択できるようにするには、一意のラベルが必要です。
    3
    sidecar.istio.io/inject ラベルを true に設定して、ゲートウェイインジェクションを有効にします。Istio リソースの名前が default でない場合は、代わりに istio.io/rev: <istio_revision> ラベルを使用する必要があります。ここで、リビジョンは Istio リソースのアクティブなリビジョンを表します。
    4
    Pod が起動するたびにイメージが自動的に更新されるように、イメージフィールドを auto に設定します。
    5
    serviceAccountName を、以前作成した ServiceAccount の名前に設定します。
  5. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f gateway-deployment.yml
  6. 次のコマンドを実行して、ゲートウェイ Deployment ロールアウトが正常に行れたことを確認します。

    $ oc rollout status deployment/<gateway_name> -n <gateway_namespace>

    以下のような出力が表示されるはずです。

    出力例

    Waiting for deployment "<gateway_name>" rollout to finish: 0 of 1 updated replicas are available...
    deployment "<gateway_name>" successfully rolled out

  7. ゲートウェイの Kubernetes Service オブジェクトを含む、gateway-service.yml という名前の YAML ファイルを作成します。

    apiVersion: v1
    kind: Service
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      type: ClusterIP 1
      selector:
        istio: <gateway_name> 2
      ports:
        - name: status-port
          port: 15021
          protocol: TCP
          targetPort: 15021
        - name: http2
          port: 80
          protocol: TCP
          targetPort: 80
        - name: https
          port: 443
          protocol: TCP
          targetPort: 443
    1
    spec.typeClusterIP に設定すると、ゲートウェイ Service オブジェクトにはクラスター内からのみアクセスできるようになります。ゲートウェイがクラスター外部からの Ingress トラフィックを処理する必要がある場合は、spec.typeLoadBalancer に設定します。または、OpenShift Routes を使用することもできます。
    2
    selector を、以前作成したゲートウェイデプロイメントの Pod テンプレートで指定された一意のラベルまたはラベルセットに設定します。
  8. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f gateway-service.yml
  9. 次のコマンドを実行して、ゲートウェイサービスがゲートウェイ Pod のエンドポイントをターゲットにしていることを確認します。

    $ oc get endpoints <gateway_name> -n <gateway_namespace>

    次の例のような出力が表示されるはずです。

    出力例

    NAME              ENDPOINTS                             AGE
    <gateway_name>    10.131.0.181:8080,10.131.0.181:8443   1m

  10. オプション: ゲートウェイの Horizontal Pod Autoscaler を定義する、gateway-hpa.yml という名前の YAML ファイルを作成します。次の例では、最小レプリカを 2 に、最大レプリカを 5 に設定し、平均 CPU 使用率が CPU リソース制限の 80% を超えたときにレプリカをスケールアップします。この制限は、ゲートウェイのデプロイメントの Pod テンプレートで指定されます。

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      minReplicas: 2
      maxReplicas: 5
      metrics:
      - resource:
          name: cpu
          target:
            averageUtilization: 80
            type: Utilization
        type: Resource
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: <gateway_name> 1
    1
    spec.scaleTargetRef.name を、以前作成したゲートウェイデプロイメントの名前に設定します。
  11. オプション: 次のコマンドを実行して YAML ファイルを適用します。

    $ oc apply -f gateway-hpa.yml
  12. オプション: ゲートウェイの Pod Disruption Budget を定義する、gateway-pdb.yml という名前の YAML ファイルを作成します。次の例では、ゲートウェイ Pod のエビクション後も、クラスター上に少なくとも 1 つの正常なゲートウェイ Pod が残る場合にのみ、ゲートウェイ Pod のエビクションが許可されます。

    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          istio: <gateway_name> 1
    1
    spec.selector.matchLabels を、以前作成したゲートウェイデプロイメントの Pod テンプレートで指定された一意のラベルまたはラベルセットに設定します。
  13. オプション: 次のコマンドを実行して YAML ファイルを適用します。

    $ oc apply -f gateway-pdb.yml
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.