【Cloud Native】k8s Serviceはサービスディスカバリとロードバランシングを実現

序文

Kubernetes などのコンテナー オーケストレーション システムでは、Pod はデプロイの最小単位です。Pod のグループは通常、何らかのサービスを外部に提供します。Kubernetes では、Service は一連の Pod サービスを公開するために使用されるリソース オブジェクトです。外部サービスを提供するために、IP アドレスとポート番号を介してサービスにアクセスできます。

サービス紹介

サービスは Kubernetes の非常に重要な概念であり、Pod のセットを論理的なサービス ユニットにカプセル化できます。

Service は、定義された Label Selector を介して Pod のグループをバインドし、Service を形成できます。サービスを通じて、ユーザーは Pod の特定の IP アドレスとポート番号を気にすることなく簡単にサービスにアクセスでき、Pod の数の変更がサービスへのアクセスに影響することを心配する必要はありません。

4つのサービスとその使い方

Kubernetes には、ClusterIP、NodePort、LoadBalancer、ExternalName という 4 種類の Service があります。

  • ClusterIP: サービスのデフォルトのタイプです。サービスのクラスター IP が作成されます。この IP にはクラスター内でのみアクセスできます。ClusterIP を介して、ユーザーは Service に関連付けられた Pod にアクセスできます。
  • NodePort: 各ノードでポートをバインドして、Service をクラスターの外部に公開します。ユーザーは、任意のノードの IP アドレスとポート番号を介してサービスにアクセスできます。
  • LoadBalancer: クラウド ベンダーが提供するロード バランサーに VIP を作成して、Service をクラスターの外部に公開します。ユーザーは、この VIP アドレスを介してサービスにアクセスできます。
  • ExternalName: Service をクラスター外の DNS 名にマップして、Service をクラスター外に公開できます。

さらに、既存のサービスをサービスの形で Kubernetes クラスターに追加することもできます. サービスの作成時にラベル セレクターを指定する必要はありませんが、作成後にサービスのエンドポイントを手動で追加する必要があります.

サービスの定義と利用

サービスは、yaml を使用して定義することもできます。

以下は、nginx という名前の Service を定義するセレクターとタイプを含む YAML ファイルであり、サービスのポート 80 を、デフォルトの名前空間で run=nginx というラベルを持つ Pod のポート 80 に転送します。

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    run: nginx
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

その中で、type は Service のタイプであり、ClusterIP、NodePort、LoadBalancer、ExternalName のいずれかです。

この例のタイプは ClusterIP です。これは、Service のタイプが ClusterIP であることを意味します。

コマンドによるサービスの作成と閲覧の操作手順と想定される表示内容を以下に示します。

コマンドでサービスを作成する

  1. kubectl createコマンドを使用してnginxという名前のサービスを作成し、サービスのポート 80 を、デフォルトの名前空間のrun=nginxラベルを。次のコマンドを実行します。
kubectl create service clusterip nginx --tcp=80:80 --dry-run=client -o yaml > nginx-service.yaml

このコマンドは、サービスの作成に必要な構成情報を含む、現在のディレクトリにnginx-service.yamlある。

期待される表示内容:

service/nginx created (dry run)
  1. kubectl apply コマンドを使用して Service を作成します。次のコマンドを実行します。
kubectl apply -f nginx-service.yaml

このコマンドは、YAML ファイルの構成情報に従って、nginx という名前のサービスを作成します。

期待される表示内容:

service/nginx created

作成したサービスを表示

  1. kubectl get コマンドを使用して、作成された Service を表示します。次のコマンドを実行します。
kubectl get services

このコマンドは、名前、タイプ、クラスター IP、ポート、およびその他の情報を含む、作成されたすべてのサービスを表示します。
期待される表示内容:

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP    4h19m
nginx        ClusterIP   10.96.58.173   <none>        80/TCP     1m
  1. kubectl describe コマンドを使用して、指定したサービスの詳細を表示します。次のコマンドを実行します。
kubectl describe service nginx

