Uso de kubectl para ejecutar una aplicación con estado de Kubernetes con PersistentVolume en el dispositivo Azure Stack Edge Pro
SE APLICA A: Azure Stack Edge Pro: GPUAzure Stack Edge Pro 2Azure Stack Edge Pro RAzure Stack Edge Mini R
En este artículo se muestra cómo implementar una aplicación con estado de una sola instancia en Kubernetes con PersistentVolume (PV) y una implementación. La implementación usa comandos kubectl
en un clúster de Kubernetes existente e implementa la aplicación MySQL.
Este procedimiento está dirigido a los usuarios que han revisado Almacenamiento de Kubernetes en un dispositivo Azure Stack Edge Pro y están familiarizados con los conceptos de almacenamiento de Kubernetes.
Azure Stack Edge Pro también admite la ejecución de contenedores de Azure SQL Edge y se pueden implementar de forma similar a como se detalla aquí para MySQL. Para más información, consulte Azure SQL Edge.
Requisitos previos
Antes de implementar la aplicación con estado, complete los siguientes requisitos previos en el dispositivo y en el cliente que vaya a usar para acceder al dispositivo:
Para el dispositivo
- Tiene credenciales de inicio de sesión en un dispositivo Azure Stack Edge Pro de un nodo.
- El dispositivo está activado. Consulte Activación del dispositivo.
- El dispositivo tiene el rol de proceso configurado desde Azure Portal y un clúster de Kubernetes. Consulte Configuración del proceso.
Para el cliente que va a acceder al dispositivo
- Tiene un sistema de cliente Windows que se usará para acceder al dispositivo Azure Stack Edge Pro.
El cliente ejecuta Windows PowerShell 5.0 o una versión posterior. Para descargar la última versión de Windows PowerShell, vaya a Instalación de Windows PowerShell.
También puede tener otro cliente con un sistema operativo compatible. En este artículo, el procedimiento que se describe emplea un cliente Windows.
Ha completado el procedimiento descrito en Acceso al clúster de Kubernetes en el dispositivo Azure Stack Edge Pro. Ha:
- Creado un espacio de nombres
userns1
con el comandoNew-HcsKubernetesNamespace
. - Creado un usuario
user1
con el comandoNew-HcsKubernetesUser
. - Concedido el acceso
user1
auserns1
con el comandoGrant-HcsKubernetesNamespaceAccess
. - Instalado
kubectl
en el cliente y guardado el archivokubeconfig
con la configuración de usuario en C:\Users\<nombredeusuario>\.kube.
- Creado un espacio de nombres
Asegúrese de que la versión del cliente de
kubectl
es como máximo una versión superior o inferior a la versión maestra de Kubernetes que se ejecuta en el dispositivo Azure Stack Edge Pro.- Use
kubectl version
para comprobar la versión de kubectl que se ejecuta en el cliente. Anote la versión completa. - En la interfaz de usuario local del dispositivo Azure Stack Edge Pro, vaya a Información general y anote el número de software de Kubernetes.
- Compruebe la compatibilidad entre estas dos versiones con la asignación proporcionada en la versión de Kubernetes admitida.
- Use
Está listo para implementar una aplicación con estado en el dispositivo Azure Stack Edge Pro.
Aprovisionamiento de un PV estático
Para aprovisionar de forma estática un PV, debe crear un recurso compartido en el dispositivo. Siga estos pasos para aprovisionar un PV en un recurso compartido de archivos SMB.
Nota:
- El ejemplo específico que se usa en este artículo no funciona con recursos compartidos de archivos NFS. En general, los recursos compartidos de archivos NFS se pueden aprovisionar en un dispositivo de Azure Stack Edge con aplicaciones que no son base de datos.
- Para implementar aplicaciones con estado que usan volúmenes de almacenamiento para proporcionar almacenamiento persistente, se recomienda usar
StatefulSet
. Este ejemplo usaDeployment
con una sola réplica y es adecuado para desarrollo y pruebas.
Elija si quiere crear un recurso compartido de Edge o un recurso compartido de Edge local. Siga las instrucciones de Adición de un recurso compartido para crear un recurso compartido. Asegúrese de seleccionar la casilla Usar el recurso compartido con el proceso perimetral.
En lugar de crear un nuevo recurso compartido, si decide usar un recurso compartido existente, tendrá que montar el recurso compartido.
En la instancia de Azure Portal del recurso compartido de Azure Stack Edge, vaya a Recursos compartidos. En la lista de recursos compartidos existentes, seleccione y haga clic en el recurso compartido que quiere usar.
Seleccione Montar y confirme el montaje cuando se le solicite.
Tome nota del nombre del recurso compartido. Cuando se crea este recurso compartido, se crea automáticamente un objeto de volumen persistente en el clúster de Kubernetes correspondiente al recurso compartido de archivos SMB que creó.
Implementación de MySQL
Ahora ejecutará una aplicación con estado mediante la creación de una implementación de Kubernetes y su conexión al PV que creo en el paso anterior mediante un elemento PersistentVolumeClaim (PVC).
Todos los comandos kubectl
que utiliza para crear y administrar implementaciones de aplicaciones con estado tienen que especificar el espacio de nombres asociado a la configuración. Para especificar el espacio de nombres en un comando de kubectl, use kubectl <command> -n <your-namespace>
.
También puede obtener una lista de los pods que se ejecutan en el clúster de Kubernetes en el espacio de nombres. Un pod es un contenedor o un proceso de la aplicación que se ejecuta en el clúster de Kubernetes.
kubectl get pods -n <your-namespace>
Este es un ejemplo de uso del comando:
C:\Users\user>kubectl get pods -n "userns1" No resources found in userns1 namespace. C:\Users\user>
La salida debe indicar que no se encuentra ningún recurso (pod), ya que no hay ninguna aplicación en ejecución en el clúster.
Usará los archivos YAML siguientes. El archivo
mysql-deployment.yml
describe una implementación que ejecuta MySQL y hace referencia a PVC. El archivo define un montaje de volumen para/var/lib/mysql
y, a continuación, crea un PVC que busca un volumen de 20 GB.Esta reclamación se satisface con cualquier PV existente que se haya aprovisionado estáticamente al crear el recurso compartido en el paso anterior. En el dispositivo, se crea un PV grande de 32 TB para cada recurso compartido. PV cumple los requisitos establecidos por PVC y el PVC debe estar enlazado a este PV.
Copie y guarde el siguiente archivo
mysql-deployment.yml
en una carpeta en el cliente Windows que esté usando para acceder al dispositivo Azure Stack Edge Pro.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
Haga una copia y guárdela como archivo
mysql-pv.yml
en la misma carpeta donde guardó el archivomysql-deployment.yml
. Para usar el recurso compartido de archivos SMB que creó anteriormente conkubectl
, establezca el campovolumeName
del objeto PVC en el nombre del recurso compartido.Nota:
Asegúrese de que la sangría de los archivos YAML es correcta. Puede comprobarlo con YAML lint para la validación y luego guardarlos.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim spec: volumeName: <smb-share-name-here> storageClassName: "" accessModes: - ReadWriteOnce resources: requests: storage: 20Gi
Implementación del archivo
mysql-pv.yaml
.kubectl apply -f <URI path to the mysql-pv.yml file> -n <your-user-namespace>
Este es un ejemplo de salida de la implementación.
C:\Users\user>kubectl apply -f "C:\stateful-application\mysql-pv.yml" -n userns1 persistentvolumeclaim/mysql-pv-claim created C:\Users\user>
Anote el nombre del PVC creado. Lo usará en otro paso más adelante.
Implemente el contenido del archivo
mysql-deployment.yml
.kubectl apply -f <URI path to mysql-deployment.yml file> -n <your-user-namespace>
Este es un ejemplo de salida de la implementación.
C:\Users\user>kubectl apply -f "C:\stateful-application\mysql-deployment.yml" -n userns1 service/mysql created deployment.apps/mysql created
Visualice la información sobre la implementación.
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>
Enumere los pods creados por la implementación.
kubectl get pods -l <app=label> -n <your-user-namespace>
Esta es una salida de ejemplo.
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>
Inspeccione PersistentVolumeClaim.
kubectl describe pvc <your-pvc-name>
Esta es una salida de ejemplo.
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>
Comprobación de que MySQL está en ejecución
Para ejecutar un comando en un contenedor de un pod que ejecuta MySQL, escriba:
kubectl exec <your-pod-with-the-app> -i -t -n <your-namespace> -- mysql
Esta es una salida de ejemplo.
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>
Eliminación de una implementación
Para eliminar la implementación, elimine los objetos implementados por nombre. Estos objetos incluyen la implementación, el servicio y el PVC.
kubectl delete deployment <deployment-name>,svc <service-name> -n <your-namespace>
kubectl delete pvc <your-pvc-name> -n <your-namespace>
Esta es la salida de ejemplo cuando se elimina la implementación y el servicio.
C:\Users\user>kubectl delete deployment,svc mysql -n userns1
deployment.apps "mysql" deleted
service "mysql" deleted
C:\Users\user>
Esta es la salida de ejemplo cuando se elimina el PVC.
C:\Users\user>kubectl delete pvc mysql-pv-claim -n userns1
persistentvolumeclaim "mysql-pv-claim" deleted
C:\Users\user>
PV ya no está enlazado al PVC, ya que este se eliminó. Como el PV se aprovisionó cuando se creó el recurso compartido, deberá eliminar el recurso compartido. Siga estos pasos:
Desmonte el recurso compartido. En Azure Portal, vaya al Recurso de Azure Stack Edge > Recursos compartidos y seleccione y haga clic en el recurso compartido que quiere desmontar. Seleccione Desmontar y confirme la operación. Espere hasta que se desmonte el recurso compartido. El desmontaje libera el recurso compartido (y, por tanto, el elemento PersistentVolume asociado) del clúster de Kubernetes.
Ahora puede seleccionar Eliminar y confirmar la eliminación para eliminar el recurso compartido. También debe eliminar el recurso compartido y el PV correspondiente.
Pasos siguientes
Para saber cómo aprovisionar el almacenamiento de forma dinámica, consulte Implementación de una aplicación con estado a través del aprovisionamiento dinámico en un dispositivo Azure Stack Edge Pro.