Katsuya Kawabe •CyberAgent group Infrastructure Unit インフラ基盤を開発するソフトウェアエンジニアです AKE, OpenStack, ML Platform などの開発、運用をしています •趣味 漫画 最近は「ブルーロック」「左利きのエレン」が熱い 音楽 なんでも聴きます。BUMP OF CHICKEN が一番好き
Namespace による分離 Pod Pod Pod Service Service Pod Pod Service Service “Staging” Namespace Pod Pod Service “Decvelopment” Namespace アプリ開発者 Namespace という分離機能があり、リソースの分離や Namespace 単位でのア クセス許可といったことができます。 今回は default Namespace 内での操作しかしませんが、重要な概念です “Production” Namespace SRE
使用する環境: 1人1クラスタ Pod Pod Pod Service Service “User A” Cluster User A User B VM に SSH してもらい、kubectl コマンドでクラスタを操作してもらいます。 他人のクラスタは SSH しないと操作できませんが、間違えないように注意してくださ い。 Pod Pod Pod Service Service “User B” Cluster
Pod とは Container Container NIC Container Container NIC NIC Pod は一つ以上のコンテナから構成される、Kubernetes におけるコンテナ実行に関する最小単位のリソースです。 アプリケーションをコンテナ化して動かしたい場合は最終的には Pod が作成されることになるはず。 IP アドレスは Pod 単位で割り当てられます => ネットワークの名前空間を共有 つまり、内部のコンテナで同じポート番号でサーバをリッスンしようとするとどちらかは失敗します
Pod にリクエストを投げてみよう # Pod の IP を確認しよう $ kubectl get pod -owide # kubectl run でデバッグ用の Pod を建てて echo-pod にアクセスしてみる # foo と出力されれば成功 $ kubectl run busybox -it --rm --image=busybox --restart=Never -- /bin/sh -c "wget -q -O- :8080"
ReplicaSet で複数の Pod を管理 • Pod のレプリカを作成して指定した数の Pod を稼働させるリソース • 冗長性、スケールインやスケールアウトを実現するリソースの一つ • 後述する Deployment と合わせて Pod -> ReplicaSet -> Deployment という親子構造がある Pod Pod Pod Pod Pod ReplicaSet (Replica 数 = 5) 図引用: Kubernetes 完全ガイド 第一版
ReplicaSet で複数の Pod を管理 • Pod のラベルで数を調節 ReplicaSet (Replica 数 = 3) metadata.labels で該当する app: nginx ラベルがついた Pod を探 す Pod app: echo Pod app: test Pod app: nginx Pod app: nginx Pod app: nginx 図引用: Kubernetes 完全ガイド 第一版
Deployment で ReplicaSet を管理 • Deployment は複数の ReplicaSet を管理することで、ローリングアップデートやロールバックと いった、実運用においてアプリケーションの稼働状態を保ちながら変更する仕組みを実現して います Pod Pod Pod Old ReplicaSet (Replicas = 3) New ReplicaSet (Replicas = 0) Pod Pod Pod Old ReplicaSet (Replicas = 3) New ReplicaSet (Replicas = 1) Pod Pod Pod Pod Old ReplicaSet (Replicas = 2) New ReplicaSet (Replicas = 2) Pod Pod Pod Old ReplicaSet (Replicas = 0) New ReplicaSet (Replicas = 3) Pod 図引用: Kubernetes 完全ガイド 第一版
Service: Kubernetes のネットワーク • Service は Pod 宛のトラフィックをロードバランシングするリソースです • サービスディスカバリとクラスタ内 DNS で利用 • 外部からのリクエストもロードバランシングできる NIC Pod Pod NIC Pod NIC Pod Pod Node Network Pod Network 図引用: Kubernetes 完全ガイド 第一版
Service: Kubernetes のネットワーク NIC Pod In Cluster VIP NIC Pod Pod NIC Endpoint (LB VIP) Pod Pod Pod kube-proxy kube-proxy kube-proxy 図引用: Kubernetes 完全ガイド 第一版 Node Network Pod Network • 外部のロードバランサが払い出す IP やクラスタ内でのみ使用可能な IP などを提供するリソース • それぞれの外部のロードバランサを利用する場合、プロバイダごとに実装が異なります • Pod への通信は kube-proxy によってノードから Pod の仮想 NIC にルーティングされます
Kubernetes でのサービスディスカバリ NIC Pod In Cluster VIP NIC Pod Pod NIC Pod Pod Pod kube-proxy kube-proxy kube-proxy 図引用: Kubernetes 完全ガイド 第一版 Node Network Pod Network • クラスタ内でのみ有効な DNS を利用してサービス間の通信を実現できる • Pod, Service に対して固有のレコードがクラスタ上の DNS に追加される • Pod から透過的に、別サービスの Pod へリクエストを送信することができる To: service-b.default.svc.cluster.local
Service の種類 • Cluster IP : クラスタ内部でのみ使用可能な仮想 IP を持つ Service • NodePort : <全ての Node の IP アドレス>: Port の組みでトラフィックを受ける Service • LoadBalancer : Kubernetes クラスタ外のロードバランサを利用して、トラフィックを受ける Service。L4 のロードバランシング実現するためのリソース
Cluster IP のルーティング NIC Pod Pod Pod Network app: echo 10.0.0.10:80 NIC Pod app: echo 10.0.1.20:80 NIC Pod Pod app: echo 10.0.2.30:80 ClusterIP Service (10.100.100.100:8080) kube-proxy 図引用: Kubernetes 完全ガイド 第一版
NodePort のルーティング NIC Pod Pod Pod Network app: echo 10.0.0.10:80 NIC Pod app: echo 10.0.1.20:80 NIC Pod Pod app: echo 10.0.2.30:80 NodePort Service (*:30010) • 全ての Node の特定の Port でリクエストを受け付けるサービスを作成する • Kubernetes 外部からも 30010 にアクセスするとバックエンドの Pod にリクエストが送信できる • 外部との疎通性を確立する手法の1つ • ポート番号は指定できるが、指定しない場合は Kubernetes が使用していないポート番号をあらかじめ指定したレンジ から割り振ります
kube-dns • Kubernetes クラスタ内部の名前解決やサービスディスカバリに利用される DNS です • Pod からのリクエストを解決する際は、まず kube-dns に問合せが行われ、それでも解決できな い場合は上流の DNS で解決を試みます • 最初から kube-dns ではなく、自前で建てた DNS に解決させたい場合も Pod 側で個別に設定 可能