こんにちは。よっしーです(^^)
今日は、Docker Desctop for Mac で有効にしたKubernates上で、nginxを起動する方法についてご紹介します。
背景
Kubernetesはコンテナオーケストレーションツールであり、大規模なアプリケーションのデプロイメント、スケーリング、管理を容易にするために使用されます。Nginxは人気のあるリバースプロキシサーバーおよびWebサーバーソフトウェアであり、高速かつ信頼性の高いWebトラフィックの処理に使用されます。
以下に、KubernetesでNginxを起動する理由をいくつか説明します:
- スケーラビリティ: Kubernetesはクラスター内のリソースの動的なスケーリングをサポートしています。NginxをKubernetes上で実行することで、必要に応じて追加のNginxインスタンスを簡単に起動し、トラフィックの増加に対応することができます。
- ロードバランシング: Kubernetesはロードバランシングを提供し、トラフィックを複数のNginxインスタンスに均等に分散することができます。これにより、アプリケーションの可用性とパフォーマンスが向上します。
- 自己修復: Kubernetesはアプリケーションの健全性を維持するために自己修復メカニズムを備えています。もしNginxのインスタンスが障害やクラッシュした場合、Kubernetesは自動的に新しいインスタンスを起動してアプリケーションの継続的な可用性を確保します。
- バージョン管理: Kubernetesはデプロイメントのバージョン管理をサポートしています。Nginxの新しいバージョンをデプロイする際に、Kubernetesは新しいバージョンのインスタンスを起動し、トラフィックの移行を制御することができます。これにより、アプリケーションのアップグレードプロセスがスムーズになります。
- インフラストラクチャの抽象化: Kubernetesはインフラストラクチャの詳細を抽象化し、アプリケーションのデプロイメントに関連する複雑さを軽減します。NginxをKubernetes上で起動することで、インフラストラクチャに依存しないポータブルな環境を構築することができます。
これらの理由により、Kubernetes上でNginxを起動することは、アプリケーションのスケータビリティ、可用性、パフォーマンス、および運用の柔軟性を向上させる上で有益です。
前回の記事
この記事は下記の記事の続きになりますので、気になる方は下記の記事も参考にしてください。
Deployment
下記のコマンドを実施します。
touch nginx-deployment.yaml
上記のファイル(nginx-deployment.yaml)に下記の内容を書き込みます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
下記のコマンドを実行して、同じ出力になれば成功です。
% kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
% kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 45s
出力されている項目の意味です。
クラスターにてDeploymentを調査するとき、以下のフィールドが出力されます。
NAME
は、クラスター内にあるDeploymentの名前一覧です。READY
は、ユーザーが使用できるアプリケーションのレプリカの数です。使用可能な数/理想的な数の形式で表示されます。UP-TO-DATE
は、理想的な状態を満たすためにアップデートが完了したレプリカの数です。AVAILABLE
は、ユーザーが利用可能なレプリカの数です。AGE
は、アプリケーションが稼働してからの時間です。
下記のコマンドを実行すると、Deploymentによって作成されたReplicaSet(rs
)を確認できます。
% kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-7fb96c846b 3 3 3 2m31s
ReplicaSetの出力には次のフィールドが表示されます:
NAME
は、名前空間内にあるReplicaSetの名前の一覧です。DESIRED
は、アプリケーションの理想的な レプリカ の値です。これはDeploymentを作成したときに定義したもので、これが 理想的な状態 と呼ばれるものです。CURRENT
は現在実行されているレプリカの数です。READY
は、ユーザーが使用できるアプリケーションのレプリカの数です。AGE
は、アプリケーションが稼働してからの時間です。
ReplicaSetの名前は[Deployment名]-[ランダム文字列]
という形式になることに注意してください。ランダム文字列はランダムに生成され、pod-template-hashをシードとして使用します。
下記のコマンドを実行すると、各Podにラベルが自動的に付けられるのを確認できます。
% kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-7fb96c846b-6wstp 1/1 Running 0 4m13s app=nginx,pod-template-hash=7fb96c846b
nginx-deployment-7fb96c846b-np7fp 1/1 Running 0 4m13s app=nginx,pod-template-hash=7fb96c846b
nginx-deployment-7fb96c846b-s8dzl 1/1 Running 0 4m13s app=nginx,pod-template-hash=7fb96c846b
pod-template-hash
ラベルはDeploymentコントローラーによってDeploymentが作成し適用した各ReplicaSetに対して追加されます。
このラベルはDeploymentが管理するReplicaSetが重複しないことを保証します。このラベルはReplicaSetのPodTemplate
をハッシュ化することにより生成され、生成されたハッシュ値はラベル値としてReplicaSetセレクター、Podテンプレートラベル、ReplicaSetが作成した全てのPodに対して追加されます。
解説
Deploymentとは
KubernetesにおけるDeployment(デプロイメント)は、コンテナ化されたアプリケーションのデプロイと管理を容易にするためのリソースオブジェクトです。Deploymentは、アプリケーションのスケーリング、アップグレード、ロールバックなどの機能を提供します。
以下にDeploymentの主な特徴と概念について説明します:
- デプロイメントの定義: DeploymentはYAML形式のマニフェストファイルで定義されます。このマニフェストファイルには、デプロイするコンテナイメージの情報、レプリカ数(インスタンスの数)、ポートの設定、リソース要件などが含まれます。
- レプリカセット: Deploymentは内部的にレプリカセット(ReplicaSet)を使用しています。レプリカセットは指定されたレプリカ数のインスタンスを管理し、アプリケーションのスケーリングや冗長性の確保を行います。
- スケーリング: Deploymentはアプリケーションのスケーリングを容易にします。レプリカ数を変更することで、インスタンスの数を増減させることができます。これにより、トラフィックの増加に応じてアプリケーションのパフォーマンスや可用性を調整することができます。
- アップグレードとロールバック: Deploymentは新しいバージョンのアプリケーションへのアップグレードを容易にします。新しいバージョンのコンテナイメージを指定し、デプロイメントを更新することで、新しいバージョンのインスタンスが作成されます。また、以前のバージョンに簡単にロールバックすることも可能です。
- ローリングアップデート: Deploymentはデフォルトでローリングアップデート戦略を採用しています。つまり、新しいバージョンのインスタンスが順次作成され、古いバージョンのインスタンスが自動的に削除されます。これにより、アプリケーションの停止時間を最小限に抑えつつ、リリースの安定性を確保します。
- ヘルスチェック: Deploymentはヘルスチェック機能を提供します。ヘルスチェックはアプリケーションの正常な動作を確認するためのプローブ(Probe)を定義し、インスタンステータスの監視を行います。Deploymentは、2種類のプローブをサポートしています。
- ライブネスプローブ(Liveness Probe): アプリケーションが正常に動作しているかどうかを確認します。定期的にアプリケーションに対してリクエストを送信し、アプリケーションが応答しない場合にはインスタンスが再起動されるなどの処理が行われます。
- リードネスプローブ(Readiness Probe): アプリケーションがリクエストを処理できる状態になっているかどうかを確認します。アプリケーションがリクエストを処理できる準備ができていない場合には、トラフィックがそのインスタンスには流れないようになります。
これにより、Deploymentはアプリケーションの状態を監視し、異常が検出された場合には自動的に再起動やトラフィックの調整などの対処を行います。
DeploymentはKubernetesの上で管理されるため、Kubernetesの他の機能との統合も容易です。例えば、Serviceと連携することで、Deploymentにアクセスするための統一的な入口を提供することができます。また、Deploymentは他のKubernetesのリソースと関連付けることもできます。たとえば、ConfigMapやSecretを使用して環境変数や機密情報を注入することができます。
総括すると、KubernetesのDeploymentはアプリケーションのデプロイと管理を柔軟かつ効率的に行うための重要な概念です。スケーリング、アップグレード、ロールバック、ヘルスチェックなどの機能により、アプリケーションの可用性と安定性を確保します。
おわりに
今日は、Docker Desctop for Mac で有効にしたKubernates上でnginxを起動する方法についてご紹介しました。次回は、このnginxを更新してみたいと思います。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント