使用 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 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 主要版本相比,沒有差超過一個版本。- 使用
kubectl version
檢查用戶端上執行的 kubectl 版本。 記下完整版本。 - 在 Azure Stack Edge Pro 裝置的本機 UI 中,移至 [概觀],並記下 Kubernetes 軟體號碼。
- 確認這兩個版本是否與支援的 Kubernetes 版本 中所提供的對應相容。
- 使用
您已準備好在 Azure Stack Edge Pro 裝置上部署具狀態應用程式。
佈建靜態 PV
若要以靜態方式佈建 PV,您必須在裝置上建立共用。 請遵循下列步驟,針對您的 SMB 共用佈建 PV。
注意
- 本操作說明文章中所使用的特定範例不適用於 NFS 共用。 一般而言,您可以在具有非資料庫應用程式的 Azure Stack Edge 裝置上佈建 NFS 共用。
- 若要部署使用儲存體磁區來提供永續性儲存體的具狀態應用程式,建議您使用
StatefulSet
。 此範例只搭配一個複本來使用Deployment
,且適合用於開發和測試。
選擇您要建立 Edge 共用或 Edge 本機共用。 依照新增共用中的指示來建立共用。 確定選取了 [使用共用搭配 Edge 計算] 核取方塊。
如果您決定使用現有的共用,不是建立新的共用,而是必須掛接共用。
在您 Azure Stack Edge 資源的 Azure 入口網站中,移至 [安全性]。 從現有的共用清單中,選取並按一下您想要使用的共用。
選取 [掛接],並在出現提示時確認掛接。
記下共用名稱。 建立此共用時,會自動在與您所建立之 SMB 共用相對應的 Kubernetes 叢集中建立永續性磁區物件。
部署 MySQL
您現在將透過建立 Kubernetes 部署並將其連接到您在前面的步驟中使用 PersistentVolumeClaim (PVC) 建立的 PV,來執行具狀態的應用程式。
您用來建立和管理具狀態應用程式部署的所有 kubectl
命令都需要指定與設定相關聯的命名空間。 若要在 kubectl 命令中指定命名空間,請使用 kubectl <command> -n <your-namespace>
。
取得命名空間中 Kubernetes 叢集上執行的 Pod 清單。 Pod 是在 Kubernetes 叢集上執行的應用程式容器或處理程序。
kubectl get pods -n <your-namespace>
命令使用方式的範例如下:
C:\Users\user>kubectl get pods -n "userns1" No resources found in userns1 namespace. C:\Users\user>
輸出應該會指出找不到任何資源 (Pod),因為叢集上沒有執行的應用程式。
您將使用下列 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-pv.yml
檔案並儲存至您儲存mysql-deployment.yml
所在的相同資料夾。 若要使用您稍早以kubectl
建立的 SMB 共用,請將 PVC 物件中的volumeName
欄位設定為共用的名稱。注意
確定 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>
列出部署所建立的 Pod。
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 正在執行
若要針對在 Pod 中執行 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>
PV 不再繫結於 PVC,因為 PVC 已被刪除。 由於 PV 是在建立共用時佈建的,因此您必須刪除該共用。 執行下列步驟:
將共用取消掛接。 在 Azure 入口網站中,移至您的 [Azure Stack Edge 資源 > 共用],然後選取並按一下您要取消掛接的共用。 選取 [取消掛接] 並確認該作業。 等到共用取消掛接為止。 取消掛接會從 Kubernetes 叢集中釋放共用 (以及相關聯的 PersistentVolume)。
您現在可以選取 [刪除],並確認刪除以刪除您的共用。 這也應該會刪除共用和相對應的 PV。
下一步
若要瞭解如何動態佈建儲存體,請參閱透過 Azure Stack Edge Pro 裝置上的動態佈建來部署具狀態應用程式