Kubernetes(k8s)を学ぼう3! Networking編 – Pod間通信 –

こんにちは。KOUKIです。k8s学習中のWebエンジニアです。

前回は、Networkingを学ぶため、開発環境の構築を行いました。

今回は、NetworkingをDeploymentやServiceを作成しつつ学んでいこうと思います。

実行環境について

筆者の環境では、k8sはminikube上で動いています。

実行環境については、こちらの記事を参考にしてください。

minikubeスタート

次のコマンドで、minikubeを起動しましょう。

Docker Hub – レポジトリ作成

筆者の環境で起動したk8sは、Virtualbox上で動いています。これはローカル環境から切り離されているので、ローカル上のDocker imageを使うことができません。

そのため、Docker HubにDocker imageをPushしておき、イメージを使う時は、そこからPullするようにします。

Docker Hub上で次のレポジトリを作成しておきましょう。

  • kub-demo-users
  • kub-demo-auth
  • kub-demo-tasks

users api

最初に、users apiの環境を構築しましょう。

Deploymentの作成

Deploymentを作成します。

まずは、users-apiのイメージを作成し、Docker Hubへpushします。

docker hubのアカウント」には、Docker Hubの登録時に作成したアカウント名を指定してください。

次に、deployment.ymlファイルを作成します。

users-deployment.ymlの設定内容は、以下です。

この設定ファイルを元に、Deploymentを作成します。

OKですね。モジュールのインストールなどしているので、Podの立ち上がりは遅めです。

Serviceの作成

クラスタ内に構築したDeploymentは、外部(私たちの環境)とは隔絶されており、リクエストを送ることができないため、穴を開ける必要があります。

そこで、Serviceを作って外部間通信を可能にします

ServiceのTypeには、「LoadBalancer」を指定しました。タイプは3つあり、LoadBalancerは、次の特性を持っています。

LoadBalancer: クラウドプロバイダーのロードバランサーを使用して、Serviceを外部に公開します。クラスター外部にあるロードバランサーが転送する先のNodePortClusterIP Serviceは自動的に作成されます。

公式サイトより

これで、クラスタ内外と通信ができるはずです。

動作確認

動作確認をしましょう。

「minikube service」で、Serviceが起動します。

筆者の環境だと起動後に「http://192.168.99.100:30499/」のURLが割り当てられたので、次のエンドポイントにリクエストを送ってみます。

エンドポイント: http://192.168.99.100:30499/signup

現状、他のAPIが起動していないので500エラーになりますが、ローカルからリクエストが送れることは確認できたと思います。

Pod内に複数のコンテナを起動させる

先ほど作成したusers-apiのPodにauth-apiを追加します。一つのPod上で2つのコンテナが動くイメージですね。

事前準備

auth-apiをビルドして、Docker Hubにpushしておきます。

Deploymentの修正

続いて、users-deployment.ymlファイルを修正します。

deployment.ymlのcontainersにauth podの設定を追加しました。これだけで同じPod上で複数のコンテナを動作させることができます

また、AUTH_SERVICE_SERVICE_HOST(環境変数)を設定しました。同一のPod上で動くコンテナ間通信は「localhost」で通信可能なので、このような設定にしています。

AUTH_SERVICE_SERVICE_HOSTは環境変数なので、Goで値を取得しています。

動作確認

Deploymentをアップデートして、動作確認をしましょう。単純に、applyをかければOKです。

READYが「2/2」となっているので、Podが2つ起動していることがわかります。

さて、準備は整ったので、先ほどと同じエンドポイントにリクエストを送ってみましょう。

エンドポイント: http://192.168.99.100:30499/signup

今度は無事にリクエストが送れました。

auth api

次は、auth apiの環境を構築します。

Deploymentを作成

users-apiとauth-apiのコンテナを同一のPod上で作成しましたが、やはり別々のPod上で動かした方が良さそうです。authもDeploymentを作成しましょう。

auth-deployment.ymlの中身は、users-apiをほぼ同じです。

users-deployment.ymlからもauth-apiコンテナを削除しておきます。

Serviceの作成

auth-apiのServiceも作成しましょう。

これもusers-service.ymlの設定とほとんど同じです。

ただし、typeに「ClusterIP」を指定しています。このサービスは、クラスター内部で通信するためのIPアドレスを自動で付与してくれるサービスです。

