はじめに
このチュートリアルでは、Kubernetesエコシステムにおける基本概念であるKubernetesサービスについて、包括的な理解を提供します。異なる種類のサービス、アプリケーションをネットワークに公開する方法、およびKubernetesサービスに関連する高度な概念について学びます。
Kubernetesサービスの理解
Kubernetesサービスは、Kubernetesエコシステムにおける基本概念であり、ポッド内で実行されているアプリケーションをネットワークに公開する方法を提供します。サービスは、基礎となるポッドを抽象化し、クライアントがポッドの詳細を知ることなくアプリケーションに接続できるようにします。
Kubernetesサービスの種類
Kubernetesは、さまざまなネットワーキング要件に対応するためにいくつかの種類のサービスを提供します。
- ClusterIP:これはデフォルトのサービスタイプで、クラスタ内のIPアドレスでサービスを公開します。この種類のサービスは、クラスタ内からのみアクセス可能です。
graph LR
Client --> ClusterIP
ClusterIP --> Pods
- NodePort:このサービスタイプは、静的なポートを使用して、各ノードのIPアドレスでアプリケーションを公開します。これにより、外部クライアントがクラスタ外からアプリケーションにアクセスできるようになります。
graph LR
Client --> NodePort
NodePort --> Nodes
Nodes --> Pods
- LoadBalancer:このサービスタイプは、通常、クラウド環境でアプリケーション用のロードバランサをプロビジョニングします。ロードバランサはトラフィックをポッドに分散します。
graph LR
Client --> LoadBalancer
LoadBalancer --> Nodes
Nodes --> Pods
- ExternalName:このサービスタイプは、サービスをDNS名にマップし、ポッドやエンドポイントはありません。これは、外部サービスとの統合に便利です。
サービスコンポーネント
Kubernetesサービスは、いくつかの重要なコンポーネントで構成されています。
- セレクター:セレクターは、サービスの一部となるポッドを決定する一連のラベルです。
- ポート:サービスがアクセス可能になるポート。
- ターゲットポート:ポッドがリッスンしているポート。
- ClusterIP:サービスに割り当てられた内部IPアドレス。
- タイプ:前述の通りのサービスの種類。
以下は、サービスのコンフィグレーションの例です。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
この例では、サービスは、ラベル app: my-app が付いたポッドをポート80で公開し、トラフィックをポッドのポート8080に転送します。
Kubernetesアプリケーションの公開
Kubernetesサービスを定義したら、次のステップはアプリケーションを外部に公開することです。Kubernetesにはこれを達成するためのいくつかの方法があり、それぞれ独自の利点と使用例があります。
NodePortサービス
NodePortサービスタイプは、静的なポートを使用して、各ノードのIPアドレスでアプリケーションを公開します。これにより、外部クライアントがクラスタ外からアプリケーションにアクセスできるようになります。以下は例です。
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
この例では、サービスは、30000 - 32767の範囲でランダムに割り当てられたポートを使用して、各ノードのIPアドレスでアクセス可能になります。
ロードバランササービス
ロードバランササービスタイプは、通常、クラウド環境でアプリケーション用のロードバランサをプロビジョニングします。ロードバランサはトラフィックをポッドに分散します。以下は例です。
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
この例では、クラウドプロバイダがロードバランサをプロビジョニングし、トラフィックをポッドに分散するように構成します。
Ingress
Ingressは、高度なルーティングとロードバランシング機能を提供するKubernetesリソースです。Ingressを使用することで、単一のIPアドレスの下で複数のサービスを公開でき、SSL/TLS終了、パスベースのルーティングなどの機能を処理できます。以下はIngressのコンフィグレーションの例です。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: my-api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: my-web-service
port:
number: 80
この例では、Ingressは example.com ドメインの下で、2つの異なるサービス /api と /web を公開します。
高度なKubernetesサービスの概念
基本的なKubernetesサービスの種類では多くの使用例がカバーされていますが、アプリケーションのネットワーキングに対してより柔軟性と制御を提供できる高度な概念もいくつかあります。
サービスの発見
Kubernetesは、組み込みのサービス発見メカニズムを備えており、ポッド同士が見つけ合って通信できるようにします。これは、環境変数とKubernetes DNSサーバーの使用によって達成されます。
新しいサービスが作成されると、Kubernetesは自動的に <service - name>.<namespace>.svc.cluster.local という形式のDNS名を割り当てます。その後、ポッドはこのDNS名を使用してサービスに接続できます。
Kubernetesはまた、各サービスに対して MY_SERVICE_HOST や MY_SERVICE_PORT などの環境変数を注入します。ポッドはこれらの環境変数を使用してサービスに接続できます。
サービスネットワーキング
Kubernetesは、kube - proxy コンポーネントを使用してサービスのネットワーキングを処理します。kube - proxy は、必要なiptablesルールを設定し、トラフィックを適切なポッドに転送する責任があります。
Kubernetesは、iptables や ipvs などの複数のネットワーキングモデルをサポートしており、必要に応じて構成できます。
サービスのスケーリング
Kubernetesサービスは、利用可能なポッドの数に基づいて自動的にスケールアップとダウンが可能です。アプリケーションをポッドを追加または削除することでスケーリングすると、サービスは自動的にそのロードバランシングを調整してトラフィックを適切に分散します。
また、CPU使用率やカスタムメトリックなどのメトリックに基づいてアプリケーションを自動的にスケーリングする、水平ポッド自動スケーリングなどの高度なスケーリングオプションも設定できます。
以下は、水平ポッド自動スケーラの例です。
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: my - hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my - app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
この例では、水平ポッド自動スケーラは、ポッドの平均CPU使用率に基づいて、my - app のデプロイメントを2から10のポッドの間で自動的にスケーリングします。
まとめ
このチュートリアルでは、ClusterIP、NodePort、LoadBalancerなどの異なる種類のKubernetesサービスについて学び、それらを使ってアプリケーションをネットワークに公開する方法を学びました。また、Kubernetesサービスの重要なコンポーネントとそれらを構成する方法についても検討しました。Kubernetesサービスを理解することで、ポッド内で実行されているアプリケーションを効果的に管理して公開でき、クライアントが基礎となるポッドの詳細を知ることなくアプリケーションに接続できるようになります。


