Kubernetesに対する批判的ガイド
- Kubernetesは一部の技術者の間で、不必要に複雑で時間の無駄だという評判を得ており、小規模なチームで使うのは過剰設計だと見なされている。
- Jamsocketでは数年間にわたりKubernetesを本番環境で運用し、必要な機能だけを使って残りは無視する形で、効率的な使い方を見つけた。
Kubernetesを使う理由
- Kubernetesは、次の3つをすべて求めるときに最もよく踏み固められた道である。
- 複数のプロセス/サーバー/スケジュール済みジョブを実行したいとき。
- それらを冗長化して実行し、負荷分散したいとき。
- それらの設定や相互関係をコードで構成したいとき。
- Kubernetesは、コンピュータのプールを1台のヘッドレスコンピュータのように扱える抽象化レイヤーである。
- Jamsocketは1日に何度もデプロイしており、製品に問題が起きると顧客の製品にも影響が及ぶため、ローリングデプロイによって頻繁にデプロイできる自信を得ている。
Kubernetesの使い方
- Jamsocketは、Webアプリと通信できる動的プロセスを生成するサービスで、AWS Lambdaに似ているが、プロセスの寿命は単一のリクエスト/レスポンスではなくWebSocket接続に依存している。
- Kubernetesは、APIサーバー、コンテナレジストリ、コントローラー、ログ収集基盤、一部のDNSサービス、メトリクス収集など、長時間稼働するプロセスの運用に使われている。
- Kubernetesを使わないもの: 一時的なプロセス、静的/マーケティングサイト、直接データを保存するもの。
- Google Kubernetes Engineを使ってKubernetesの管理を外部に委ねており、必要であればAmazon EKSへの移行も比較的容易である。
積極的に使っているKubernetesリソース
- Deployments: ほとんどのPodはデプロイメントを通じて作成される。
- Services: 内部サービス向けにClusterIP、外部サービス向けにLoadBalancerを使用。
- CronJobs: クリーンアップスクリプトなどのために使用。
- ConfigMapsとSecrets: 上記リソースにデータを渡すために使用。
慎重に使っているもの
- StatefulSetとPersistentVolumeClaimは使っているが、重要なデータはKubernetes外部のマネージドサービスに保存することを好んでいる。
- RBACは複雑さを増すため、可能な限り避けている。
積極的に避けているもの
- 手作業でのYAML記述: TypeScriptとPulumiを使ってKubernetesリソース定義を生成。
- 非標準リソースやオペレーター: サードパーティ製ソフトウェアがKubernetesのインフラを利用できるようにするが、実際には扱いにくい。
- Helm: オペレーターとYAMLの規約のため使わない。
- 名前に"mesh"が入っているものはすべて: 必要ないと判断している。
- Ingressリソース: 不要な間接層を増やすのを避ける。
- 完全なk8sスタックをローカルで再現すること: Docker Composeや独自スクリプトを使い、必要なシステムの一部だけを起動する。
人がPodを待つべきではない
- Kubernetesは、コンテナの起動時間よりも堅牢性とモジュール性を重視して設計されており、人がPodの起動を待つようなケースには向いていない。
- Jamsocketは、MITライセンスのRustオーケストレーターであるPlaneを使って、対話型ワークロード向けのプロセスを高速にスケジューリングして実行している。
より高水準の抽象化
- Kubernetesの代替手段の中には非常に優れたものもあり、特にインフラをコードとして定義する必要がない場合に有用である。
- Railway、Render、Flight Controlのようなサービスを使い、Kubernetesの代わりに別のソリューションを選ぶこともできる。
- Kubernetesへのアプローチを体系的に管理しているなら、誰にも早すぎるとは言えない。
GN⁺の見解
- Kubernetesは、特に大規模システムにおける複雑性の管理と自動化に強力なツールである一方、その複雑さは小規模なプロジェクトやスタートアップにとって負担になりうる。
- この記事は、Kubernetesを使う際に生じうる過度な複雑さを避ける方法を示すことで、初心者や小規模チームでもKubernetesの利点を活用できるよう助けている。
- Kubernetesを使う前に、本当に必要な機能とチームの技術的力量を考慮し、管理の複雑さやコストに見合う利点があるかを慎重に評価すべきである。
- Kubernetesの代わりに、よりシンプルで管理しやすいサービスを使う方が良い場合もある。たとえばDocker Swarm、Apache Mesos、Nomadなどがあり、それぞれに長所と短所がある。
- Kubernetesを導入する際には、既存インフラとの統合、セキュリティ、運用コスト、そして学習曲線などを考慮する必要がある。
- Kubernetesを選ぶことで得られる利点は、スケーラビリティ、高可用性、そして多様なクラウド環境における一貫したデプロイ体験である。ただしそのためには、必要なリソース管理とオーケストレーションへの理解が求められる。
1件のコメント
Hacker Newsのコメント
1つ目のコメントの要約:
2つ目のコメントの要約:
kubectl explain XはAWSのドキュメントよりはるかに優れていると主張している。3つ目のコメントの要約:
4つ目のコメントの要約:
5つ目のコメントの要約:
6つ目のコメントの要約:
7つ目のコメントの要約:
8つ目のコメントの要約:
9つ目のコメントの要約:
10つ目のコメントの要約:
kustomizeを使うことを好んでいる。