0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Kubernetes】Serviceとは?

Posted at

はじめに

本記事では、KubernetesのServiceについて紹介します。

Serviceとは?

Serviceとはクラスター内のPodを内部や外部に公開するためのL4ロードバランサーです。
Serviceは以下の機能を持ちます。

  • Podに対するエンドポイントの提供
  • Podに対する負荷分散
qiita-k8s-service.drawio.png

なぜ必要か?

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へはクラスター内のみからアクセス可能となります。

qiita-k8s-service-clusterip.drawio.png

動作確認

ClusterIPを作成してクラスター内から nginx Pod へアクセスしてみます。
※ 動作確認は全てローカルのminikube環境で構築したクラスターを使用しています

  1. nignxのPodを作成
    $ kubectl run --image nginx --restart Never nginx
    
  2. ClusterIPを作成
    $ kubectl expose pod nginx --type ClusterIP --port 80 --name nginx-clusterip
    
  3. 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
    
  4. クラスター内に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が自動的に作成されます。

qiita-k8s-service-nodeport.drawio.png

動作確認

NodePortを作成してローカルPCから nginx Pod へアクセスしてみます。

  1. nignxのPodを作成
    $ kubectl run --image nginx --restart Never nginx
    
  2. NodePortを作成
    $ kubectl expose pod nginx --type NodePort --port 80 --name nginx-nodeport
    
  3. 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
    
  4. minikubeでServiceのurlを取得
    $ minikube service nginx-nodeport
    http://127.0.0.1:52851
    ❗  Docker ドライバーを darwin 上で使用しているため、実行するにはターミナルを開く必要があります。
    
  5. ブラウザから取得したURLにアクセス
    スクリーンショット 2024-10-01 22.32.07.png

LoadBalancer

LoadBalancerは各NodePortを束ねたエンドエンドポイントを提供するロードバランサーです。
LoadBalancerを作成すると転送先のNodePort, ClusterIPが自動的に作成されます。

qiita-k8s-service-loadbalancer.drawio.png

動作確認

LoadBalancを作成してローカルPCから nginx Pod へアクセスしてみます。

  1. nignxのPodを作成
    $ kubectl run --image nginx --restart Never nginx
    
  2. LoadBalancerサービスを作成
    $ kubectl expose pod nginx --type LoadBalancer --port 80 --name nginx-lb
    
  3. 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
    
  4. minikubeのtunnelコマンドを使用してLaodBalancerに外部IPアドレスを割り当てる
    $ minikube tunnel
    ✅  トンネルが無事開始しました
    
    📌  注意: トンネルにアクセスするにはこのプロセスが存続しなければならないため、このターミナルはクローズしないでください ...
    
    ❗  nginx-lb service/ingress は次の公開用特権ポートを要求します:  [80]
    🔑  sudo permission will be asked for it.
    🏃  nginx-lb サービス用のトンネルを起動しています。
    Password:
    
  5. ブラウザからLoadBalancerへアクセス
    スクリーンショット 2024-10-01 22.49.18.png

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?