kubectl を使用し、Azure Stack Edge Pro デバイスで PersistentVolume を使って Kubernetes ステートフル アプリケーションを実行する
適用対象: Azure Stack Edge Pro - GPUAzure Stack Edge Pro 2Azure Stack Edge Pro RAzure Stack Edge Mini R
この記事では、PersistentVolume (PV) とデプロイを使用して、Kubernetes で単一インスタンスのステートフル アプリケーションをデプロイする方法について説明します。 このデプロイでは、既存の Kubernetes クラスターで kubectl
コマンドを使用し、MySQL アプリケーションをデプロイします。
この手順は、Azure Stack Edge Pro デバイス上の Kubernetes ストレージに関する記事を確認し、Kubernetes ストレージの概念を理解しているユーザーを対象としています。
Azure Stack Edge Pro では、Azure SQL Edge コンテナーの実行もサポートされており、ここで説明する MySQL の場合と同様の方法でデプロイできます。 詳細については、Azure SQL Edge に関する記事をご覧ください。
前提条件
ステートフル アプリケーションをデプロイする前に、デバイスとデバイスにアクセスするために使用するクライアントで、次の前提条件を完了してください。
デバイスでは
- 1 ノードの Azure Stack Edge Pro デバイスに対するサインイン資格情報がある。
- デバイスがアクティブ化されている。 デバイスをアクティブにするに関する記事を参照してください。
- デバイスに、Azure portal を使用して構成されたコンピューティング ロールがあり、Kubernetes クラスターがある。 コンピューティングの構成に関する記事を参照してください。
デバイスにアクセスするクライアントの場合
- Azure Stack Edge Pro デバイスへのアクセスに使われる Windows クライアント システムがある。
クライアントでは、Windows PowerShell 5.0 以降が実行されている。 Windows PowerShell の最新バージョンをダウンロードするには、「Windows PowerShell のインストール」を参照してください。
サポートされているオペレーティング システムが搭載されている他のクライアントを使用することもできます。 この記事では、Windows クライアントを使用する場合の手順について説明します。
Azure Stack Edge Pro デバイス上の Kubernetes クラスターへのアクセスに関する記事で説明されている手順を完了している。 完了した内容:
New-HcsKubernetesNamespace
コマンドを使用してuserns1
名前空間を作成した。New-HcsKubernetesUser
コマンドを使用してユーザーuser1
を作成した。Grant-HcsKubernetesNamespaceAccess
コマンドを使用して、user1
にuserns1
への アクセス権を許可した。- クライアントに
kubectl
をインストールし、ユーザー構成を含むkubeconfig
ファイルを C:\Users\<username>\.kube に保存した。
kubectl
クライアントのバージョンと、Azure Stack Edge Pro デバイスで実行されている Kubernetes マスターのバージョンの差が 1 未満であることを確認する。- クライアントで実行されている kubectl のバージョンを確認するには、
kubectl version
を使用します。 完全なバージョンをメモしておきます。 - お使いの Azure Stack Edge Pro デバイスのローカル UI で、[概要] に移動し、Kubernetes ソフトウェアの番号をメモします。
- サポートされている Kubernetes バージョンで提供されているマッピングで、これら 2 つのバージョンの互換性を確認します。
- クライアントで実行されている kubectl のバージョンを確認するには、
Azure Stack Edge Pro デバイスにステートフル アプリケーションをデプロイする準備ができました。
静的な PV をプロビジョニングする
PV を静的にプロビジョニングするには、デバイスに共有を作成する必要があります。 SMB 共有に対して PV をプロビジョニングするには、次の手順に従います。
Note
- この操作方法の記事で使用されている具体的な例は、NFS 共有では機能しません。 NFS 共有は通常、Azure Stack Edge デバイスでデータベース以外のアプリケーションを使用してプロビジョニングできます。
- ストレージ ボリュームを使用するステートフル アプリケーションをデプロイして永続ストレージを提供するには、
StatefulSet
を使用することをお勧めします。 この例では、Deployment
と 1 つのレプリカのみを使用しています。これは、開発とテストに適しています。
Edge 共有と Edge ローカル共有のどちらを作成するかを選択します。 「共有の追加」の手順に従って、共有を作成してください。 [Edge コンピューティングで共有を使用する] チェック ボックスを必ずオンにします。
新しい共有を作成するのではなく、既存の共有を使用する場合は、共有をマウントする必要があります。
Azure portal で Azure Stack Edge リソースの [共有] にアクセスします。 既存の共有の一覧で、使用する共有を選択してクリックします。
[マウント] を選択し、メッセージが表示されたらマウントを確定します。
共有名をメモしておきます。 この共有が作成されるときに、作成された SMB 共有に対応する Kubernetes クラスターに、永続ボリューム オブジェクトが自動的に作成されます。
MySQL をデプロイする
Kubernetes のデプロイを作成し、PersistentVolumeClaim (PVC) を使用して、前の手順で作成した PV に接続することによって、ステートフル アプリケーションを実行します。
ステートフル アプリケーションのデプロイを作成および管理するために使用するすべての kubectl
コマンドでは、構成に関連付けられている名前空間を指定する必要があります。 kubectl コマンドで名前空間を指定するには、kubectl <command> -n <your-namespace>
を使用します。
名前空間の Kubernetes クラスターで実行されているポッドの一覧を取得します。 ポッドは、Kubernetes クラスターで実行されるアプリケーション コンテナー (つまり、プロセス) です。
kubectl get pods -n <your-namespace>
コマンドの使用例を次に示します。
C:\Users\user>kubectl get pods -n "userns1" No resources found in userns1 namespace. C:\Users\user>
クラスターで実行されているアプリケーションが存在しないため、出力にはリソース (ポッド) が見つからないことが示されるはずです。
次の YAML ファイルを使用します。
mysql-deployment.yml
ファイルには、MySQL を実行し、PVC を参照するデプロイが記述されています。 このファイルは、/var/lib/mysql
のボリューム マウントを定義し、20 GB のボリュームを探す PVC を作成します。この要求は、前の手順で共有を作成したときに静的にプロビジョニングされた既存の PV によって満たされます。 デバイスで、共有ごとに 32 TB の大きな PV が作成されます。 PV は PVC によって規定された要件を満たしており、PVC をこの PV にバインドする必要があります。
次の
mysql-deployment.yml
ファイルをコピーし、Azure Stack Edge Pro デバイスへのアクセスに使用する Windows クライアント上のフォルダーに保存します。apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 selector: app: mysql clusterIP: None --- apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - image: mysql:5.6 name: mysql env: # Use secret in real usage - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim
次の内容をコピーし、
mysql-deployment.yml
を保存したフォルダーにmysql-pv.yml
ファイルとして保存します。 以前にkubectl
で作成した SMB 共有を使用するには、PVC オブジェクトのvolumeName
フィールドをその共有の名前に設定します。Note
YAML ファイルが正しくインデントされていることを確認します。 YAML lint を使用すると、検証して保存することができます。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim spec: volumeName: <smb-share-name-here> storageClassName: "" accessModes: - ReadWriteOnce resources: requests: storage: 20Gi
mysql-pv.yaml
ファイルをデプロイします。kubectl apply -f <URI path to the mysql-pv.yml file> -n <your-user-namespace>
デプロイの出力例を次に示します。
C:\Users\user>kubectl apply -f "C:\stateful-application\mysql-pv.yml" -n userns1 persistentvolumeclaim/mysql-pv-claim created C:\Users\user>
作成された PVC の名前をメモします。 これは後の手順で使用します。
mysql-deployment.yml
ファイルの内容をデプロイします。kubectl apply -f <URI path to mysql-deployment.yml file> -n <your-user-namespace>
デプロイの出力例を次に示します。
C:\Users\user>kubectl apply -f "C:\stateful-application\mysql-deployment.yml" -n userns1 service/mysql created deployment.apps/mysql created
デプロイについての情報を表示します。
kubectl describe deployment <app-label> -n <your-user-namespace>
C:\Users\user>kubectl describe deployment mysql -n userns1 Name: mysql Namespace: userns1 CreationTimestamp: Tue, 18 Aug 2020 09:44:58 -0700 Labels: <none> Annotations: deployment.kubernetes.io/revision: 1 kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"mysql","namespace":"userns1"},"spec":{"selector":{"matchL... Selector: app=mysql Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable StrategyType: Recreate MinReadySeconds: 0 Pod Template: Labels: app=mysql Containers: mysql: Image: mysql:5.6 Port: 3306/TCP Host Port: 0/TCP Environment: MYSQL_ROOT_PASSWORD: password Mounts: /var/lib/mysql from mysql-persistent-storage (rw) Volumes: mysql-persistent-storage: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: mysql-pv-claim ReadOnly: false Conditions: Type Status Reason ---- ------ ------ Progressing True NewReplicaSetAvailable Available True MinimumReplicasAvailable OldReplicaSets: <none> NewReplicaSet: mysql-c85f7f79c (1/1 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set mysql-c85f7f79c to 1 C:\Users\user>
デプロイによって作成されたポッドを一覧表示します。
kubectl get pods -l <app=label> -n <your-user-namespace>
出力例を次に示します。
C:\Users\user>kubectl get pods -l app=mysql -n userns1 NAME READY STATUS RESTARTS AGE mysql-c85f7f79c-vzz7j 1/1 Running 1 14m C:\Users\user>
PersistentVolumeClaim を検査します。
kubectl describe pvc <your-pvc-name>
出力例を次に示します。
C:\Users\user>kubectl describe pvc mysql-pv-claim -n userns1 Name: mysql-pv-claim Namespace: userns1 StorageClass: Status: Bound Volume: mylocalsmbshare1 Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"mysql-pv-claim","namespace":"userns1"},"spec":{"acc... pv.kubernetes.io/bind-completed: yes Finalizers: [kubernetes.io/pvc-protection] Capacity: 32Ti Access Modes: RWO,RWX VolumeMode: Filesystem Mounted By: mysql-c85f7f79c-vzz7j Events: <none> C:\Users\user>
MySQL が実行中であることを確認する
MySQL を実行しているポッド内のコンテナーに対してコマンドを実行するには、次のように入力します。
kubectl exec <your-pod-with-the-app> -i -t -n <your-namespace> -- mysql
出力例を次に示します。
C:\Users\user>kubectl exec mysql-c85f7f79c-vzz7j -i -t -n userns1 -- mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.49 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
デプロイの削除
デプロイを削除するには、デプロイされたオブジェクトの名前を指定して削除します。 これらのオブジェクトには、デプロイ、サービス、および PVC が含まれます。
kubectl delete deployment <deployment-name>,svc <service-name> -n <your-namespace>
kubectl delete pvc <your-pvc-name> -n <your-namespace>
デプロイとサービスを削除した場合の出力例を次に示します。
C:\Users\user>kubectl delete deployment,svc mysql -n userns1
deployment.apps "mysql" deleted
service "mysql" deleted
C:\Users\user>
PVC を削除した場合の出力例を次に示します。
C:\Users\user>kubectl delete pvc mysql-pv-claim -n userns1
persistentvolumeclaim "mysql-pv-claim" deleted
C:\Users\user>
PVC が削除されると、PV が PVC にバインドされなくなります。 共有の作成時に PV がプロビジョニングされたため、共有を削除する必要があります。 次の手順のようにします。
共有のマウントを解除します。 Azure portal で、[Azure Stack Edge リソース] > [共有] に移動し、マウントを解除する共有を選択してクリックします。 [マウント解除] を選択し、操作を確定します。 共有がマウント解除されるまで待ちます。 マウント解除によって、Kubernetes クラスターから共有 (および関連付けられている PersistentVolume) が解放されます。
これで、[削除] を選択して削除を確定し、共有を削除することができます。 これにより、共有および対応する PV も削除されます。
次のステップ
ストレージを動的にプロビジョニングする方法については、Azure Stack Edge Pro デバイスでの動的プロビジョニングを使用したステートフル アプリケーションのデプロイに関する記事を参照してください