このコマンドは、タイプ、クラスター IP、ポート、セレクター、およびその他の情報を含む、nginx という名前のサービスの詳細情報を表示します。

期待される表示内容:

Name:              nginx
Namespace:         default
Labels:            run=nginx
Annotations:       <none>
Selector:          run=nginx
Type:              ClusterIP
IP:                10.96.58.173
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.7:80
Session Affinity:  None
Events:            <none>

セレクターが指定されていないサービス

ユーザーが Service を作成する際に、Label Selector を指定しない場合があり、この種の Service を No Selector Service (No Selector Service) と呼びます。セレクタレス サービスは Pod にバインドできませんが、バックエンド サービスにアクセスするための固定 IP とポートのみを提供します。この種のサービスは通常、データベース、メッセージ キューなどの外部サービスにプロキシするために使用されます。

ヘッドレス サービス

Kubernetes には、ヘッドレス サービスと呼ばれる特別なタイプのサービスもあります。ヘッドレス サービスの ClusterIP は None です。サービスのクラスター IP は作成されません。ヘッドレス サービスを介して、ユーザーは、サービスを介してアクセスすることなく、サービスに関連付けられた Pod に直接アクセスできます。

サービスの動作原理と模式図

Service の動作原理はプロキシ モードによって実現されます。つまり、kube-proxy はバックエンド Pod へのサービス負荷のバランスを取る役割を果たします。
ユーザーが Service の IP とポートを介して Service にアクセスすると、リクエストは最初に Service プロキシに到達し、次にプロキシがリクエストをバックエンド Pod に転送します。
Pod が変更されると、Service はエンドポイントを自動的に更新して、リクエストがバックエンド Pod に正しく到達できるようにします。
Service がどのように機能するかの概略図を次に示します。
ここに画像の説明を挿入

イングレスの説明

Ingress は Kubernetes のもう 1 つの重要なリソース オブジェクトであり、クラスター外の HTTP(S) トラフィックをクラスター内の Service にルーティングするために使用されます。Ingress を介して、ユーザーはクラスターの外部でドメイン名を定義し、そのドメイン名をサービスにルーティングできます。Ingress は、グレースケール パブリッシング、ロード バランシング、SSL ターミネーション、およびその他の機能を実装できます。

クラスタ外のサービスにアクセスする方法

ユーザーがクラスターの外部から Kubernetes のサービスにアクセスする必要がある場合は、NodePort、LoadBalancer、または Ingress を介して実現できます。具体的な方法は次のとおりです。

  • ノードポート

ユーザーは、任意のノードの IP アドレスとノードにバインドされたポート番号を介してサービスにアクセスできます。たとえば、NodePort のポートが 30080 で、ノードの IP アドレスが 192.168.0.10 の場合、ユーザーは http://192.168.0.10:30080 からサービスにアクセスできます。

  • ロードバランサー

Service のタイプが LoadBalancer の場合、クラウド ベンダーは提供するロード バランサー上に Service の VIP を作成し、ユーザーはこの VIP アドレスを介して Service にアクセスできます。

  • イングレス

Ingress を介して、ユーザーはクラスターの外部でドメイン名を定義し、そのドメイン名をサービスにルーティングできます。ユーザーは、このドメイン名を介してサービスにアクセスできます。

要約する

上記は、Service の概要と定義、4 種類の Service の動作原理、Ingress の説明、およびクラスター外のサービスにアクセスする方法を含む、Kubernetes における Service の概要です。

Service を使用する場合、ユーザーは Pod の特定の IP アドレスとポート番号を気にする必要はなく、Pod の数の変更がサービスへのアクセスに影響を与えることを心配する必要もありません。

Ingress を介して、ユーザーはクラスター外でドメイン名を定義し、ドメイン名をサービスにルーティングして、グレー スケール パブリッシング、負荷分散、SSL ターミネーションおよびその他の機能を実現できます。

おすすめ

転載: blog.csdn.net/u011397981/article/details/130034489