投稿日:2020年10月10日
KubernetesのServiceはPodへの抽象的な接続を定義します。この記事では内部クラスターからのServiceへの接続方法と、Minikubeの仮想環境でKubernetesを起動している場合のホストからの接続方法について解説します。
KubernetesのServiceのアクセス方法について解説します。
MinikubeでKubernetesのServiceへのアクセスは次の2つのパターンに分けられます。
クラスター内部からのアクセスは例えば、Redisのレプリケーション時にレプリカからマスターへの接続や、WebアプリケーションからMySQLへの接続が考えられます。この接続はServiceのDNS名またはそのIPアドレスと、Portを使うことができます。
ServiceのDNS名はmy-svc.my-namespace.svc.cluster.local
になります。
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がLoadBalancerかNodePortである必要があります。
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