使用 kubectl 在 Azure Stack Edge Pro GPU 裝置上搭配 StorageClass 執行 Kubernetes 具狀態應用程式
適用於: Azure Stack Edge Pro - GPUAzure Stack Edge Pro 2Azure Stack Edge Pro RAzure Stack Edge Mini R
本文說明如何使用 StorageClass 在 Kubernetes 中部署單一執行個體具狀態應用程式,以動態佈建儲存體和部署。 部署會在現有的 Kubernetes 叢集上使用 kubectl
命令,並部署 MySQL 應用程式。
此程序適用於已詳閱Azure Stack Edge Pro 裝置上的 Kubernetes 儲存體,且熟悉 Kubernetes 儲存體概念的人員。
必要條件
在您可以部署具狀態應用程式之前,請先對您的裝置和將用於存取該裝置的用戶端完成下列必要條件:
針對裝置
- 您有 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 裝置上部署具狀態應用程式。
部署 MySQL
您現在會建立 Kubernetes 部署,並使用 PersistentVolumeClaim (PVC) 將其連線至內建 StorageClass,以執行具狀態的應用程式。
您用來建立和管理具狀態應用程式部署的所有 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 已布建,且 PV 繫結至此 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-sc
複製
mysql-pvc.yml
檔案並儲存至您儲存mysql-deployment.yml
所在的相同資料夾。 若要使用 Azure Stack Edge Pro 裝置在連結資料磁碟上的內建 StorageClass,請將 PVC 物件中的storageClassName
欄位設定為ase-node-local
,且 accessModes 應為ReadWriteOnce
。注意
確定 YAML 檔案具有正確的縮排。 您可以使用 YAML lint 檢查以進行驗證,然後儲存。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim-sc spec: storageClassName: ase-node-local accessModes: - ReadWriteOnce resources: requests: storage: 20Gi
部署
mysql-pvc.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-pvc.yml" -n userns1 persistentvolumeclaim/mysql-pv-claim-sc created C:\Users\user>
請注意所建立的 PVC 名稱 - 在此範例中為
mysql-pv-claim-sc
。 您在後續的步驟中將使用此資訊。部署
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 C:\Users\user>
顯示部署的相關資訊。
kubectl describe deployment <app-label> -n <your-user-namespace>
C:\Users\user>kubectl describe deployment mysql -n userns1 Name: mysql Namespace: userns1 CreationTimestamp: Thu, 20 Aug 2020 11:14:25 -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-sc ReadOnly: false Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: mysql-695c4d9dcd (1/1 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 24s deployment-controller Scaled up replica set mysql-695c4d9dcd 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-695c4d9dcd-rvzff 1/1 Running 0 40s C:\Users\user>
檢查 PersistentVolumeClaim。
kubectl describe pvc <your-pvc-name>
以下是範例輸出。
C:\Users\user>kubectl describe pvc mysql-pv-claim-sc -n userns1 Name: mysql-pv-claim-sc Namespace: userns1 StorageClass: ase-node-local Status: Bound Volume: pvc-dc48253c-82dc-42a4-a7c6-aaddc97c9b8a Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"mysql-pv-claim-sc","namespace":"userns1"},"spec":{"... pv.kubernetes.io/bind-completed: yes pv.kubernetes.io/bound-by-controller: yes volume.beta.kubernetes.io/storage-provisioner: rancher.io/local-path volume.kubernetes.io/selected-node: k8s-3q7lhq2cl-3q7lhq2 Finalizers: [kubernetes.io/pvc-protection] Capacity: 20Gi Access Modes: RWO VolumeMode: Filesystem Mounted By: mysql-695c4d9dcd-rvzff Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal WaitForFirstConsumer 71s (x2 over 77s) persistentvolume-controller waiting for first consumer to be created before binding Normal ExternalProvisioning 62s persistentvolume-controller waiting for a volume to be created, either by external provisioner "rancher.io/local-path" or manually created by system administrator Normal Provisioning 62s rancher.io/local-path_local-path-provisioner-6b84988bf9-tx8mz_1896d824-f862-4cbf-912a-c8cc0ca05574 External provisioner is provisioning volume for claim "userns1/mysql-pv-claim-sc" Normal ProvisioningSucceeded 60s rancher.io/local-path_local-path-provisioner-6b84988bf9-tx8mz_1896d824-f862-4cbf-912a-c8cc0ca05574 Successfully provisioned volume pvc-dc48253c-82dc-42a4-a7c6-aaddc97c9b8a C:\Users\user>
確認 MySQL 正在執行
若要確認應用程式正在執行,請輸入:
kubectl exec <your-pod-with-the-app> -i -t -n <your-namespace> -- mysql -p
系統提示時,請提供密碼。 密碼位於您的 mysql-deployment
檔案中。
以下是範例輸出。
C:\Users\user>kubectl exec mysql-695c4d9dcd-rvzff -i -t -n userns1 -- mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
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-sc -n userns1
persistentvolumeclaim "mysql-pv-claim-sc" deleted
C:\Users\user>
下一步
若要瞭解如何透過 kubectl 設定網路功能,請參閱在 Azure Stack Edge Pro 裝置上部署無狀態應用程式