# Implementación en Nutanix AHV

### **Requisitos previos**

1. Asegúrese de tener acceso a su clúster Nutanix AHV.
2. Instale las siguientes herramientas en su estación de trabajo:
   * **Helm:** [Instalar Helm](https://helm.sh/docs/intro/install/)
   * **Kubectl:** [Instalar Kubectl](https://kubernetes.io/docs/tasks/tools/)
   * **AWS CLI:** [Instalar AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
   * **Nutanix Prism Central o herramientas de línea de comandos de Karbon** para administrar recursos de Nutanix.

### **Paso 1: Requisitos del clúster de Kubernetes**

Configure un clúster de Kubernetes en Nutanix. [Documentación de Nutanix Kubernetes Engine aquí](https://portal.nutanix.com/page/documents/details?targetId=Nutanix-Kubernetes-Engine-v2_10:top-deploy-kubernetes-cluster-t.html).

* El clúster debe cumplir los siguientes requisitos mínimos:
  * **Requisitos de nodos:** 3 nodos, [cada uno con al menos 8 GB de RAM](https://portal.nutanix.com/page/documents/solutions/details?targetId=NVD-2174-Hybrid-Cloud-6-5-Mid-Market-Design:virtual-machine-standard-deployment-sizes.html).

### **Paso 2: Configurar almacenamiento persistente**

Nutanix AHV utiliza el [Nutanix CSI](https://opendocs.nutanix.com/openshift/operators/csi/) (Controlador de interfaz de almacenamiento de contenedores) para Kubernetes para gestionar el almacenamiento persistente. Instale y configure el controlador CSI:

1. Instale el controlador Nutanix CSI para Kubernetes siguiendo la [documentación de Nutanix CSI](https://portal.nutanix.com/page/documents/details?targetId=Nutanix-Data-Services-for-Kubernetes-v1_2:top-csi-driver-install-k8s-c.html).
2. Cree una StorageClass predeterminada en Kubernetes para el aprovisionamiento dinámico:

   ```yaml
   kind: StorageClass
   apiVersion: storage.k8s.io/v1
   metadata:
     name: nutanix-sc
   provisioner: csi.nutanix.com
   parameters:
     csi.storage.k8s.io/fstype: ext4
   ```

### **Paso 3: Configurar redes de Kubernetes**

Asegúrese de que esté instalado un controlador de ingreso para el acceso externo a sus servicios.

1. Inicialice el repositorio Ingress-Nginx:

   ```bash
   helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
   ```
2. Implemente el chart de Helm Ingress-Nginx:

   ```bash
   helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
     --namespace ingress-nginx \
     --create-namespace \
     --set controller.replicaCount=2 \
     --set controller.allowSnippetAnnotations=true \
     --set controller.ingressClassResource.default=true \
     --set force-ssl-redirect=true \
     --version=4.8.3
   ```
3. Valide que la dirección IP externa del servicio LoadBalancer esté configurada:

   ```bash
   kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller
   ```

El controlador Ingress-Nginx es responsable de exponer los servicios de la aplicación externamente al clúster.

### **Paso 4: Preparar la configuración de Violet**

1. Crear un `violet-values.yml` archivo de configuración para la implementación:

   ```yaml
   domain: # El dominio donde se servirá Violet. El subdominio debe ser "violet": violet.mydomain.com
   customerName: # El nombre del cliente de su licencia. Proporcionado por Violet
   licenseKey: # Su clave de licencia. Proporcionada por Violet
   adminEmail: # Correo electrónico del usuario administrador para el cliente
   adminName: # Nombre completo del usuario administrador ("Nombre Apellido") para el cliente

   aws:
     accessKeyId: # Dejar en blanco o eliminar si no corresponde
     accessKeySecret: # Dejar en blanco o eliminar si no corresponde

   global:
     storageClass: nutanix-sc

   # opcional: Esto es necesario si desea usar una base de datos externa 
   # en lugar de una bd postgres interna creada automáticamente por el chart de helm. 
   # No agregar si usa la bd interna. 
   postgresql:
     enabled: false # Deshabilitar la base de datos interna si usa una base de datos externa
     auth:
       host: # nombre de host para la bd externa
       password: # contraseña del usuario de la bd
       username: # nombre de usuario del usuario de la bd
       adminPassword: # contraseña del usuario administrador
       adminUsername: # nombre de usuario administrador
   ```

<details>

<summary>Desplegar o actualizar Violet con versión bloqueada [OPCIONAL]</summary>

Si desea bloquear la versión de Violet que está utilizando y no obtener automáticamente la última versión, agregue la siguiente entrada a su `violet-values.yml` archivo:

```yaml
imagen:
  versionTag: # use la etiqueta de versión correcta para bloquear una versión y no siempre obtener la última. Proporcionada por Violet para el despliegue inicial.
```

El registro de cambios de Violet (y las etiquetas de versión) se puede encontrar aquí [Registro de cambios de VioletLabs | Productlane](https://changelog.violetlabs.com/changelog)

Si está implementando Violet en este entorno por primera vez, continúe a [#step-5-fetch-internal-secrets-from-violet](#step-5-fetch-internal-secrets-from-violet "mention").

Si ya ha desplegado Violet y solo está bloqueando la versión o actualizando a una versión específica de Violet, ingrese esa versionTag en el `violet-values.yml` archivo y luego salte a [#step-6-deploy-violet-helm-chart](#step-6-deploy-violet-helm-chart "mention").

</details>

### **Paso 5: Obtener secretos internos de Violet**

Para gestionar secretos de forma segura en Nutanix, puede usar **Secrets de Kubernetes** o integrarse con Nutanix Vault o HashiCorp Vault. Esto se usa para cargar algunos secretos específicos del cliente desde la nube AWS de Violet hacia la implementación On-Prem de Violet.

1. Instale External Secrets:

   ```bash
   helm repo add external-secrets https://charts.external-secrets.io
   helm repo update
   helm upgrade --namespace external-secrets --create-namespace --install --wait external-secrets external-secrets/external-secrets
   ```
2. Configure un perfil de AWS llamado `violet-external`&#x20;

   ```
   $ aws configure —profile violet-external
   AWS Access Key ID [None]:[AWS_ACCESS_KEY desde 1Pass]
   AWS Secret Access Key [None]: [AWS_SECRET_ACCESS_KEY desde 1Pass]
   Default region name [None]: us-west-1
   Default output format [None]: json
   ```
3. Cree un namespace para Violet:

   ```bash
   kubectl create namespace violet
   ```
4. Cree un secreto que permita a Kubernetes acceder al repositorio de Charts de Helm de Violet:

   <pre class="language-bash"><code class="lang-bash"><strong>kubectl create secret docker-registry --namespace violet ecr-creds --docker-server=911167899009.dkr.ecr.us-west-1.amazonaws.com --docker-username=AWS --docker-password=$(aws ecr --profile violet-external get-login-password)
   </strong></code></pre>
5. Instale el agente de registro mezmo. Esto envía logs desde su clúster al equipo de Violet para asistencia en solución de problemas y monitoreo

   ```
   kubectl apply -f https://assets.logdna.com/clients/logdna-agent/3/agent-namespace.yaml

   # Obtenga <mezmo-ingestion-key> de su entrada en 1Pass
   kubectl create secret generic logdna-agent-key -n logdna-agent --from-literal=logdna-agent-key=<mezmo-ingestion-key> 

   kubectl apply -f https://assets.logdna.com/clients/logdna-agent/3/agent-resources.yaml
   ```

### **Paso 6: Implementar el chart de Helm de Violet**

1. Inicie sesión en el repositorio del chart de Helm de Violet

   ```bash
   aws ecr --profile violet-external get-login-password | helm registry login --username AWS --password-stdin 911167899009.dkr.ecr.us-west-1.amazonaws.com
   ```
2. Instale el chart de Helm de Violet:

   ```bash
   helm upgrade --namespace violet --create-namespace --install myviolet oci://911167899009.dkr.ecr.us-west-1.amazonaws.com/violet-helm --version 1.0.0-main -f violet-values.yml
   ```

### **Paso 7: Verificar la instalación**

Tenga en cuenta que puede tardar hasta 5 minutos en ejecutar los scripts de aprovisionamiento de la base de datos. Puede comprobar el estado de la implementación viendo los pods:

1. Compruebe el estado de los pods en el namespace Violet:

   ```bash
   kubectl get pods -n violet
   ```

### **Paso 8: Configuración posterior a la instalación**

Después de completar la instalación, el chart de helm mostrará alguna información y comandos que incluyen la URL para acceder a su nueva implementación, cómo obtener la dirección IP en la que se sirve la implementación (para configurar reglas DNS) y cómo obtener la contraseña autogenerada para el `violet_admin@violetlabs.com` cuenta.
