共用方式為


使用 kubectl 在 Azure Stack Edge Pro GPU 裝置上搭配 StorageClass 執行 Kubernetes 具狀態應用程式

適用於: 是,適用於 Pro GPU SKUAzure Stack Edge Pro - GPU是,適用於 Pro 2 SKUAzure Stack Edge Pro 2是,適用於 Pro R SKUAzure Stack Edge Pro R是,適用於 Mini R SKUAzure Stack Edge Mini R

本文說明如何使用 StorageClass 在 Kubernetes 中部署單一執行個體具狀態應用程式,以動態佈建儲存體和部署。 部署會在現有的 Kubernetes 叢集上使用 kubectl 命令,並部署 MySQL 應用程式。

此程序適用於已詳閱Azure Stack Edge Pro 裝置上的 Kubernetes 儲存體,且熟悉 Kubernetes 儲存體概念的人員。

必要條件

在您可以部署具狀態應用程式之前,請先對您的裝置和將用於存取該裝置的用戶端完成下列必要條件:

針對裝置

  • 您有 1 個節點 Azure Stack Edge Pro 裝置的登入認證。
    • 裝置已啟動。 請參閱啟動裝置
    • 裝置具有透過 Azure 入口網站設定的計算角色,且具有 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 命令來授與 user1userns1 的存取權。
      • 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>

  1. 取得命名空間中 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),因為叢集上沒有執行的應用程式。

  2. 您將使用下列 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
    
  3. 複製 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
    
  4. 部署 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。 您在後續的步驟中將使用此資訊。

  5. 部署 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>
    
  6. 顯示部署的相關資訊。

    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>
    
  7. 列出部署所建立的 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>
    
  8. 檢查 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 裝置上部署無狀態應用程式