
2026/04/24 12:07
親愛なる朋友、あなたは Kubernetes を構築されました(2024)。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
本文は、本論争に着手する前に「Dear Sir, You Have Built a Compiler」という記事を読むよう読者に勧めています。Kubernetes の代わりとして「退屈な技術」を選択しようとする開発者は、しばしばその複雑なアーキテクチャを無意識のうちに見直すことになります。最初にカスタムシェルスクリプトを使用してから半年でインフラストラクチャに破壊的な失敗があった際、開発者らは Docker Compose に切り替えたものの、ロールアウト更新、高可用性、スケール링といった不可欠なニーズには不十分であったと発見しました。結局、これらの高度な機能を手動で実装する必要に迫られました。ファイアウォール、オーバーレイネットワーク(例:Tailscale)、Ansible による管理が可能な不変 VM を含むスタックが拡大するにつれて、非公式なシェルスクリプトへの依存は、従業員の異動時に著しい保守負担を招きました。状況が悪化したのは、セキュリティ要件から Docker ソケットのマウントやカスタム API プクシーの記述が強制され、デプロイメント、ネットワーキング、サービスディスカバリー、不変ノード、API サーバーなど、Kubernetes クラスターのコモポネントを実質的には構築せずにそれを実体化することにつながったためです。結局のところ、オーケストレーションツールの過剰な複雑さを理由に見下すことは、これらの利点を手動で再現するのに要する莫大な努力を軽視することに他なり、脆弱な環境と重大な運用リスクを生み出します。したがって、専門的なツールは単なる選択肢ではなく、信頼性の高いインフラストラクチャのための不可欠なものと提示されます。
本文
親愛なる友人へ、
悲しいお知らせですが、あなたは無意識のうちに Kubernets を構築してしまったのです。当初、あなたは「つまらない技術を選んでシンプルにコンテナを動かしたい」と考えておられました。そして「Kubernetes はオーバーキルだ」「単純なタスクには全く必要なく、複雑すぎる」とも言っておられたはずです。ところが、半年が経過した今、あなたはproduction環境のちょっとした変化だけで頻繁に破損する一連のシェルスクリプトを抱えることになっています。
確かに、Docker Composeへの切り替えで悩みは解消されるでしょう—at least 他の方が標準的な設定形式を維持してくれていますから。しかし待ってください、Composeだけでは全体としての解決策にはなりません。「本当にデプロイ、ローリングアップデート、ロールバック、スケーリング用の別のソリューションが必要なのだろうか?」とあなたが自問しているはずです。もちろん必要ありません。あなたのアプリは単純な構成:バックエンド、リバースプロキシ、PostgreSQL、ジョブランナーの4つだけですから。それであなたはさらにdeploy.shスクリプトに数箇所のセクションを追加し、「これでこのハックまみれの構築を維持する上で必要なことは全て終わりだ」と確信しながら先を進みます。
ところが、やがてあなたが第二台のサーバーへ拡張する必要性に直面します。一台のサーバーで十分長くとどまることができるとは言っても、特別なハードウェアが必要だったり、高可用性が求められたり、光速が遅すぎて耐えられない(いや、実際は物理的に不可能ですが)といった理由によって決断を迫られるケースが多いのです。疲れ果てたあなたはdeployスクリプトをパラメータ化し、ファイアウォールルールを設定しますが、同時に取り組むべき重要な機能や製品のリリースには目を向けられなくなっています。チームの一人がTailscaleによるオーバーレイネットワークとサービスディスカveryの導入を提案しました。これで「よし、 networking の分野ではこれ以上難しい複雑性の障壁はない」とあなたが納得するでしょう。
しかし、もしあなたが退職したり休暇中にいたりした場合、誰がこの独自シェルスクリプトの山を守ってくれるでしょうか?未検証なtarball処理も、不透明なiptablesルールも、VM上で行ったドキュメント化されていないsysctl設定変更も、誰が管理しているのでしょうか。そこであなたはAnsibleを導入し、VMを Immutable でバージョン管理可能にするように一切を自動化します。「Kubernetes を使っていない以上、Kubernetes クラスターよりはるかに保守しやすいはずだ」と確信に満ちたあなた。まさに素晴らしいエンジニアリングだとお思いでしょう。
あなたの「Kubernetes を構築しないよう頑張った」旅の最後で、マネージャーから「アプリはプログラム的に他のコンテナを_spawn_ する必要がある」と指示されます。もちろん、コンテナを_spawn_するにはwebアプリ内でDockerソケットをマウントする必要があり、これは非常に安全ではありません。「それは私の問題ではない」とマネージャーが言うので、「では、web アプリに対し安全なサブセットのDocker API を暴露する独立したサービスを書くしかない」と考えます。「やっと終わった。これでKubernetes を構築しなくてもいい」とあなたが思うのでした。
標準的な設定形式、デプロイ方式、オーバーレイネットワーク、サービスディスカバリー、Immutable ノード、API サーバー。親愛なる友人、あなたは事実上 Kubernetes を構築してしまったのです。
宛先:Kubernetes を避けようとした人々へ
P.S. ここでは、Kubernetes よりもあなたのご環境に最適化した独自デプロイ方法を作ることが決して不可能だということ、あるいは何もかもがKubernetes に劣っているわけではないことを示唆しているわけではありません。ただ親愛なる友人として、Kubernetes が解決する問題を十分理解した上で、単に「過度に複雑だ」と片付ける前に、再度慎重に検討することをお願い申し上げます。