Kubernetes クラスタ内の各ポッドには IP アドレスがあります。ポッドは Kubernetes 内で頻繁に作成および削除されます。その結果、ポッドの IP アドレスは頻繁に変更されます。そのため、ポッドを外部アクセスに直接公開することは現実的ではありません。サービスは永続的な IP アドレスを提供し、サービスのバックエンド ポッドを外部サービスとフロントエンド アプリケーションに公開します。これにより、ポッドにアクセスする際に、バックエンド ポッドとその IP アドレスを手動で指定する必要がなくなります。サービスはフロントエンドをバックエンドから分離し、安定した外部サービスを提供します。このトピックでは、Alibaba Cloud Container Compute Service (ACS) コンソールまたは kubectl を使用してサービスを作成し、サービスを使用してアプリケーションを公開する方法について説明します。
方法 1: ACS コンソールでサービスを作成する
ACS コンソールにログオンします。左側のナビゲーションペインで、クラスタをクリックします。
クラスタページで、管理するクラスタの名前をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、
を選択します。[サービス] ページの右上隅にある作成をクリックします。サービスの作成ダイアログボックスで、次のパラメータを設定し、OK をクリックします。
パラメータ
説明
例
名前
サービスの名前を入力します。
my-nginx-svc
サービスの種類
サービスの種類。このパラメータは、サービスへのアクセス方法を指定します。有効な値:
クラスタ IP: ClusterIP タイプのサービス。このタイプのサービスは、クラスタの内部 IP アドレスを使用して公開されます。このオプションを選択すると、サービスはクラスタ内からのみアクセス可能になります。
説明クラスタ IP を選択すると、ヘッドレスサービスチェックボックスが表示されます。このチェックボックスをオンにすると、ヘッドレスサービスを使用して、Kubernetes のサービスディスカバリの実装に縛られることなく、他のサービスディスカバリメカニズムとインターフェースできます。
SLB: LoadBalancer タイプのサービス。このタイプのサービスは、インターネット向けサーバーロードバランサー (SLB) インスタンスまたは内部向け SLB インスタンスを使用して、外部アクセスまたは内部アクセスを有効にします。LoadBalancer サービスを使用して、トラフィックを ClusterIP サービスにルーティングすることもできます。
SLB インスタンスの作成: 従量課金を選択した場合、仕様の変更をクリックして SLB インスタンスの仕様を変更できます。
既存の SLB インスタンスを使用: 既存の SLB インスタンスを選択できます。
説明既存の SLB インスタンスを使用する場合、SLB インスタンスのリスナーはサービスのリスナーを上書きします。
サービス用に作成された SLB インスタンスは、他のサービスと共有できません。SLB インスタンスを使用して他のサービスを公開すると、SLB インスタンスが削除される場合があります。コンソールで手動で作成した、または API を呼び出して作成した SLB インスタンスのみ、複数のサービスを公開するために使用できます。
同じ SLB インスタンスを共有する Kubernetes サービスは、異なるフロントエンドリスナーポートを使用する必要があります。そうしないと、ポートの競合が発生します。
1 つの SLB インスタンスを使用して複数のサービスを公開する場合、Kubernetes はリスナー名と vServer グループ名を一意の識別子として使用します。リスナーまたは vServer グループの名前を変更しないでください。
クラスタ間で SLB インスタンスを共有することはできません。
サービスの作成:
サービスの種類: SLB
SLB の種類: CLB
リソースの選択: リソースの作成
CLB インスタンスの作成:
アクセス方法: 内部アクセス
その他のパラメータにはデフォルト値を使用します。
バックエンド
サービスに関連付けるバックエンドアプリケーションを選択します。バックエンドアプリケーションを選択しない場合、エンドポイントオブジェクトは作成されません。詳細については、セレクタのないサービスを参照してください。
名前: app
値: nginx
ポートマッピング
サービスポートとコンテナポートを指定します。サービスポートは YAML ファイルの
port
フィールドに対応し、コンテナポートは YAML ファイルのtargetPort
フィールドに対応します。コンテナポートは、バックエンドポッドで公開されているポートと同じである必要があります。サービスポート: 80
コンテナポート: 80
プロトコル: TCP
アノテーション
ClusterIP または LoadBalancer サービスに 1 つ以上のアノテーションを追加します。
説明Alibaba Cloud アノテーションは、サービスの種類に SLB を選択した場合にのみ有効になります。たとえば、
service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:2
アノテーションを使用してサービスの最大帯域幅を 2 Mbit/s に設定し、サービスを通過するトラフィック量を制限できます。アノテーションの詳細については、アノテーションを使用して CLB インスタンスを構成するを参照してください。なし
ラベル
サービスに 1 つ以上のラベルを追加します。ラベルはサービスを識別するために使用されます。
なし
サービスが作成されると、サービスページに
my-nginx-svc
という名前のサービスが表示されます。
方法 2: kubectl を使用してサービスを作成する
my-nginx-svc.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
パラメータ
説明
kind
リソースオブジェクトがサービスであることを指定します。
metadata
名前、ラベル、名前空間など、サービスに関する基本情報を定義します。
metadata.annotations
ACS はさまざまな SLB アノテーションをサポートしています。上記の YAML テンプレートでは、
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type
アノテーションがintranet
に設定されています。これは、サービスが内部向けであることを示します。詳細については、アノテーションを使用して CLB インスタンスを構成するを参照してください。spec.selector
サービスのラベルセレクタを定義します。サービスは、ラベルセレクタに一致するラベルを持つポッドを公開します。
spec.ports.port
クラスタ IP アドレスに公開されるサービスポートを指定します。
clusterIP:port
にリクエストを送信することで、クラスタ内からサービスにアクセスできます。spec.ports.targetPort
トラフィックを受信するバックエンドポッドのポートを指定します。サービス
port
を流れるトラフィックは、kube-proxy によってバックエンドポッドのポート (targetPort
で指定) に転送され、コンテナに送信されます。spec.type
サービスへのアクセス方法を定義します。
LoadBalancer
: サービスは SLB インスタンスを使用して公開されます。既存の SLB インスタンスをサービスに関連付けない場合、システムは自動的に SLB インスタンスを作成します。デフォルトでは、自動的に作成された SLB インスタンスはインターネット向けです。内部アクセス用のサービスと、このサービス用の内部向け SLB インスタンスを作成するには、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type
をintranet
に設定します。ClusterIP
: クラスタ内でサービスを公開します。ClusterIP サービスはクラスタ内からアクセスできます。
重要ACS は NodePort サービスをサポートしていません。NodePort サービスは ACS クラスタで作成できず、有効になりません。
次のコマンドを実行してサービスを作成します。
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 ファイルを変更し、変更した 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