Slide 1

Slide 1 text

Webエンジニアのための Kubernetesサクッと入門 株式会社スマートアルゴリズム 代表取締役 齋藤 和也

Slide 2

Slide 2 text

自己紹介 1988年生まれ、福岡県出身、九州工業大学情報工 学部卒。 フリーランスとして2年ほど、Webサービスやスマー トフォンアプリの受託開発を中心に活動。アジャイル 開発を実践し、保守性・拡張性の高い設計を得意と する。 独立前は研究用ソフトウェアの開発に従事してお り、機械学習や自然言語処理といった分野にも明る い。 2015年1月、株式会社スマートアルゴリズムを設 立、代表取締役に就任。

Slide 3

Slide 3 text

ゴール KubernetesでWebアプリを運用する上で 最低限必要な構成要素をおさえよう!

Slide 4

Slide 4 text

Dockerについて 言わずと知れたコンテナ仮想化ソフトウェア VMのようにゲストOSがない分オーバーヘッドが小さい Kubernetesとは何か? | Kubernetesより引用

Slide 5

Slide 5 text

Dockerだけだと何がまずいの? Dockerの役割=コンテナを動かすだけ ● 複数のコンテナをまとめて扱いたい場合は? ● イメージを更新した際のコンテナの入れ替えは? ● 負荷分散はどうする? ● サーバが複数台あったら? オーケストレーションは別で考える必要がある

Slide 6

Slide 6 text

そこでKubernetes!

Slide 7

Slide 7 text

Kubernetes(k8s)とは コンテナオーケストレーションのデファクトスタンダード 複数台のサーバをクラスタ化し、設定内容に応じてコンテナのラ イフサイクルを管理したり自己修復したりしてくれる

Slide 8

Slide 8 text

k8sのアーキテクチャ Kubernetes - Wikipediaより引用 GKE等のマネージドサービスは Masterの面倒を見てくれる kubectlコマンドで クラスタを制御

Slide 9

Slide 9 text

CronJob (fetch-weather) Webアプリ on k8s の構成例 (プログル情報の場合) Pod (proguru-high-xxx) nginx rails Pod (python-xxx) python Service (proguru-high) Service (python) Ingress (proguru-high) high.proguru.jp/* high.proguru.jp/************ Job (fetch-weather-xxx) Deployment (proguru-high) Deployment (python)

Slide 10

Slide 10 text

Deployment ● ローリングアップデートやロールバックといっ たデプロイ管理の仕組みを提供 ● Deployment が ReplicaSet を管理し、 ReplicaSet が Pod を管理する ● Deployment を更新 → 新しい ReplicaSet を生成 → 古い Pod と新しい Pod を入れ替え → 古い ReplicaSet を削除 ● ローリングアップデートの戦略も柔軟にカス タマイズできる

Slide 11

Slide 11 text

Service ● Podをネットワークサービスとして公開するため の仕組みを提供 ● セレクタとポートでどのPodが参照されるか決ま る ● クラスタ外からアクセスできるようにするために、 NodePortを指定するケースが多い クラスタ内に閉じているなら ClusterIPも可 ● クラスタ内DNSにより、サービス名をホスト名と してアクセスできる

Slide 12

Slide 12 text

ConfigMap / Secret ● 値やファイルをクラスタに登録しておき別リ ソースから参照できる仕組みを提供 ● 環境変数として使ったりファイルとしてマウン トしたりといった使い方 ● ConfigMapは単なる設定 Secretは秘匿情報を扱うという使い分け ● Secretについては公式ドキュメントを参照

Slide 13

Slide 13 text

Ingress ● L7ロードバランサを扱う仕組みを提供 ● GCPのロードバランサが作成される (GKE Ingress コントローラが制御) ● アノテーションによって静的 IPを付与したり SSL証明書を紐付けたりできる (ManagedCertificateが必要) ● ロードバランサはクラスタ外にあるため NodePortのサービスじゃないとIngress側か らアクセスできない

Slide 14

Slide 14 text

CronJob ● Cronと同じ仕組みを提供 ● Cronが動いているPodがあるのではなく CronJobがJobを起動する (DeploymentとPodの関係に似ている) ● タイムゾーンはMasterに依存するため、マ ネージドサービスを使う場合はまず 間違いなくUTCになることに留意

Slide 15

Slide 15 text

DaemonSet ● 全ノードで常に1つだけ特定のPodを起動す る仕組みを提供 ● 各ノードのメトリクスを取得したりログを収集 したりする用途が多い ● GKEではクラスタ作成時にオプションをつけ れば自動的にリソースが作られる

Slide 16

Slide 16 text

よくある課題:環境ごとに設定を分けるには? ● プログル全般ではKustomizeというツールを使っている ● ベースのYAMLを用意し、環境ごとに設定を上書き ● Helmというツールもあるが、頻繁に更新されバージョニングさ れないようなWebアプリだと使いにくい印象 ● k8sディレクトリで $ kustomize build overlays/staging を実行してみよう

Slide 17

Slide 17 text

よくある課題:デプロイはどうする? ● プログル全般ではSkaffoldというツールを使っている ● kubectlはk8sクラスタを制御するためのツール Dockerイメージは別途作成する必要がある ● ビルド〜デプロイのパイプラインを制御してくれる プッシュ型のツール ● プル型のツールとしてFluxやArgoCDがある(GitOps)

Slide 18

Slide 18 text

他にもいろいろある 網羅性が高くオススメ https://amzn.to/3ppEYf5 Elasticsearchのクラスタをk8s上に簡単に構築 https://www.elastic.co/jp/elastic-cloud-kubernetes カスタムリソース定義 (CRD)という仕組みにより kind: Elasticsearch というリソースを作成するだけで色々やってくれる

Slide 19

Slide 19 text

Fin.