【ITニュース解説】100 Days of DevOps: Day 56
2025年09月28日に「Dev.to」が公開したITニュース「100 Days of DevOps: Day 56」について初心者にもわかりやすく解説しています。
ITニュース概要
KubernetesにNginx Webサーバーをデプロイ。高可用性と拡張性を目指し、複数レプリカで動くDeploymentとNodePort ServiceをYAMLファイルで設定した。これにより、WebサーバーがKubernetesクラスタ上で安定稼働するのを確認した。
ITニュース解説
この解説文では、Kubernetesクラスタ上でウェブサーバーをデプロイする一連の作業について、システムエンジニアを目指す初心者にも分かりやすく説明する。現代のウェブサービスでは、アクセスが急増しても安定してサービスを提供し続ける「高可用性」と、必要に応じてシステムの規模を柔軟に拡大・縮小できる「スケーラビリティ」が非常に重要となる。Kubernetesは、これらの課題を解決するための強力なツールであり、多数のアプリケーションコンテナを効率的に管理できるプラットフォームである。
今回、Nautilusチームの開発者向けに静的なウェブサイトをKubernetesクラスタにデプロイする作業が行われた。このデプロイメントは、高可用性とスケーラビリティという重要な要件を満たしている。具体的には、ウェブサーバーアプリケーションの複数のコピー(レプリカ)を同時に動かし、それら全体へのアクセスを単一の入り口で管理する「NodePort」という仕組みを使って実現している。
このソリューションは、Kubernetesにおける二つの主要なオブジェクト、すなわち「Deployment」と「Service」を定義することで実装された。これらのオブジェクトは、それぞれが持つべき設定や振る舞いを記述したYAML(ヤムル)形式のファイルによって作成される。YAMLファイルは、人間が読みやすく、かつコンピュータが解釈しやすいデータ記述形式である。
まず、「Deployment」について説明する。Deploymentは、ウェブサーバーなどのアプリケーションを構成する「Pod」(ポッド)と呼ばれる最小単位のインスタンス群を管理する役割を担う。Podは、アプリケーションを動かすのに必要な一つまたは複数の「コンテナ」(アプリケーションとその実行環境をまとめたもの)をカプセル化したものである。Deploymentは、指定された数のPodが常に稼働している状態を保ち、もしPodが故障したり停止したりした場合には、自動的に新しいPodを起動して置き換えることで高可用性を実現する。また、アプリケーションのバージョンアップやロールバックといった更新作業もDeploymentが管理する。
今回のデプロイでは、nginx-deployment.yamlというファイルでDeploymentが定義された。このファイルの内容は次の通りである。
apiVersion: apps/v1は、この設定がKubernetes APIのどのバージョンを使用するかを示し、kind: Deploymentは作成するオブジェクトの種類がDeploymentであることを宣言する。
metadata.name: nginx-deploymentは、このDeploymentにnginx-deploymentという名前を付けている。
spec.replicas: 3という設定は、NginxウェブサーバーのPodを3つ同時に稼働させることを指示している。これにより、もし1つのPodがダウンしても、残りの2つがサービスを継続するため、高可用性が確保される。
spec.selector.matchLabels: app: nginx-appは、このDeploymentが管理するPodを識別するためのルールであり、app: nginx-appというラベルを持つPodを対象とすることを指定する。
spec.template以下は、Deploymentが作成するPodの設計図である。spec.template.metadata.labels: app: nginx-appは、この設計図から作られるPodにapp: nginx-appというラベルを付与する。このラベルは、前述のmatchLabelsと一致させることで、Deploymentが自身の管理対象となるPodを正しく認識できるようにする。
spec.template.spec.containers以下では、Pod内で実行されるコンテナの設定を記述する。name: nginx-containerはコンテナの名前、image: nginx:latestは使用するNginxのDockerイメージとそのバージョン(最新版)を指定している。ports: - containerPort: 80は、このNginxコンテナが80番ポートでウェブサービスを提供するように設定していることを示す。
次に、「Service」について説明する。Serviceは、Kubernetesクラスタ内で動作するPod群に安定したネットワークアクセスを提供する役割を担う。Podは一時的なものであり、再起動や再配置によってIPアドレスが変わることがあるため、直接PodのIPアドレスにアクセスすることは望ましくない。Serviceは、特定のラベルを持つPod群を論理的にグループ化し、外部からのアクセスをこれらのPodに適切に振り分ける。これにより、ユーザーはPodの物理的な配置や状態を意識することなく、安定したエンドポイント(アクセス先)を通じてアプリケーションにアクセスできる。
今回のデプロイでは、nginx-service.yamlというファイルでServiceが定義された。
apiVersion: v1とkind: Serviceは、この設定がServiceオブジェクトであることを示す。
metadata.name: nginx-serviceは、このServiceにnginx-serviceという名前を付けている。
spec.type: NodePortは、このServiceが「NodePort」タイプであることを指定している。NodePortタイプのServiceは、Kubernetesクラスタを構成する各ノード(サーバー)の特定のポート(NodePort)を外部に開放し、そのポートに送られてきたトラフィックをServiceが管理するPod群に転送する。これにより、クラスタ外部からウェブサーバーにアクセスすることが可能となる。
spec.selector: app: nginx-appは、このServiceがトラフィックを転送すべきPodを識別するためのルールである。nginx-deploymentで定義されたPodに付与されたapp: nginx-appというラベルと一致させることで、このServiceはNginxのPod群に接続される。
spec.ports以下では、ポート関連の設定を行う。protocol: TCPはTCPプロトコルを使用することを示し、port: 80はServiceがクラスタ内部で公開するポート(Service自身のポート)が80番であることを示す。targetPort: 80は、Serviceがトラフィックを転送する先のPod内のコンテナが使用するポートが80番であることを示す。これにより、Serviceは自身に送られてきた80番ポートへのリクエストを、Nginxコンテナの80番ポートに転送する。最後に、nodePort: 30011は、各ノードが外部に開放するポート番号を30011番に固定することを指定している。通常、NodePortはKubernetesによって自動的に割り当てられるが、このように明示的に指定することも可能である。
これらのYAMLファイルが準備できたら、kubectl applyコマンドを使ってKubernetesクラスタに適用する。
kubectl apply -f nginx-deployment.yamlコマンドは、NginxのDeploymentを作成し、3つのNginx Podを起動させる。
kubectl apply -f nginx-service.yamlコマンドは、NginxのServiceを作成し、Deploymentによって起動された3つのNginx Podにトラフィックを転送する設定を適用する。
デプロイが完了したら、kubectl describeコマンドを使って、それぞれのオブジェクトが意図通りに作成され、正しく設定されているかを確認する。
kubectl describe deployment nginx-deploymentを実行すると、nginx-deploymentという名前のDeploymentの詳細情報が表示される。出力では、Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailableという行があり、これは3つのPodが目標通りに稼働しており、すべて利用可能であることを示している。また、Containersセクションでは、nginx-containerという名前のコンテナがnginx:latestイメージを使用し、80番ポートを公開していることが確認できる。
同様に、kubectl describe service nginx-serviceを実行すると、nginx-serviceという名前のServiceの詳細情報が表示される。出力には、Type: NodePortとあり、ServiceがNodePortタイプであることが確認できる。NodePort: <unset> 30011/TCPという行は、ノードポートが30011番に設定されていることを示している。さらに、Endpoints: 10.244.0.5:80,10.244.0.6:80,10.244.0.7:80という行は、このServiceが正しく3つのNginx PodのIPアドレスと80番ポートに接続されていることを示しており、外部からのリクエストをこれらのPodに転送できる状態にあることが確認できる。
このように、KubernetesのDeploymentとServiceを適切に組み合わせることで、ウェブサイトを高可用性かつスケーラブルな形でデプロイし、安定して運用することが可能となる。システムエンジニアを目指す上で、このようなコンテナオーケストレーション技術の基本的な考え方と具体的な操作を理解することは非常に重要である。