Kubernetes サービスとは
Kubernetes サービスは、クラスタとしてデプロイされた(すべてが同じ機能を実行する)一連のポッドの論理的な抽象化です。
ポッドはエフェメラル(一時的)な存在であり、サービスとして特定の機能(Web サービス、画像処理など)を提供する一連のポッドが有効化されると、名前と一意の IP アドレス(ClusterIP)が割り当てられます。その IP アドレスは、サービスが実行されている限り、変更されることはありません。また、サービスには、アクセスに関するポリシーも定義されます。

Kubernetes の現状

Kubernetes Up and Running
Kubernetes におけるサービスとデプロイメントの違い
Kubernetes では、デプロイメントは、コンテナ化されたアプリケーションが配置されたポッドを起動し、クラスタ上で必要な数のレプリカが常に実行されていることを保証する方法の 1 つです。
一方、サービスは、これらのポッドにインターフェイスを公開する役割を担い、クラスタ内からのネットワーク アクセスまたは外部プロセスとサービス間におけるネットワーク アクセスを可能にします。
Kubernetes サービスのコンポーネント
Kubernetes サービスは、抽象化されたサービスの名前と IP アドレスに一連のポッドを接続します。サービスは、検出機能とポッド間のルーティングを提供します。たとえば、サービスは、一つのクラスタ内の別々のデプロイメントで動作しているアプリケーションのフロントエンドとバックエンドを接続します。サービスは、ラベルとセレクターを使用して、ポッドとほかのアプリケーションのマッチングを行います。Kubernetes サービスのコア属性は次のとおりです。
- ポッドの位置を示すラベル セレクター
- ClusterIP の IP アドレスと割り当てられたポート番号
- ポート定義
- 受信ポートから targetPort へのマッピング(オプション)
サービスは、ポッド セレクターなしで定義できます。たとえば、あるサービスを別のネームスペースやクラスタにある別のサービスにポイントする場合などです。
Kubernetes サービスのタイプ
- ClusterIP:クラスタ内からのみアクセス可能なサービスを公開します。
- NodePort:各ノードの IP で静的ポートを介してサービスを公開します。
- LoadBalancer:クラウド プロバイダーのロードバランサーを介してサービスを公開します。
- ExternalName:CNAME レコードの値を返すことで、定義済みの ExternalName フィールドにサービスをマッピングします。
Kubernetes の ClusterIP サービスとは
ClusterIP はデフォルトのサービス タイプであり、クラスタ内部の IP アドレスでサービスを公開するために使用します。クラスタ内からのアクセスのみが許可されます。
Kubernetes のヘッドレス サービスとは
ロードバランシングを必要とせず、1 つの IP を公開するだけのサービスです。ClusterIP に「none」を指定することで「ヘッドレス」サービスを作成できます。
ヘッドレス サービスはセレクターを使用して定義でき、その場合、API でエンドポイント レコードが作成されて、サービスを公開しているポッドをポイントするアドレスを返すように DNS が変更されます。セレクターのないヘッドレス サービスでは、エンドポイント レコードは作成されません。DNS システムにより、CNAME レコード、またはサービスと同じ名前を持つエンドポイントのレコードが構成されます。
Kubernetes の NodePort サービスとは
NodePort は、各クラスタ ノード上のオープン ポートです。Kubernetes は、NodePort で受信したトラフィックをサービスへルーティングします。この処理は、そのノード上でサービスが実行されていない場合でも行われます。NodePort は、ロードバランサーなど、Ingress のより上位の方法の基盤となるものであり、開発で役立ちます。
Kubernetes の ExternalName サービスとは
ExternalName サービスはその他の Kubernetes サービスと似ていますが、ClusterIP アドレスでアクセスするのではなく、サービスの作成時に「externalName: パラメーター」で定義された値を持つ CNAME レコードを返します。
Kubernetes の LoadBalancer サービスとは
AWS や Azure などのパブリッククラウド プロバイダー上で動作するクラスタの場合、LoadBalancer サービスを作成すると、ClusterIP サービスと同等の機能が提供され、この機能はクラウド プロバイダーに固有の外部ロードバランサーに拡張されます。Kubernetes は自動的にロードバランサーを作成し、必要に応じてファイアウォール ルールを提供し、クラウド プロバイダーから割り当てられた外部 IP アドレスをサービスに設定します。
Kubernetes サービスの仕組み
サービスは、ラベルを使用してポッドをポイントするだけです。サービスはノードに依存しないため、クラスタ内でのポッドの実行場所に関係なく、いつでもポッドをポイントできます。サービス IP アドレスと DNS サービス名を公開することで、そのサービスが存在する限り、どちらの方法でもアプリケーションにアクセスできます。
Kubernetes サービスの定義方法
サービスは、すべての Kubernetes オブジェクトと同様に、YAML で定義されます。たとえば、Web フロントエンドからのデータを処理するバックエンド サービスを実行するポッドをデプロイしたとします。「service-backend」という名前のサービスをデプロイメント「deployment-backend」で公開するには、以下を使用します。
apiVersion: v1
kind: Service
metadata:
name: service-backend
spec:
ports:
- port: 4000
protocol: TCP
targetPort: 333
selector:
run: deployment-backend
type: ClusterIP
サービス「service-backend」が作成され、クラスタ内のどのポッドからでも、ポッドのポート 333 で、http://service-backend:4000 を使用して、またはクラスタの IP アドレス + ポート 4000 でこのサービスにアクセスできます。
Kubernetes サービスは、「kubectl expose」コマンドを使用して作成することもでき、この場合は YAML ファイルは不要です。次のコマンドを使用して、同じサービスを作成できます。
kubectl expose deployment deployment-backend - - port=333- - target-port=4000 - - name=service-backend
Kubernetes サービスへのアクセス方法
Kubernetes サービスは、次の 2 つの方法で検出できます。
DNS(もっとも一般的):DNS は、サービスを検出する方法として推奨されています。この方法を使用するには、まず DNS サーバがクラスタにインストールされている必要があります。DNS サーバは Kubernetes API を監視します。新しいサービスが作成されると、その名前が利用可能になり、リクエスト元のアプリケーションに簡単に名前解決を提供することができます。
ENV 変数:この方法を使用するには、kubelet で、ポッドが実行されているすべてのノードのアクティブなサービスごとに環境変数を追加する必要があります。
関連するソリューションおよび製品
ラボ:アプリケーションのモダナイゼーション
既存のアプリケーションを数週間でクラウドに移行
Tanzu for Kubernetes Operations
最新のマルチクラウド コンテナ インフラストラクチャの基盤
Tanzu Application Platform
Kubernetes 環境でマルチクラウド対応の優れた開発者体験を提供