演習 - Azure Kubernetes Service クラスターでアプリケーションをデプロイする
この演習では、会社の Web サイトをテスト アプリとして Azure Kubernetes Service (AKS) にデプロイします。 この Web サイトは、HTML、CSS、JavaScript の基になるテクノロジ スタックを使用する静的 Web サイトです。 これは、他のサービスと同じ数の要求を受信することはなく、デプロイ オプションを安全にテストする方法を提供します。
注意
ソース コードをさらに調べる必要がある場合は、この GitHub リポジトリで Web アプリのコードを入手できます。 また、このサンプル アプリは Linux ノード プールにのみデプロイされます。
重要
この演習を行うには、独自の Azure サブスクリプションが必要です。また、料金が発生することがあります。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
配置マニフェストを作成する
アプリケーションをデプロイするには配置マニフェスト ファイルを作成します。 マニフェスト ファイルを使用すると、デプロイするリソースの種類と、ワークロードに関するすべての詳細を定義できます。
Kubernetes によって、インテリジェンスがないポッドという論理構造にコンテナーがグループ化されます。 デプロイにより、欠落しているインテリジェンスが追加されてアプリケーションが作成されます。 デプロイ ファイルを作成してみましょう。
Azure Cloud Shell にサインインします。
Cloud Shell で、統合エディターを使用して、
deployment.yaml
という Kubernetes デプロイ用のマニフェスト ファイルを作成します。touch deployment.yaml
「
code .
」と入力して、Cloud Shell で統合エディターを開きます。deployment.yaml
ファイルを開き、YAML の次のコード セクションを追加します。# deployment.yaml apiVersion: apps/v1 # The API resource where this workload resides kind: Deployment # The kind of workload we're creating metadata: name: contoso-website # This will be the name of the deployment
このコードでは、作成するマニフェストの
apiVersion
とkind
を Kubernetes に指示するために、最初の 2 つのキーを追加しました。name
は、デプロイの名前です。 これは、kubectl
を使用してデプロイの情報の識別やクエリを行うときに使用します。ヒント
apiVersion
およびこのキーに配置する値の詳細については、公式の Kubernetes に関するドキュメントを参照してください。 リンクは、このモジュールの最後にあります。デプロイにより、ポッドがラップされます。 テンプレート定義を利用して、マニフェスト ファイル内でポッド情報を定義します。 テンプレートは、マニフェスト ファイルのデプロイ仕様セクションの下に配置されます。
次の YAML と一致するように
deployment.yaml
ファイルを更新します。# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: # Metadata for the pod labels: app: contoso-website
ポッドでは、デプロイと同じ名前は使用されません。 ポッドの名前は、末尾にランダムな ID が追加されたデプロイの名前の組み合わせです。
labels
キーの使用に注目してください。labels
キーを追加すると、デプロイでポッドを見つけてグループ化できるようになります。ポッドにより、1 つまたは複数のコンテナーがラップされます。 すべてのポッドに、そのポッド内のコンテナーを定義できる仕様セクションがあります。
次の YAML と一致するように
deployment.yaml
ファイルを更新します。# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: # Here we define all containers - name: contoso-website
containers
キーはコンテナー仕様の配列です。これは、ポッドに 1 つまたは複数のコンテナーを含めることができるためです。 仕様により、コンテナーに関するimage
、name
、resources
、ports
、その他の重要な情報が定義されます。実行中のすべてのポッドの名前は
contoso-website-<UUID>
に従っています。ここで UUID は、すべてのリソースを一意に識別するために生成される ID です。アプリでクラスターから使用できるリソースの最小量と最大量を定義することをお勧めします。 この情報を指定するには、
resources
キーを使用します。次の YAML と一致するように
deployment.yaml
ファイルを更新します。# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: # Minimum amount of resources requested cpu: 100m memory: 128Mi limits: # Maximum amount of resources requested cpu: 250m memory: 256Mi
リソース セクションで、要求として最小リソース量、制限として最大リソース量をどのように指定できるかに注目してください。
最後の手順では、このコンテナーにより、
ports
キーを介して外部に公開されるポートを定義します。ports
キーはオブジェクトの配列です。これは、ポッド内のコンテナーにより、複数の名前を持つ複数のポートを公開できることを意味します。次の YAML と一致するように
deployment.yaml
ファイルを更新します。# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 # This container exposes port 80 name: http # We named that port "http" so we can refer to it later
name
キーを使用して、ポートにどのように名前を付けるかに注目してください。 名前付けポートを使用すると、そのポートを参照するファイルを変更することなく、公開されているポートを変更できます。最後に、セレクター セクションを追加して、デプロイによって管理されるワークロードを定義します。
selector
キーは、マニフェスト ファイルのデプロイ仕様セクション内に配置されます。matchLabels
キーを使用して、デプロイによって管理されるすべてのポッドのラベルを一覧表示します。次の YAML と一致するように
deployment.yaml
ファイルを更新します。# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: selector: # Define the wrapping strategy matchLabels: # Match all pods with the defined labels app: contoso-website # Labels follow the `name: value` template template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 name: http
注意
複数のノード プール (Linux と Windows) を含む AKS クラスターでは、上記の配置マニフェスト ファイルに、Linux コンテナーを実行できるノードでサンプル アプリケーションのポッドを実行するように AKS クラスターに指示する
nodeSelector
も定義されています。Linux ノードでは Windows コンテナーを実行できず、その逆も同様です。
マニフェスト ファイルを保存して、エディターを閉じます。
マニフェストを適用する
Cloud Shell で
kubectl apply
コマンドを実行して、配置マニフェストをクラスターに送信します。kubectl apply -f ./deployment.yaml
コマンドにより、次の例のような結果が出力されるはずです。
deployment.apps/contoso-website created
kubectl get deploy
コマンドを実行して、デプロイが成功したかどうかを確認します。kubectl get deploy contoso-website
コマンドにより、次の例のようなテーブルが出力されるはずです。
NAME READY UP-TO-DATE AVAILABLE AGE contoso-website 0/1 1 0 16s
kubectl get pods
コマンドを実行して、ポッドが実行されているかどうかを確認します。kubectl get pods
コマンドにより、次の例のようなテーブルが出力されるはずです。
NAME READY STATUS RESTARTS AGE contoso-website-7c58c5f699-r79mv 1/1 Running 0 63s