ClusterIP: クラスター内部のIPでServiceを公開する。このタイプではServiceはクラスター内部からのみ疎通性があります。このタイプはデフォルトのServiceTypeです。

公式サイトより

auth-apiは、唯一他のAPIからのみアクセスされるAPIなので、外部に公開する必要はありません。それ故に、ClusterIPで問題ありません。

applyしてみましょう。

サービスを確認すると「10.101.21.185」のIPアドレスが振り分けられていることがわかります。

このIPアドレスを、users-deployment.ymlに設定していた「localhost」と入れ替えます。

これで、同一クラスタ内のPod間通信が可能なはずです。

users-apiのDeploymentを更新します。

Deploymentが作成されていることがわかりますね。usersdeployment(名前間違えた)は、前回起動したDeploymentです。

これはもういらないので、下記のコマンドで削除しておきます。

ClusterIPの不便な点

実は、ClusterIPには一つ不便な点があります。auth-apiのServiceを下記のコマンドで再作成してください。

今度は、「10.110.246.90」のIPアドレスが割り当てられました。ClusterIPサービスは、サービスが再作成されるたびに新しいIPアドレスを割り当てます

これは、超不便です。ここの例で言うとusers-deployment.ymlに設定したIPアドレスを手作業で書き換えないといけません。

IPアドレスを動的に割り当てる

実は、回避策があります。

kubernetesでは、ClusterIPのIPアドレスを変数で取得できます。命名ルールがちょっと難しいですが、このサンプルの例では以下のように指定すると取得できます。

AUTH_SERVICEは、auth-service.ymlに設定したmetadataのnameです。詳しくは、「ここ」を参照してください。

既にGoコード(users-api/main.go)には、「authAddr = os.Getenv(“AUTH_SERVICE_SERVICE_HOST”)」の設定がされているのでDeploymentを作成し直す必要はありません。

しかし、今回のようにdeployment.ymlを変更せず、ソースファイル(Go言語)のみ変更した場合は、普通にapplyしても変更内容を読み込んでくれないので、一旦deploymentを削除し、再び作成する必要があります。

動作確認

先ほどのエンドポイントにリクエストを送り、通信ができるか確認してみましょう。

エンドポイント: http://192.168.99.100:30499/signup

OKですね。

DNSを導入

DNS(Domain Name System)を使って、Pod間通信が可能か確認したいと思います。

kubernetesのDNSについて

kubernetesのDNSは、「service name + . + ネームスペース」で取得できるようです。※自動的に作成してくれる

namespaceは、クラスター内部の環境を仮想的に分割する役割を持っており、デフォルトでは、「default」のnamespaceでDeploymentやServiceが起動します。

users-deployment.ymlに設定したIPアドレスをDNSに書き換えてみましょう。

これで、DNSが使えるようです。

DeploymentをUpdateします。

DNSが有効か確認する手順(やらなくて良い)

DNSを導入したので、一応確認する手段を書いておきます。

Goコード(users-api/main.go)の中で、「authAddr = os.Getenv(“AUTH_SERVICE_SERVICE_HOST”)」のAUTH_SERVICE_SERVICE_HOSTをAUTH_ADDRESSに書き換えてください。

続いて、次のコマンドを入力してください。

ここまで完了したら、以下のエンドポイントにリクエストを送ってみましょう。

エンドポイント: http://192.168.99.100:30499/signup

OKですね。kubernetes Serviceが自動的に作る環境変数とDNS、どちらも使えそうですね。

tasks api

tasks-apiの環境も整えていきましょう。

Docker HubへPush

tasks-apiのビルドイメージもDocker HubへPushしておきます。

Deploymentの作成

tasks-apiのDeploymentを作成しましょう。

users-apiのDeploymentを参考に、Deploymentの設定を行いましょう。

Serviceの作成

tasks-apiのServiceも作成します。

こちらもusers-apiのServiceを参考に、設定をしましょう。

動作確認

次のコマンドで、動作確認を行いましょう。

http://192.168.99.100:32287」のURLで、tasks-apiが起動しました。

これにより、以下のエンドポイントに向けて、リクエストが送れるようになりました。

エンドポイント: http://192.168.99.100:32287/tasks

OKですね。

注意点としては、Headerに「Authorization」と「Bearer abc」を設定する必要があります。

次回

次回は、フロントエンド(React)を導入してみましょう。

記事まとめ

コメントを残す