NPO法人みんなのコード様の社内勉強会にて使用した資料を、許可を得て公開させていただきます。
WebエンジニアのためのKubernetesサクッと入門株式会社スマートアルゴリズム代表取締役 齋藤 和也
View Slide
自己紹介1988年生まれ、福岡県出身、九州工業大学情報工学部卒。フリーランスとして2年ほど、Webサービスやスマートフォンアプリの受託開発を中心に活動。アジャイル開発を実践し、保守性・拡張性の高い設計を得意とする。独立前は研究用ソフトウェアの開発に従事しており、機械学習や自然言語処理といった分野にも明るい。2015年1月、株式会社スマートアルゴリズムを設立、代表取締役に就任。
ゴールKubernetesでWebアプリを運用する上で最低限必要な構成要素をおさえよう!
Dockerについて言わずと知れたコンテナ仮想化ソフトウェアVMのようにゲストOSがない分オーバーヘッドが小さいKubernetesとは何か? | Kubernetesより引用
Dockerだけだと何がまずいの?Dockerの役割=コンテナを動かすだけ● 複数のコンテナをまとめて扱いたい場合は?● イメージを更新した際のコンテナの入れ替えは?● 負荷分散はどうする?● サーバが複数台あったら?オーケストレーションは別で考える必要がある
そこでKubernetes!
Kubernetes(k8s)とはコンテナオーケストレーションのデファクトスタンダード複数台のサーバをクラスタ化し、設定内容に応じてコンテナのライフサイクルを管理したり自己修復したりしてくれる
k8sのアーキテクチャKubernetes - Wikipediaより引用GKE等のマネージドサービスはMasterの面倒を見てくれるkubectlコマンドでクラスタを制御
CronJob (fetch-weather)Webアプリ on k8s の構成例 (プログル情報の場合)Pod (proguru-high-xxx)nginxrailsPod (python-xxx)pythonService (proguru-high) Service (python)Ingress (proguru-high)high.proguru.jp/* high.proguru.jp/************Job (fetch-weather-xxx)Deployment (proguru-high) Deployment (python)
Deployment● ローリングアップデートやロールバックといったデプロイ管理の仕組みを提供● Deployment が ReplicaSet を管理し、ReplicaSet が Pod を管理する● Deployment を更新→ 新しい ReplicaSet を生成→ 古い Pod と新しい Pod を入れ替え→ 古い ReplicaSet を削除● ローリングアップデートの戦略も柔軟にカスタマイズできる
Service● Podをネットワークサービスとして公開するための仕組みを提供● セレクタとポートでどのPodが参照されるか決まる● クラスタ外からアクセスできるようにするために、NodePortを指定するケースが多いクラスタ内に閉じているなら ClusterIPも可● クラスタ内DNSにより、サービス名をホスト名としてアクセスできる
ConfigMap / Secret● 値やファイルをクラスタに登録しておき別リソースから参照できる仕組みを提供● 環境変数として使ったりファイルとしてマウントしたりといった使い方● ConfigMapは単なる設定Secretは秘匿情報を扱うという使い分け● Secretについては公式ドキュメントを参照
Ingress● L7ロードバランサを扱う仕組みを提供● GCPのロードバランサが作成される(GKE Ingress コントローラが制御)● アノテーションによって静的 IPを付与したりSSL証明書を紐付けたりできる(ManagedCertificateが必要)● ロードバランサはクラスタ外にあるためNodePortのサービスじゃないとIngress側からアクセスできない
CronJob● Cronと同じ仕組みを提供● Cronが動いているPodがあるのではなくCronJobがJobを起動する(DeploymentとPodの関係に似ている)● タイムゾーンはMasterに依存するため、マネージドサービスを使う場合はまず間違いなくUTCになることに留意
DaemonSet● 全ノードで常に1つだけ特定のPodを起動する仕組みを提供● 各ノードのメトリクスを取得したりログを収集したりする用途が多い● GKEではクラスタ作成時にオプションをつければ自動的にリソースが作られる
よくある課題:環境ごとに設定を分けるには?● プログル全般ではKustomizeというツールを使っている● ベースのYAMLを用意し、環境ごとに設定を上書き● Helmというツールもあるが、頻繁に更新されバージョニングされないようなWebアプリだと使いにくい印象● k8sディレクトリで$ kustomize build overlays/stagingを実行してみよう
よくある課題:デプロイはどうする?● プログル全般ではSkaffoldというツールを使っている● kubectlはk8sクラスタを制御するためのツールDockerイメージは別途作成する必要がある● ビルド〜デプロイのパイプラインを制御してくれるプッシュ型のツール● プル型のツールとしてFluxやArgoCDがある(GitOps)
他にもいろいろある網羅性が高くオススメhttps://amzn.to/3ppEYf5Elasticsearchのクラスタをk8s上に簡単に構築https://www.elastic.co/jp/elastic-cloud-kubernetesカスタムリソース定義 (CRD)という仕組みによりkind: Elasticsearchというリソースを作成するだけで色々やってくれる
Fin.