Kubernetes運用前に勉強していること基礎編03-04
注意
本記事の内容は個人的な勉強・備忘録を目的としており、勤務先や関係者とは一切関係ありません。
はじめに
Kubernetesの本番環境での運用を始めるにあたり、個人で勉強している内容を整理した記事です。構築や運用に必要な知識、注意点、実践して学んだことを随時更新していきます。基礎編の想定読者はコンテナの知識があり、Kubernetesでコンテナ運用したいがどうすればいいかを迷っている人です。今回は前回の引き続きで、Kubernetesのリソースカテゴリを学ぶことを目的としています。
勉強中の主な内容
- 基礎編
- クラウドネイティブとは
- Kubernetesのアーキテクチャ概要
- Kubernetesのリソース(今回の話)
Service APIs
Service(サービス)リソースおよび関連するネットワークリソースは、Kubernetes上のアプリケーション間の通信や、外部からのアクセス経路を抽象化するためのものである。複数のPodを1つの論理的なサービスエンドポイントに束ねたり、ロードバランシングやサービスディスカバリを行う役割である。Kubernetesにおけるサービス周りの代表的リソースは次のとおりである。
- Service
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
- Headless
- Ingress
サービス関連リソースはクラスタ内外の通信を管理するための抽象レイヤを提供し、動的に変化するPod群に対して安定したアクセス方法を確立している。以下、それぞれのリソースとその関係、ユースケースを解説する。
前提知識
サービスディスカバリーパターンはサービスを提供するインスタンスに対して、そのサービスの利用背がアクセスできる、安定したエンドポイントを提供する。サービス指向アーキテクチャにおいて、サービスプロバイダー(Pod)はそのサービス機能を提供するのに加えて、自身をサービスレジストリに登録する必要があり、サービスコンシューマーはそのサービスへ到達するためのレジストリ情報にアクセスできる。図はkubenetesによって登録と検索がお紺われているかを示している図である。
Service
Serviceは、一連のPodに対するシングルなアクセスポイント(仮想IPとホスト名)を提供するKubernetesリソースである。通常、Serviceはラベルセレクタにより対象となるPod群(たとえばapp: frontendというラベルを持つ全Pod)を動的に紐づけ、その集合に対して仮想的なIPアドレス(ClusterIP)とDNS名を割り当てる。クラスター内部では、他のPodはそのClusterIPやDNS名を使ってサービスにアクセスすれば、背後にいる実Podへとリクエストがロードバランシングされる。要するに、ServiceはPodの集合に対するネットワークフロントエンドの役割である。これから、サービスの主な型(Type)と用途について説明する。
ClusterIP
デフォルトのタイプで、クラスター内部にのみ有効な仮想IP(ClusterIP)を付与する。サービス発見は自動登録されるDNS名(<サービス名>..svc.cluster.local)で行う。他のPodからはこのDNS名かClusterIP宛に通信すれば、Serviceが背後のPodにトラフィックを流れる。図のように内部的なサービスディスカバリーとして用いられるリソースである。
NodePort
各ワーカーノードの特定ポート(30000-32767の範囲から割り当て)を開放し、そのポートへの通信をServiceに転送する。NodeのIP:NodePortでクラスター外からアクセス可能になるが、負荷分散はクライアント側で各ノードに振り分ける必要がある。シンプルな開発用途や、独自のロードバランサを別途配置する場合などに利用している。
LoadBalancer
クラウドプロバイダ統合されたロードバランサをプロビジョンし、外部アクセスをServiceに流すためのタイプである。AWS EKSでは、このServiceを作成するとAWSのElastic Load Balancer (ELB)が自動的に割り当てられる。
結果として、インターネットからのアクセス用にAWS側のパブリックIPやDNS名を持つLB(クラシックロードバランサー)が用意され、受信した通信をクラスタ内の各Podに配分される。本番環境で外部公開する際によく使われる。
所感
kubenetesを運用するうえで、ネットワークトラブルで運用が難しいと聞く、今回のサービスについて説明しているが、本質的には一般的なネットワーク設計の知識を持っていれば、理解しやすいと思われる。今後、別記事でネットワークに対する記事も書いていきたいと思う。次の記事は引き続き、サービスの説明を行います。