※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。


【Kubernetes】ServiceのIPアドレスとポートについて

kubernetes Minikube k8s サーバー開発 IPアドレス

投稿日:2020年10月10日

このエントリーをはてなブックマークに追加
KubernetesのServiceはPodへの抽象的な接続を定義します。この記事では内部クラスターからのServiceへの接続方法と、Minikubeの仮想環境でKubernetesを起動している場合のホストからの接続方法について解説します。

はじめに

KubernetesのServiceのアクセス方法について解説します。


アクセス方法

Serviceへの接続の種類

MinikubeでKubernetesのServiceへのアクセスは次の2つのパターンに分けられます。

  • Kuebrnetesのクラスター内部からのアクセス。
  • ホストマシンからのアクセス。

クラスター内部からのアクセス

クラスター内部からのアクセスは例えば、Redisのレプリケーション時にレプリカからマスターへの接続や、WebアプリケーションからMySQLへの接続が考えられます。この接続はServiceのDNS名またはそのIPアドレスと、Portを使うことができます。

ServiceのDNS名はmy-svc.my-namespace.svc.cluster.localになります。

  • my-svc:Serviceの名前です。.metadata.nameの値がこれになります。
  • my-namespace:Serviceのnamespaceです。.metadata.namespaceの値です。

ServiceのIPアドレスとPort番号についてはkubectl describe svc <サービス名>コマンドを使用して確認することができます。

ターミナル
$ kubectl describe svc service-redis-master
Name:                     service-redis-master
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 name=redis-master
Type:                     LoadBalancer
IP:                       10.104.249.53
Port:                     redis  6379/TCP
TargetPort:               6379/TCP
NodePort:                 redis  31584/TCP
Endpoints:                172.17.0.3:6379
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

IPがIPアドレスでPortがポート番号です。

ホストからのアクセス

細かい話をする前にホストからKubernetesのServiceにアクセスする場合には、そのServiceがNodePortを持っている、つまりServiceのTypeがLoadBalancerNodePortである必要があります。

Minikubeなどをつかってローカルの仮想環境にKubernetesを起動している場合は、ホストからアクセスして確かめたい場合などあると思います。

KubernetesのServiceにはクラスター内部のIPアドレスとPort番号、そしてDNS名が割り振られていますが、ホストからこれらを使ってアクセスすることはできません。

MinikubeのKubernetes環境はあくまで仮想環境の上で動いているため、ローカルのホストマシンのネットワークにServiceのIPアドレスが割り振られているわけではないのです。実際にはMinikubeの仮想マシンのポートに対してServiceがプロキシされている様な状態です。

そのため、アクセスするときにはMinikubeの仮想マシンのIPアドレスとServiceに割り当てられた仮想マシンのポート番号を使用します。

MinikubeのIPアドレスを取得するにはminikubeコマンドを使用します。

ターミナル
$ minikube ip
192.168.39.220

Serviceに割り当てられたポート番号はkubectl descrive svc <サービス名>のコマンドで取得できます。

ターミナル
$ kubectl describe svc service-redis-master
Name:                     service-redis-master
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 name=redis-master
Type:                     LoadBalancer
IP:                       10.104.249.53
Port:                     redis  6379/TCP
TargetPort:               6379/TCP
NodePort:                 redis  31584/TCP
Endpoints:                172.17.0.3:6379
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

ここでNodePortが割り当てられたPortです。

例えばこのServiceがredisのPodに割り当てられている場合、次の様に接続できます。

ターミナル(ホスト)
$ redis-cli -h 192.168.39.220 -p 31584

またMinikubeの場合にはminikube service --url <サービス名>というコマンドを使って直接確認することもできます。

ターミナル
$ minikube service --url service-redis-master
http://192.168.39.220:31584
このエントリーをはてなブックマークに追加


関連記事

記事へのコメント