Kubernetes では、Pod は短命であり、その IP アドレスは静的ではありません。これにより、安定したサービスとして直接公開することが困難になります。Kubernetes サービスは、固定 IP アドレスを持つ安定したエンドポイントを提供します。フロントエンドアプリケーションは、個々の Pod の IP アドレスを追跡することなく、この IP アドレスに接続してバックエンド Pod にアクセスできます。これにより、フロントエンドとバックエンドが分離され、サービスの安定性が確保されます。この Topic では、Container Compute Service (ACS) コンソールおよび kubectl コマandンドを使用してサービスを作成および公開する方法について説明します。
方法 1: コンソールでのサービスの作成
ACS コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけてその ID をクリックします。クラスターの詳細ページの左側のナビゲーションウィンドウで、[ネットワーク] > [サービス] を選択します。
[サービス] ページで、[作成] をクリックします。[サービスの作成] ダイアログボックスで、サービスのパラメーターを設定します。
設定項目
説明
例
サービス名
サービスの名前を設定します。
my-nginx-svc
サービスタイプ
サービスの種類を選択します。これは、サービスへのアクセス方法を指定します。有効な値は次のとおりです。
ClusterIP: クラスター内の内部 IP アドレスでサービスを公開します。この値を選択した場合、サービスはクラスター内からのみアクセスできます。
説明[ClusterIP] を選択すると、[インスタンス間検出用のヘッドレスサービス] を設定できます。ヘッドレスサービスを使用すると、Kubernetes の実装に縛られることなく、他のサービス検出メカニズムと連携できます。
Load Balancer: Alibaba Cloud Server Load Balancer (SLB) インスタンスを使用してサービスを公開します。[パブリックネットワークアクセス] または [イントラネット] を選択できます。ClusterIP サービスにトラフィックをルーティングできます。
SLB の作成: [仕様別の支払い] を選択した場合、[仕様の変更] をクリックして SLB 仕様を変更できます。
既存のロードバランサーの使用: 既存の SLB インスタンスのリストから SLB 仕様を選択できます。
説明既存の SLB インスタンスを使用する場合、その既存のリスナーは強制的に上書きされます。
サービスによって作成された SLB インスタンスは再利用できません。これにより、SLB インスタンスが予期せず削除される可能性があります。コンソールで手動で作成した SLB インスタンス、または OpenAPI 操作を呼び出して作成した SLB インスタンスのみを再利用できます。
複数のサービスで SLB インスタンスを再利用する場合は、ポートの競合を避けるために、フロントエンドリスナーのポートが異なることを確認してください。
SLB インスタンスを再利用する場合、Kubernetes はリスナーと vServer グループの名前を一意の識別子として使用します。リスナーと vServer グループの名前は変更しないでください。
クラスター間で SLB インスタンスを再利用することはできません。
サービスの作成:
サービスタイプ: Load Balancer
ロードバランサータイプ: Classic Load Balancer (CLB)
リソースの選択: リソースの作成
CLB リソースの作成:
アクセス方法: イントラネット
他の構成にはデフォルト値を使用します。
サービスの関連付け
サービスに関連付けるバックエンドアプリケーションを選択します。アプリケーションを関連付けないと、関連する Endpoint オブジェクトは作成されません。詳細については、「セレクターなしのサービス」をご参照ください。
名前: app
値: nginx
ポートマッピング
サービスポート (サービスの YAML ファイルの
portフィールドに対応) とコンテナーポート (サービスの YAML ファイルのtargetPortフィールドに対応) を追加します。コンテナーポートは、バックエンド Pod によって公開されるポートと同じである必要があります。サービスポート: 80
コンテナーポート: 80
プロトコル: TCP
アノテーション
サービスにアノテーションを追加します。ClusterIP または LoadBalancer サービスリソースのアノテーションを設定できます。
説明Alibaba Cloud 関連のアノテーションは、[サービスタイプ] が [Load Balancer] に設定されている場合にのみ有効になります。たとえば、
service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:2を設定すると、サービスのピーク帯域幅は 2 Mbit/s に設定され、サービストラフィックが制御されます。パラメーターの詳細については、「アノテーションを使用した Classic Load Balancer (CLB) インスタンスの設定」をご参照ください。なし
ラベル
サービスを識別するためのラベルを追加します。
なし
パラメーターを設定したら、[OK] をクリックします。
サービスが作成されると、[サービス] ページで
my-nginx-svcという名前の新しいサービスを見つけることができます。
方法 2: kubectl を使用したサービスの作成
次の内容を含む my-nginx-svc.yaml という名前のファイルを作成します。
フィールド
説明
kindリソースオブジェクトをサービスとして定義します。
metadata名前、ラベル、名前空間など、サービスに関する基本情報を定義します。
metadata.annotationsContainer Compute Service (ACS) は、ロードバランシングのための幅広いアノテーションをサポートしています。たとえば、上記の YAML サンプルでは、
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-typeは、サービスがintranet(イントラネット) であることを指定します。アノテーションの詳細については、「アノテーションを使用した Classic Load Balancer (CLB) インスタンスの設定」をご参照ください。spec.selectorサービスのセレクターを定義します。サービスは、セレクターと Pod ラベルのマッチング関係に基づいて、公開するバックエンド Pod を識別します。
spec.ports.portサービスが ClusterIP で公開するポートを定義します。クラスター内のクライアントは、
clusterIP:portでサービスにアクセスできます。spec.ports.targetPortバックエンド Pod のポートを定義します。
portを介して入るトラフィックは、kube-proxy によってバックエンド Pod のtargetPortにルーティングされ、コンテナーに入ります。spec.typeサービスへのアクセス方法を定義します。
LoadBalancer: Alibaba Cloud Server Load Balancer (SLB) インスタンスを使用してサービスを公開します。既存の SLB インスタンスを指定しない場合、デフォルトでパブリック SLB インスタンスが作成されます。service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-typeアノテーションをintranetに設定することで、イントラネットサービスと対応するイントラネット SLB インスタンスを作成できます。ClusterIP: クラスター内の内部 IP アドレスでサービスを公開します。これにより、サービスはクラスター内からのみ到達可能になります。
重要Alibaba Cloud Container Compute Service (ACS) は NodePort サービスをサポートしていません。このタイプのサービスを作成しようとすると、操作が失敗するか、サービスが機能しません。
次のコマンドを実行してサービスを作成します。
kubectl apply -f my-nginx-svc.yaml次のコマンドを実行して、サービスが作成されたことを確認します。
kubectl get svc my-nginx-svc期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-nginx-svc LoadBalancer 172.16.XX.XX 192.168.XX.XX 80/TCP 13s
関連操作
サービスの更新
方法 1: 次のコマンドを実行してサービスを更新します。
kubectl edit service my-nginx-svc方法 2: 古いサービスを手動で削除し、YAML ファイルを変更してから、次のコマンドを実行してサービスを再作成します。
kubectl apply -f my-nginx-svc.yaml
サービスの表示
サービスを表示できます。
kubectl get service my-nginx-svc期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx-svc LoadBalancer 172.16.XX.XX 192.168.XX.XX 80/TCP 13sサービスの削除
次のコマンドを実行してサービスを削除します。
kubectl delete service my-nginx-svc