Alibaba Cloud Container Service コンソールは、Ingress サービスと連携しています。これにより、Container Service コンソールで素早く Ingress サービスを作成して、柔軟で信頼性の高いトラフィックアクセス層を構築できます。

前提条件

手順 1 : デプロイメントとサービスの作成

  1. Container Service コンソール にログインします。
  2. Container Service-Kubernetes の左側のナビゲーションウィンドウで、[アプリケーション] > [デプロイメント] をクリックします。
  3. 右上隅の [テンプレートによる作成] をクリックします。
  4. [クラスター] および [名前空間] ドロップダウンリストから、クラスターおよび名前空間を選択します。 サンプルテンプレートを選択するか、[リソースタイプ] ドロップダウンリストから [カスタム] を選択します。 [デプロイ] をクリックします。
    この例では、3 つの Nginx アプリケーションを作成します。 旧アプリケーション (old-nginx)、新アプリケーション (new-nginx)、クラスターからドメイン名へのアクセステスト用のアプリケーション (domain-nginx) です。
    "old-nginx" のオーケストレーションテンプレートを以下に示します。
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: old-nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          run: old-nginx
      template:
        metadata:
          labels:
            run: old-nginx
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/xianlu/old-nginx
            imagePullPolicy: Always
            name: old-nginx
            ports:
            - containerPort: 80
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: old-nginx
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: old-nginx
      sessionAffinity: None
      type: NodePort
    "new-nginx" のオーケストレーションテンプレートを以下に示します。
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: new-nginx
    spec: 
      replicas: 1
      selector:
        matchLabels:
          run: new-nginx
      template:
        metadata:
          labels:
            run: new-nginx
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx
            imagePullPolicy: Always
            name: new-nginx
            ports:
            - containerPort: 80
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: new-nginx
    spec: 
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: new-nginx
      sessionAffinity: None
      type: NodePort
    "domain-nginx" のオーケストレーションテンプレートを以下に示します。
    apiVersion: apps/v1beta2 # For versions before 1.8.0 use apps/v1beta1
    kind: Deployment
    metadata:
      name: domain-nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9 # replace it with your exactly <image_name:tags>
            ports:
            - containerPort: 80
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: domain-nginx
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      sessionAffinity: None
      type: NodePort
  5. Container Service-Kubernetes の左側のナビゲーションウィンドウで、 [ディスカバリとロードバランシング] > [サービス] を選択します。
    サービスの作成後、[サービスリスト] ページで、サービスを確認できます。

