はじめに
本記事では、KubernetesのServiceについて紹介します。
Serviceとは?
Serviceとはクラスター内のPodを内部や外部に公開するためのL4ロードバランサーです。
Serviceは以下の機能を持ちます。
- Podに対するエンドポイントの提供
- Podに対する負荷分散
なぜ必要か?
Podは作成・削除でIPアドレスが頻繁に変わってしまいます。
ServiceはPodに対して、共通のエンドポイントを容易することでPod側のIPアドレス管理の手間を削減することが可能です。
Serviceタイプ
Serviceには以下の様なタイプがあります。
- ClusterIP
- NodePort
- LoadBalancer
kubectl
コマンドでServiceを作成する場合、kubectl expose
コマンドを使用します。
※ リソースタイプ: deploy, rs, pod, svc, rc
kubectl expose [リソースタイプ] [リソース名] --type [タイプ] --port [ポート番号] --name [サービス名前]
以下、それぞれのServiceタイプの特徴になります。
ClusterIP
ClusterIPはPodを クラスター内部 限定で公開します。
ClusterIPへはクラスター内のみからアクセス可能となります。
動作確認
ClusterIPを作成してクラスター内から nginx Pod へアクセスしてみます。
※ 動作確認は全てローカルのminikube環境で構築したクラスターを使用しています
- nignxのPodを作成
$ kubectl run --image nginx --restart Never nginx
- ClusterIPを作成
$ kubectl expose pod nginx --type ClusterIP --port 80 --name nginx-clusterip
- PodとServiceを確認
$ kubectl get pod,svc -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/nginx 1/1 Running 0 6m35s 10.244.0.16 minikube <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/nginx-clusterip ClusterIP 10.100.178.175 <none> 80/TCP 61s run=nginx
- クラスター内にcurl Podを作成し、ClusterIP経由でnginxにアクセス
$ kubectl run --image curlimages/curl:7.68.0 --restart Never -it --rm curl -- curl nginx-clusterip:80 HTTP/1.1 200 OK Server: nginx/1.27.1 Date: Tue, 01 Oct 2024 12:26:09 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Mon, 12 Aug 2024 14:21:01 GMT Connection: keep-alive ETag: "66ba1a4d-267" Accept-Ranges: bytes pod "curl" deleted
NodePort
NodePortは各ノードのポートを解放します。これによりクラスター外部から各ノードの指定ポートを通してアクセス可能となります。
NodePortを作成すると転送先のClusterIPが自動的に作成されます。
動作確認
NodePortを作成してローカルPCから nginx Pod へアクセスしてみます。
- nignxのPodを作成
$ kubectl run --image nginx --restart Never nginx
- NodePortを作成
$ kubectl expose pod nginx --type NodePort --port 80 --name nginx-nodeport
- PodとServiceを確認
$ kubectl get pod,svc -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/nginx 1/1 Running 0 6m35s 10.244.0.16 minikube <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/nginx-nodeport NodePort 10.104.64.143 <none> 80:32485/TCP 34m run=nginx
- minikubeでServiceのurlを取得
$ minikube service nginx-nodeport http://127.0.0.1:52851 ❗ Docker ドライバーを darwin 上で使用しているため、実行するにはターミナルを開く必要があります。
- ブラウザから取得したURLにアクセス
LoadBalancer
LoadBalancerは各NodePortを束ねたエンドエンドポイントを提供するロードバランサーです。
LoadBalancerを作成すると転送先のNodePort, ClusterIPが自動的に作成されます。
動作確認
LoadBalancを作成してローカルPCから nginx Pod へアクセスしてみます。
- nignxのPodを作成
$ kubectl run --image nginx --restart Never nginx
- LoadBalancerサービスを作成
$ kubectl expose pod nginx --type LoadBalancer --port 80 --name nginx-lb
- PodとServiceを確認
$ kubectl get pod,svc -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/nginx 1/1 Running 0 6m35s 10.244.0.16 minikube <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/nginx-lb LoadBalancer 10.111.57.182 <pending> 80:31597/TCP 5m50s run=nginx
- minikubeのtunnelコマンドを使用してLaodBalancerに外部IPアドレスを割り当てる
$ minikube tunnel ✅ トンネルが無事開始しました 📌 注意: トンネルにアクセスするにはこのプロセスが存続しなければならないため、このターミナルはクローズしないでください ... ❗ nginx-lb service/ingress は次の公開用特権ポートを要求します: [80] 🔑 sudo permission will be asked for it. 🏃 nginx-lb サービス用のトンネルを起動しています。 Password:
- ブラウザからLoadBalancerへアクセス