こんにちは。KOUKIです。k8s学習中のWebエンジニアです。
KubernetesでMicroservicesのデプロイ方法を学びましょう。
本記事では、Networkingについて解説します。
尚、今回もMinikubeを使いますので、以下の記事でインストール&起動してください。
※ MacおよびChromeで検証します。
<目次>
参考
Udemyの「Kubernetes Hands-On – Deploy Microservices to the AWS Cloud」コースを参考にしています。
解釈は私が勝手に付けているので、本物をみたい場合は受講してみてください。
API OVERVIEWも参考になります。
前回
現在の状況は、以下のようになってます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ kubectl get all NAME READY STATUS RESTARTS AGE pod/queue 1/1 Running 3 2d pod/webapp-5b7867fdd5-bxxzx 1/1 Running 0 6m40s pod/webapp-5b7867fdd5-nr42p 1/1 Running 0 7m13s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fleetman-queues NodePort 10.107.33.216 <none> 8161:30010/TCP 2d service/fleetman-webapp NodePort 10.111.31.12 <none> 80:30080/TCP 2d service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/webapp 2/2 2 2 50m NAME DESIRED CURRENT READY AGE replicaset.apps/webapp-5b7867fdd5 2 2 2 32m replicaset.apps/webapp-b548ff9c5 0 0 0 50m |
Networking
コンテナ間で通信することを考えてみましょう。
例えば、一つのPodにWebAppコンテナとMySQLコンテナが稼働しているとしましょう。
このような場合は、localhostで接続できるので通信制御は楽です。

しかし、Pod内に複数のコンテナを稼働させるやり方は、Pod管理を複雑にします。
そのため、Serviceで分ける方法が推奨されます。

これならPod管理が楽になります。
kube-dns
しかし、Service間でどうやってお互いの存在を認識するのでしょうか?
実は、KubernetesにはDNSの仕組み(kube-dns)が提供されています。

kube-dnsは、Kubernetesが自動で作成してくれます。
Namespace
Kubernetesには、Namespace(名前空間)があります。
この機能のおかげで、一つのCluster内で機能ごとにアプリケーションを区切ることなどができます。

Namespaceを指定しない場合、「default」という名前のNamespaceが指定されます。
Namespaceは、下記のコマンドで確認できます。
1 2 3 4 5 6 7 |
$ kubectl get ns NAME STATUS AGE default Active 7d kube-node-lease Active 7d kube-public Active 7d kube-system Active 7d kubernetes-dashboard Active 3d |
結構たくさんのNamespaceがありますね。
Namespaceを指定して、Podの情報を取得しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ kubectl get all -n kube-system NAME READY STATUS RESTARTS AGE pod/coredns-f9fd979d6-sp49l 1/1 Running 8 7d pod/etcd-minikube 1/1 Running 9 7d pod/kube-apiserver-minikube 1/1 Running 9 7d pod/kube-controller-manager-minikube 1/1 Running 9 7d pod/kube-proxy-w2p9v 1/1 Running 8 7d pod/kube-scheduler-minikube 1/1 Running 9 7d pod/storage-provisioner 1/1 Running 16 7d NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 7d NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 7d NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/coredns 1/1 1 1 7d NAME DESIRED CURRENT READY AGE replicaset.apps/coredns-f9fd979d6 1 1 1 7ds |
kube-system Namespaceの全ての情報を表示しました。kube-dns Serviceもここに存在してますね。
もう一度お伝えしますが、Namespaceを指定しない場合、「default」の情報が取得されます。
これまで作成したPodはNamespaceを指定していないので、defaultのNamespaceで稼働しています。
1 2 3 4 5 |
$ kubectl get po NAME READY STATUS RESTARTS AGE queue 1/1 Running 4 3d webapp-5b7867fdd5-bxxzx 1/1 Running 1 23h webapp-5b7867fdd5-nr42p 1/1 Running 1 23h |
Networking Test
NetWorkingのTest用にMySQLのServiceとPodを設置しましょう。
1 2 |
# ファイル作成 touch networking_tests.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# networking_test.yml apiVersion: v1 kind: Pod metadata: name: mysql labels: app: mysql spec: containers: - name: mysql image: mysql:5 env: # Use secret in real life - name: MYSQL_ROOT_PASSWORD value: password - name: MYSQL_DATABASE value: fleetman --- kind: Service apiVersion: v1 metadata: name: database spec: selector: app: mysql ports: - port: 3306 type: ClusterIP |
ServiceのTypeは「ClusterIP」を指定しています。
ClusterIP
タイプの Service を作成すると、Kubernetes が、クラスタ内のノードからアクセス可能な固定の IP アドレスを作成します。これにより、Pod間通信が可能なはずです。

applyしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# apply $ kubectl apply -f networking_tests.yml $ kubectl get all NAME READY STATUS RESTARTS AGE pod/mysql 0/1 ContainerCreating 0 20s pod/queue 1/1 Running 5 3d23h pod/webapp-5b7867fdd5-bxxzx 1/1 Running 2 46h pod/webapp-5b7867fdd5-nr42p 1/1 Running 2 46h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/database ClusterIP 10.111.237.200 <none> 3306/TCP 20s service/fleetman-queues NodePort 10.107.33.216 <none> 8161:30010/TCP 3d23h service/fleetman-webapp NodePort 10.111.31.12 <none> 80:30080/TCP 3d23h service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d22h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/webapp 2/2 2 2 47h NAME DESIRED CURRENT READY AGE replicaset.apps/webapp-5b7867fdd5 2 2 2 46h replicaset.apps/webapp-b548ff9c5 0 0 0 47h # kube-dnsのIPも確認しておく $ kubectl get service -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 7d23h |
webapp Podにアクセスして、Pod内部からMySQL Podに通信できるか確かめてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# webapp Pod内にアクセス $ kubectl exec -it pod/webapp-5b7867fdd5-bxxzx sh / # / # cat /etc/resolv.conf nameserver 10.96.0.10 <<<<<<<<<<<<<<<<<<<<<< kube-dnsのIPアドレス search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 / # / # nslookup database <<< mysqlのservice名 nslookup: can't resolve '(null)': Name does not resolve Name: database Address 1: 10.111.237.200 database.default.svc.cluster.local <<<< IPアドレスは検索できてる # mysqlクライアントをインストールする / # apk update / # apk add mysql-client # mysqlに接続 / # mysql -h database -u root -ppassword fleetman Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.36 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [fleetman]> MySQL [fleetman]> create table testtable (test varchar(255)); Query OK, 0 rows affected (0.02 sec) MySQL [fleetman]> show tables; +--------------------+ | Tables_in_fleetman | +--------------------+ | testtable | +--------------------+ 1 row in set (0.00 sec) MySQL [fleetman]> exit Bye / # |
OKですね。
次回
次回は、アプリケーションのデプロイについて学びましょう。
コメントを残す
コメントを投稿するにはログインしてください。