手順 2:Ingress の作成

  1. Container Service コンソール にログインします。
  2. Container Service-Kubernetes の左側のナビゲーションウィンドウで、 [ディスカバリとロードバランシング] > [Ingress] を選択します。
  3. [クラスター] および [名前空間] ドロップダウンリストから、クラスターおよび名前空間を選択します。 右上隅の [作成する] をクリックします。
  4. 表示されたダイアログボックスで、Ingress の名前を入力します。 この例では、"nginx-ingress" と入力します。
  5. ルールを設定します。

    Ingress ルールは、クラスターへのインバウンドアクセスを許可するルールで、一般的に HTTP ルールです。 ドメイン名 (仮想ホスト名)、URL パス、サービス名、およびポートを設定します。 詳細は、「Ingress の設定」をご参照ください。

    この例では、複雑な Ingress ルールを追加します。 クラスターのデフォルトのテストドメイン名と仮想ホスト名を設定して、ドメイン名に基づく Ingress サービスを表示します。
    • デフォルトのドメイン名に基づくシンプルな Ingress、つまり、クラスターのデフォルトのドメイン名を使用して、アクセスサービスを外部に提供します。
      • ドメイン: クラスターのデフォルトのドメイン名を入力します。 この例では、test.[cluster-id].[region-id].alicontainer.com を使用します。

        このクラスターのデフォルトのドメイン名は [作成] ダイアログボックスに表示されます (*.[cluster-id].[region-id].alicontainer.com 形式)。 クラスターの [基本情報] ページで、デフォルトのドメイン名を取得することもできます。

      • サービス: サービスのアクセスパス、名前、ポートを設定します。
        • パス: サービスがアクセスする URL パスを指定します。 デフォルトはルートパス / です。この例では、設定されていません。 それぞれのパスは、バックエンドサービスに関連付けられます。 Alibaba Cloud Server Load Balancer がトラフィックをバックエンドに転送する前、すべてのインバウンドリクエストがドメイン名とパスに一致している必要があります。
        • サービス設定: バックエンドの設定で、サービス名、ポート、サービスの重みの組み合わせです。 同一のアクセスパス上の複数のサービスの設定がサポートされます。Ingress トラフィックは分割され、一致するバックエンドサービスに転送されます。
    • シンプルなファンアウト Ingress はドメイン名に基づいています。 この例では、テストドメイン名として仮想ホスト名を使用して、アクセスサービスを外部に提供しています。 本番環境で記録されたドメイン名を使用して、アクセスサービスを提供することができます。
      • ドメイン: この例では、テストドメイン名 foo.bar.com を使用します。

        "hosts" ファイルを変更して、ドメイン名マッピングルールを追加する必要があります。

        118.178.108.143 foo.bar.com #  Ingress IP address
      • サービス: サービスのアクセスパス、名前、ポートを設定します。
        • パス: サービスがアクセスする URL パスを指定します。 この例では、パスを設定していません。ルートパスは / です。
        • 名前: この例では、新サービスに "nginx-new"、旧サービスに "nginx-old" を設定します。
        • Port: 80 番ポートを開放します。
        • 重み設定: このパスにある複数のサービスの重みを設定します。 サービスの重みは、相対値により算出されます。 デフォルト値は 100 です。 この例では、旧バージョン、新バージョンのサービスの重みはともに 50 です。これはサービスの重みの割合が、どちらも 50% であることを意味します。
  6. グレースケール公開を設定します。
    現在、Alibaba Cloud Container Service Kubernetes Ingress コントローラーは、トラフィックセグメンテーション機能のサポートのため、0.12.0-5 以上が必要です。
    Container Service では、グレースケール公開および AB テストシナリオ用にさまざまなトラフィックセグメンテーション方法をサポートしています。
    1. リクエストヘッダーに基づくトラフィックセグメンテーション
    2. Cookie に基づくトラフィックセグメンテーション
    3. クエリ (リクエスト) パラメーターに基づくトラフィックセグメンテーション

    グレースケールルールの設定後、グレースケール公開ルールと一致するリクエストは、新バージョンのサービス "new-nginx" へルーティングされます。 重みの割合が 100% 未満に設定された場合、グレースケール公開ルールに一致するリクエストは、重みの割合に基づくサービスに引き続きルーティングされます。

    この場合、リクエストヘッダーが foo=^bar$ のグレースケール公開ルールに一致するように設定します。リクエストヘッダーを含むリクエストのみ、"new-nginx" サービスにアクセスできます。

    • サービス: ルーティングルール設定サービスです。
    • タイプ: 一致するリクエストヘッダー、Cookie、クエリ (リクエスト) パラメーターがサポートされます。
    • 名前および一致する値:ユーザー定義のリクエストフィールド、名前、一致する値は、キーと値のペアです。
    • 一致ルール: 正規表現一致と完全一致がサポートされます。
  7. アノテーションを設定します。
    [リライトアノテーション] をクリックすると、ルートに典型的なリダイレクトアノテーションが追加されます。nginx.ingress.kubernetes.io/rewrite-target:/ は、/path がバックエンドサービスで認識可能なルートパス / にリダイレクトされることを示します。
    この例では、アクセスパスを設定していません。そのため、リライトアノテーションの設定は必要ありません。 リライトアノテーションの目的は、Ingress をルートパスとしてバックエンドへ転送できるようにし、不正確なアクセスパスの設定により 404 エラーが発生することを回避することです。
    [追加] をクリックして、アノテーションの名前と値を入力することもできます。これは、Ingress 用のアノテーションのキーと値のペアです。 詳しくは、「https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/」 をご参照ください。
  8. TLS を設定します。 [有効化] チェックボックスをオンにし、セキュリティ保護された Ingress サービスを設定します。 詳細は、「安全なルーティングサービスの設定」をご参照ください。
    • 既存のシークレットも使用できます。
      1. マスターノードにログインし、tls.keytls.crt を作成します。
        openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"
      2. シークレットを作成します。
        kubectl create secret tls foo.bar --key tls.key --cert tls.crt
      3. kubectl get secret コマンドを実行して、シークレットの作成が成功したかどうかを確認します。 Web インターフェイス foo.bar で作成したシークレットを使用できます。
    • 作成した TLS 秘密鍵と証明書により、シークレットをワンクリックで作成できます。
      1. マスターノードにログインし、tls.keytls.crt を作成します。
        openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"
      2. vim tls.key コマンドと vim tls.crt コマンドを実行して、生成された秘密鍵と証明書を取得します。
      3. 生成された証明書と秘密鍵を "Cert" フィールドと "Key" フィールドにそれぞれコピーします。
  9. タグを追加します。
    Ingress のタグを追加して、Ingress の特性を示します。
  10. [作成] をクリックします。
    [Ingress] ページに Ingress "nginx-ingress" が表示されます。
  11. ルートのアクセスドメイン名 test.[cluster-id].[region-id].alicontainer.comfoo.bar.com をクリックして、nginx のウェルカムページにアクセスします。
    "new-nginx" サービスを指すルートアドレスをクリックし、"old-nginx" アプリケーションを指すページを検索します。
    ブラウザからルートアドレスにアクセスします。 デフォルトでは、リクエストヘッダーに foo=^bar$ がないため、トラフィックは "old-nginx" アプリケーションへ送信されます。
  12. マスターノードに SSH ログインします。 以下のコマンドを実行して、指定したリクエストヘッダーを持つアクセス結果をシミュレートします。
    curl -H "Host: foo.bar.com" http://47.107.20.35
    old
     curl -H "Host: foo.bar.com" http://47.107.20.35
    old
     curl -H "Host: foo.bar.com" http://47.107.20.35 # Similar to browser access requests
    old
     curl -H "Host: foo.bar.com" -H "foo: bar" http://47.107.20.35 # Simulate an access request with a unique header, returning results based on routing weight
    new
     curl -H "Host: foo.bar.com" -H "foo: bar" http://47.107.20.35
    old
     curl -H "Host: foo.bar.com" -H "foo: bar" http://47.107.20.35
    old
     curl -H "Host: foo.bar.com" -H "foo: bar" http://47.107.20.35
    new