Kubernetes において、サービスは、一連の Pod 上で実行されているアプリケーションをネットワークサービスとして公開する抽象化です。Pod に対して安定した DNS 名と負荷分散を提供します。本トピックでは、Kubernetes サービスの仕組み、重要な考慮事項、およびサービスタイプの選択に関する推奨事項について説明します。
前提条件
ACK Serverless クラスターが必要です。詳細については、「ACK Serverless のクイックスタート」をご参照ください。
Service の仕組み
ラベルセレクターは、Service が対象とする Pod を識別します。Service がトラフィックを受信すると、ラベルがセレクターに一致するすべての Pod にリクエストを分散します。
次の表に、3 つの Service タイプとそれぞれの用途を示します。
Service タイプ | アクセスパターン | 用途 |
[ClusterIP] | クラスター内部の IP アドレスのみ (デフォルト) | 同じクラスター内の他のワークロードにアプリを公開する場合 |
[NodePort] | クラスター外部からの | ノードレベルでの直接アクセスが必要な場合。ACK Serverless クラスターでは利用できません |
[サーバーロードバランサー] | インターネット向けまたは内部 SLB インスタンス | 外部ユーザーまたは VPC 内のコンシューマーにアプリを公開する場合 |
Kubernetes Service の完全な仕様については、「Kubernetes Service」をご参照ください。
手順1:Deployment の作成
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
デプロイメント ページの右上隅にある YAML のリソースの作成 をクリックします。
サンプルテンプレートを選択するか、カスタム YAML を入力して、作成する をクリックします。
この例では、サンプルテンプレートは NGINX Deployment です。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 # イメージ名とタグを独自のものに置き換えてください。 ports: - containerPort: 80 # このポートは Service で公開する必要があります。デプロイメントのリストで、対象アプリケーションの名前をクリックするか、詳細 列の [詳細] をクリックして、Deployment のステータスを確認します。nginx-deployment-basic の詳細ページには、その基本情報が表示されます。名前空間は default、セレクターと ラベル は両方とも app:nginx、アノテーションは
deployment.kubernetes.io/revision:1、更新ポリシーは RollingUpdate (最大サージ 25%、最大利用不可 25%) です。ステータスには、2/2 の Pod が準備完了、2 つが更新済み、2 つが利用可能であることが示されます。Pod リストでは、両方の Pod が nginx:1.7.9 イメージを使用し、実行中であり、再起動回数は 0 です。
手順2:Service の作成
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
サービス ページで、作成する をクリックします。
サービスの作成 ダイアログボックスで、パラメーターを設定します。
パラメーター
説明
[名前]
Service の名前を入力します。
Service タイプ
Service タイプを選択します。これは Service へのアクセス方法を決定します。選択肢は次のとおりです。
[ClusterIp]:Service をクラスター内部の IP アドレスで公開します。このタイプの Service は、クラスター内からのみアクセスできます。これはデフォルトの Service タイプです。
説明[ヘッドレス Service] は、サービスタイプ が ClusterIp の場合にのみ設定できます。ヘッドレス Service を使用すると、Kubernetes の実装に依存せず、他のサービス検出メカニズムと連携できます。
[NodePort]:各ノードの IP アドレスの静的ポート (NodePort) で Service を公開します。NodePort Service は、自動的に作成される ClusterIP Service にトラフィックをルーティングします。クラスターの外部からは
<NodeIP>:<NodePort>を使用して NodePort Service にアクセスできます。説明NodePort をサポートするのは ACK クラスターのみです。ACK Serverless クラスターはサポートしていません。
[Server Load Balancer]:Alibaba Cloud サーバーロードバランサー (SLB) インスタンスを使用して Service を公開します。インターネット経由で公開するか、プライベートネットワーク内のみで公開するかを選択できます。サーバーロードバランサーは、NodePort および ClusterIP Service にトラフィックをルーティングできます。
[SLB インスタンスの作成]:変更 をクリックして SLB インスタンスの仕様を変更します。
[既存の SLB インスタンスを使用]:既存のインスタンスのリストから SLB インスタンスを選択します。
説明サーバーロードバランサータイプでは、新しい SLB インスタンスを作成するか、既存のインスタンスを使用できます。複数の Kubernetes Service で同じ SLB インスタンスを共有できますが、次の制限があります。
既存の SLB インスタンスを使用する場合、既存のリスナーは上書きされます。
他の Service によって自動的に作成された SLB インスタンスは、誤って削除される可能性があるため、再利用しないでください。
複数の Service が同じ SLB インスタンスを再利用する場合、ポートの競合を避けるために、フロントエンドリスナーポートが重複しないようにしてください。
SLB インスタンスを再利用する場合、Kubernetes はリスナー名と VServer グループ名を一意の識別子として使用します。これらの名前は変更しないでください。
異なるクラスター間で SLB インスタンスを再利用することはできません。
[外部トラフィックポリシー]
外部トラフィックポリシーを設定します。詳細な比較については、「外部トラフィックポリシーの比較」をご参照ください。
Local:トラフィックは、リクエストを受信したノードと同じノード上の Pod にのみルーティングされます。
Cluster:トラフィックは、クラスター内の他のノード上の Pod に転送できます。
説明外部トラフィックポリシー は、[Service タイプ] が NodePort または Server Load Balancer の場合にのみ設定できます。
[バックエンド]
Service がトラフィックを送信するバックエンドアプリケーションを選択します。Service をバックエンドに関連付けない場合、Kubernetes は対応する Endpoints オブジェクトを作成しません。詳細については、「セレクターのない Service」をご参照ください。
[ポートマッピング]
サービスポート (サービス YAML ファイルの
portフィールド) とコンテナポート (サービス YAML ファイルのtargetPortフィールド) を追加します。コンテナポートは、バックエンド Pod によって公開されるポートと一致させる必要があります。アノテーション
アノテーションを追加して、ロードバランサーのパラメーターを設定します。カスタムアノテーション または Alibaba Cloud アノテーション を選択できます。たとえば、アノテーション
service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:2は、サービスのピーク帯域幅を 2 Mbit/s に設定してトラフィックを制御します。その他のパラメーターについては、「アノテーションを使用した Classic Load Balancer (CLB) の設定」をご参照ください。[タグ]
Service を識別するためのラベルを追加します。
作成する をクリックします。
新しく作成された Service が サービス ページのリストに表示されます。
[Service] ページで、管理したい Service の [操作] 列にある [更新] または [削除] をクリックします。
説明Service の詳細ページで、外部エンドポイント の横にあるリンクをクリックしてアプリケーションにアクセスできます。