デフォルトでは、ACK クラスター内のサービスは外部ネットワークから分離されています。ALB Ingress は、Application Load Balancer (ALB) を外部トラフィックのエントリポイントとして使用することで、これらのサービスを公開します。ALB は、ドメインベースのルーティング、セキュリティ、および高可用性を提供します。
仕組み
|
|
サービスタイプの制限事項
Flannel ネットワークプラグインを使用する場合、ALB Ingress のバックエンドサービスは NodePort および LoadBalancer タイプに制限されます。
ALB Ingress Controller のインストール
クラスター作成時
-
ACK コンソールにログインし、Kubernetes クラスターの作成 をクリックします。
-
コンポーネント設定 ステップで、Ingress セクションに移動し、ALB Ingress を選択します。
-
この例では、[新規作成] オプションを使用します。画面の指示に従ってクラスターを作成します。
ALB Application Load Balancer インスタンス
説明
新しく作成する
ALB インスタンス、AlbConfig、および IngressClass を自動的に作成します。
-
ALB インスタンス:クラスターの VPC 内に標準の従量課金制のパブリックまたはプライベート ALB インスタンスを自動的に作成し、
HTTP:80リスナーを設定します。 -
AlbConfig と IngressClass:クラスター内に対応する AlbConfig と IngressClass リソースを自動的に作成し、ALB インスタンスに関連付けます。
既存を使用
このオプションは、クラスターが既存の Virtual Private Cloud (VPC) を使用するように設定されている場合にのみ利用可能です。
既存の ALB インスタンスを使用し、AlbConfig と IngressClass を自動的に作成します。指定された ALB インスタンスは、Standard または WAF-enhanced エディションであり、クラスターと同じ VPC 内にあり、別のクラスターに関連付けられていない必要があります。
今は作成しない
ALB Ingress Controller コンポーネントのみをインストールします。後で 手動で AlbConfig と IngressClass を作成する必要があります。これは、ALB インスタンスの設定をカスタマイズする必要があるシナリオに適しています。
-
既存のクラスターの場合
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[コンポーネントとアドオン] をクリックします。
-
検索ボックスを使用するか、ネットワーク タブをクリックしてコンポーネントを見つけます。[ALB Ingress Controller] コンポーネントカードの右下隅にある インストール をクリックします。
-
この例では、[新規作成] オプションを使用します。OK をクリックします。
ALB Application Load Balancer インスタンス
説明
新しく作成する
ALB インスタンス、AlbConfig、および IngressClass を自動的に作成します。
-
ALB インスタンス:クラスターの VPC 内に標準の従量課金制のパブリックまたはプライベート ALB インスタンスを自動的に作成し、
HTTP:80リスナーを設定します。 -
AlbConfig と IngressClass:クラスター内に対応する AlbConfig と IngressClass リソースを自動的に作成し、ALB インスタンスに関連付けます。
既存のものを使用する
既存の ALB インスタンスを使用し、AlbConfig と IngressClass を自動的に作成します。指定された ALB インスタンスは、Standard または WAF-enhanced エディションであり、クラスターと同じ VPC 内にあり、別のクラスターに関連付けられていない必要があります。
今は作成しない
ALB Ingress Controller コンポーネントのみをインストールします。後で 手動で AlbConfig と IngressClass を作成する必要があります。これは、ALB インスタンスの設定をカスタマイズする必要があるシナリオに適しています。
-
サンプルアプリケーションの作成
このサンプルアプリケーションは、coffee という名前の Deployment と、coffee-svc という名前の対応する Service をデプロイします。
コンソール
-
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
YAML のリソースの作成 をクリックします。サンプルテンプレート ドロップダウンリストから カスタム を選択します。次に、以下の内容をテンプレートエディターにコピーし、デプロイ をクリックします。
-
確認ダイアログボックスで ビュー をクリックし、Pod のステータスが
Runningであることを確認します。
kubectl
-
次の内容を含む
coffee-deployment-service.yamlという名前のファイルを作成します。 -
サンプルアプリケーションの Deployment と Service を作成します。
kubectl apply -f coffee-deployment-service.yaml -
Pod のステータスが
Runningであることを確認します。kubectl get pod -l app=coffee期待される出力:
NAME READY STATUS RESTARTS AGE coffee-84bd6*****-***** 1/1 Running 0 4m22s coffee-84bd6*****-***** 1/1 Running 0 4m22s
ALB Ingress の作成
ALB Ingress のドメイン名とパスマッピングを設定して、ingress-demo.com/coffee へのリクエストをクラスター内の coffee-svc Service にルーティングします。
ACK 専用クラスターで ALB Ingress を使用するには、ALB Ingress Controller にアクセス権限を付与する必要があります。
コンソール
-
左側のナビゲーションウィンドウで、 を選択します。
default名前空間を選択し、Ingress の作成 をクリックします。 -
次の Ingress パラメーターを指定し、OK をクリックします。
-
名前:
coffee-ingress -
ドメイン名:
ingress-demo.com -
マッピング:パス:
/coffee、一致ルール:Prefix、サービス名:coffee-svc、ポート:80。マッチングルール (pathType)
説明
Prefix
リクエストパスのプレフィックスに基づいて一致します。たとえば、
/coffee/1または/coffee/buy/1へのリクエストは一致しますが、/cofまたは/coffeebuy/1へのリクエストは一致しません。Exact
リクエストパスと完全に一致します。
/coffeeへのリクエストのみが一致します。ImplementationSpecific
マッチング動作は Ingress Controller の実装に依存します。ALB Ingress Controller の場合、このタイプは完全一致と同等です。
-
-
エンドポイント アドレスを取得します。
ALB Ingress が有効になるまで約 10 秒かかります。更新ボタンをクリックしてエンドポイント情報を取得できます。エンドポイントが長時間更新されない場合は、Ingress 名をクリックして イベント タブに移動し、問題をトラブルシューティングしてください。
Ingress リストの [エンドポイント] 列で、ALB エンドポイントアドレスを見つけます。これは
alb-<instance_id>.cn-wulanchabu.alb.aliyuncsslb.comのような形式です。 -
ドメインとエンドポイントへのアクセスをテストします。HTTP ステータスコード
200は、ALB Ingress が正常に機能していることを示します。curl -H "Host:ingress-demo.com" http://<endpoint_address>/coffee -s -o /dev/null -w "%{http_code}\n"
kubectl
-
次の内容で
coffee-ingress.yamlという名前のファイルを作成します。次に、kubectl apply -f coffee-ingress.yamlコマンドを実行して ALB Ingress を作成します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: coffee-ingress namespace: default spec: ingressClassName: alb rules: - host: ingress-demo.com http: paths: - path: /coffee backend: service: name: coffee-svc port: number: 80 pathType: Prefixマッチングルール (pathType)
説明
Prefix
リクエストパスのプレフィックスに基づいて一致します。たとえば、
/coffee/1または/coffee/buy/1へのリクエストは一致しますが、/cofまたは/coffeebuy/1へのリクエストは一致しません。Exact
リクエストパスと完全に一致します。
/coffeeへのリクエストのみが一致します。ImplementationSpecific
マッチング動作は Ingress Controller の実装に依存します。ALB Ingress Controller の場合、このタイプは完全一致と同等です。
-
Ingress を表示し、
ADDRESSフィールドからエンドポイントアドレスを取得します。kubectl get ingress coffee-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'期待される出力:
alb-******************.cn-wulanchabu.alb.aliyuncsslb.com -
ドメインとエンドポイントへのアクセスをテストします。HTTP ステータスコード
200は、ALB Ingress が正常に機能していることを示します。curl -H "Host:ingress-demo.com" http://<endpoint_address>/coffee -s -o /dev/null -w "%{http_code}\n"
課金
-
ALB Ingress Controller:これはマネージド ACK コンポーネントであり、無料です。
-
ALB インスタンス:各
AlbConfigリソースオブジェクトは、対応する ALB インスタンスを作成します。ALB インスタンスは 従量課金制です。
本番環境へのデプロイ
-
DNS の設定:CNAME レコードを作成して、サービスドメインを ALB インスタンスのパブリックエンドポイントにマッピングします。これにより、ドメインがインスタンスエンドポイントから分離され、可用性が高く柔軟なサービスエントリポイントが確保されます。
-
HTTPS の有効化:Certificate Management Service を使用して証明書を一元管理し、Ingress リソースの
tlsフィールドで宣言的に参照して、HTTPS でサービストラフィックを保護します。
クォータと制限事項
-
AlbConfig、Ingress、Service、および名前空間のリソース名は
aliyunで始めることはできません。 -
ALB Ingress のクォータ制限については、「ALB クォータの計算」をご参照ください。
-
ALB Ingress がサポートするリージョンとアベイラビリティーゾーンについては、「ALB がサポートするリージョンとゾーン」をご参照ください。
よくある質問
Ingress が HTTP エラーコードを返すのはなぜですか?
原因
-
503 (Service Temporarily Unavailable) エラー
-
一致するルーティングルールがない:リクエストパスが Ingress で設定されたどのルーティングルールにも一致しません。
-
正常なバックエンド Pod がない:関連付けられた Service に準備完了状態の Pod がなく、endpoints オブジェクトが空になります。
-
-
502 (Bad Gateway) エラー
HTTP または HTTPS リスナーがクライアント接続リクエストを受信した後、ALB はリクエストを Pod に転送できないか、Pod からの応答を受信できないため、クライアントに HTTP 502 Bad Gateway ステータスコードを送信します。
-
404 (Not Found) エラー
これは通常、リクエストが Ingress のルーティングルールに一致するものの、その URL がバックエンド Pod 内のアプリケーションのサービスパスと一致しない場合に発生します。
-
400 (Bad Request) エラー
これは、HTTPS リスナーに HTTP リクエストを送信するなど、いくつかの理由で発生する可能性があります。
HTTP エラーコードの詳細については、「ALB のステータスコード」をご参照ください。
解決策
-
Ingress のステータスを確認する:
kubectl describe ingress <ingress-name> -n <namespace>コマンドを実行し、Events セクションでエラーメッセージを確認します。listener is not exist in albのようなイベントが表示された場合は、必要なリスナー設定を AlbConfig に追加します。... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedBuildModel **** ingress listener is not exist in alb, port: 443, protocol: HTTPS Warning FailedBuildModel **** ingress listener not found for (443/HTTPS), with ingresses 1 ... -
バックエンドエンドポイントを確認する:
kubectl get endpoints <service-name> -n <namespace>コマンドを実行して、ENDPOINTSフィールドに少なくとも 1 つの正常な Pod の IP アドレスとポートがリストされていることを確認します。空の場合は、Service のselectorが Pod のlabelsと一致していること、および Pod がRunning状態であることを確認します。 -
Pod のステータスとログを確認する:
kubectl get pod -l <app=your-app> -n <namespace>を実行して Pod のステータスを表示します。次に、Pod 名を使用してkubectl logs <pod-name> -n <namespace>を実行し、アプリケーションログで起動の失敗やリクエスト処理のエラーを確認します。 ネットワーク接続のテスト: Pod 内またはノードから、
curlを使用してバックエンドサービスの ClusterIP または Pod IP にアクセスし、サービスがクラスター内で到達可能であることを確認します。
TLS 設定後に HTTPS にアクセスできないのはなぜですか?
原因
-
ALB インスタンスがポート 443 をリッスンしていない:Ingress に TLS を設定しましたが、対応する
HTTPS:443リスナーが作成されていません。 -
証明書の設定が正しくない:Secret タイプが
kubernetes.io/tlsまたはIngressTLSではない、またはdataフィールドのtls.crtとtls.keyの内容が正しくないか、一致していません。 -
古い証明書:ALB インスタンスが古い証明書を使用している可能性があります。これは、Alibaba Cloud Certificate Management Service で証明書を更新したものの、AlbConfig で証明書 ID を更新しなかった場合、または自動検出と調整がトリガーされなかった場合に発生します。
解決策
-
リスナーポートを確認する:
kubectl describe albconfig <alb-name> -n <namespace>コマンドを実行して、spec.listeners.port: 443およびspec.listeners.protocol: HTTPSの設定が存在することを確認します。 -
Ingress 設定を確認する:Ingress 設定に
alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}]アノテーションが含まれていることを確認します。このアノテーションは、Ingress を HTTP および HTTPS リスナーに関連付けます。 -
Secret 設定を確認する:Ingress 設定で、
spec.tlsのsecretNameフィールドを確認し、正しい Secret が参照されていることを確認します。kubectl get secret <secret-name> -n <namespace> -o yamlコマンドを実行して、Secret のタイプとデータ整合性を確認します。
Ingress ドメインの名前解決を設定する方法
-
たとえば、レコードタイプ
CNAME、ホストレコード@(ルートドメイン、たとえばingress-demo.comを表す)、およびレコード値を Ingress エンドポイントアドレスとして DNS レコードを追加します。 -
ブラウザで http://ingress-demo.com/coffee にアクセスし、ドメイン名の名前解決が機能していることを確認します。
アクセスが成功すると、NGINX テストページが返され、バックエンド Pod の Server address、Server name、Date、および URI (値は
/coffee) などの情報が表示されます。これは、Ingress がリクエストをバックエンド Pod に正しくルーティングしたことを示します。検証には、例を登録済みのドメイン名に置き換えてください。ドメイン名の名前解決が失敗した場合は、「ドメイン名解決の失敗に関するクイックトラブルシューティング」をご参照ください。
Ingress の HTTPS を設定する方法
-
公式証明書を購入するを申請します。使用したい証明書が 発行済み 状態であることを確認してください。
-
この例では、サーバータイプを [その他] に設定して、
ingress-demo.com -
証明書ファイルを保存するための Secret を作成します。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
シークレット ページで、
default名前空間を選択し、左側の 作成する をクリックします。次の構成を追加し、OK をクリックします。-
名前:
ingress-tls -
タイプ: TLS 証明書
-
証明書:ダウンロードして解凍した証明書ファイル (.pem) の全内容。
-
キー:ダウンロードして解凍した秘密鍵ファイル (.key) の全内容。
-
-
AlbConfig を更新して、ALB インスタンスに
HTTPS:443リスナーを追加します。-
左側のナビゲーションウィンドウで、 を選択します。リソースオブジェクト タブで AlbConfig を検索し、検索結果をクリックします。
-
AlbConfig リソースオブジェクトのリストで、ターゲットリソース
albを見つけ、アクション 列の YAML の編集 をクリックします。 -
spec.listeners.port: 443およびspec.listeners.protocol: HTTPSフィールドを追加し、OK をクリックします。spec: config: addressAllocatedMode: Fixed addressType: Internet zoneMappings: - vSwitchId: vsw-xxx - vSwitchId: vsw-xxx listeners: - port: 80 protocol: HTTP - port: 443 protocol: HTTPS
-
-
Ingress を更新して TLS 設定を追加し、
HTTPS:443リスナーに関連付けます。-
左側のナビゲーションウィンドウで、 を選択します。ターゲット Ingress の アクション 列で、更新 をクリックします。
-
次の設定を追加し、OK をクリックします。
-
TLS 設定:有効
-
ドメイン名:
ingress-demo.com -
シークレット:
ingress-tls -
注釈:
alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}]
-
-
-
ブラウザで
https://ingress-demo.com/coffeeにアクセスし、HTTPS アクセスを確認します。ページには NGINX のロゴとサーバーの応答情報が表示されます。Server address、Server name、および URI (値は
/coffee) が期待どおりに返されます。これにより、HTTPS が正しく設定され、Ingress がリクエストを coffee バックエンド Pod にルーティングしていることが確認できます。検証には、例を登録済みのドメイン名に置き換えてください。
HTTPS 証明書の設定方法の詳細については、「暗号化通信のための HTTPS 証明書の設定」をご参照ください。
AlbConfig と IngressClass を手動で作成する方法
AlbConfig の作成
-
VPC コンソールにログインし、クラスターがデプロイされている VPC 内の異なるアベイラビリティーゾーンにある少なくとも 2 つの vSwitch の ID を記録します。
設定された vSwitch のアベイラビリティーゾーンは、ALB でサポートされている必要があります。詳細については、「ALB のリージョンとゾーン」をご参照ください。
-
次のコードの
zoneMappings.vSwitchIdを前のステップで取得した vSwitch ID に置き換えます。内容を albconfig.yaml という名前のファイルに保存し、kubectl apply -f albconfig.yamlを実行して AlbConfig を作成します。より詳細な手順については、「AlbConfig の作成」をご参照ください。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb # 同じ名前の別の AlbConfig リソースを作成しないでください。 spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-****cg2a9g71hx8go**** # 実際の vSwitch ID に置き換えてください。 - vSwitchId: vsw-****un9tql5t8nh15**** # 実際の vSwitch ID に置き換えてください。 listeners: - port: 80 protocol: HTTP
IngressClass の作成
IngressClass リソースは、AlbConfig を Ingress リソースに関連付けます。Ingress で ingressClassName: alb を指定すると、alb IngressClass で定義された AlbConfig が使用されます。
次の内容を IngressClass.yaml という名前のファイルに保存し、kubectl apply -f IngressClass.yaml を実行して IngressClass を作成します。
spec.parameters.nameフィールドは、AlbConfig の名前に設定する必要があります。コンポーネントをインストールするときに作成されるデフォルトの AlbConfig の名前はalbです。詳細については、「IngressClass を使用して AlbConfig を Ingress に関連付ける」をご参照ください。
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: alb
spec:
controller: ingress.k8s.alibabacloud/alb
parameters:
apiGroup: alibabacloud.com
kind: AlbConfig
name: alb # これは AlbConfig リソースの名前と一致する必要があります。