> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/sdks/backend-sdk/selphid/installation/kubernetes_deployment.md).

# Despliegue en Kubernetes

## 1. Introducción

A continuación se especifica todo lo necesario para instalar el servicio SelphID SDK en un entorno Kubernetes.

## 2. Despliegue manual

### 2.1 Introducción

Podemos desplegar SelphID SDK en un clúster de Kubernetes, utilizando el comando `kubectl`:

```bash
kubectl apply -f manifest.yaml
```

Utilizando un fichero 'manifest.yaml' similar a este:

```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: selphid-sdk
---

apiVersion: v1
kind: Secret
metadata:
  name: license-secret
  namespace: selphid-sdk
stringData:
  stringData:
  # Write here your license content. E.g:
  license.lic: |-
    {
       "key":"XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
       "type":"NODE_ONLINE"
    }
---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: selphid-sdk
  namespace: selphid-sdk
spec:
  replicas: 3
  selector:
    matchLabels:
      name: selphid-sdk
  template:
    metadata:
      labels:
        name: selphid-sdk
    spec:
      volumes:
        - name: license-volume
          secret:
            secretName: license-secret
            defaultMode: 420
        - name: config
          emptyDir:
            sizeLimit: 50Mi
      containers:
        - name: selphid-sdk-container-name
          # Use your image name and version
          image: >-
            selphid-sdk-rest-api:major.minor.patch
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          # Optional service configuration variables
          env:
            - name: FACEPHI_SELPHID_FACIALAUTHENTICATION_THRESHOLD
              value: '65'
            - name: FACEPHI_SELPHID_FACIALLIVENESS_THRESHOLD
              value: '60'

            # Only for 5.X versions
            - name: FACESDK_NUM_THREADS_ENGINE
              value: '8'

            # Only for 6.X versions
            - name: FACEPHI_SELPHID_FACIALEXTRACTOR_NUM_THREADS
              value: '8'
            - name: FACEPHI_SELPHID_FACIALLIVENESS_NUM_THREADS
              value: '8'

          resources:
            limits:
              cpu: 2096m
              memory: 4Gi
            requests:
              cpu: 1024m
              memory: 2Gi
          volumeMounts:
            - name: license-volume
              readOnly: true
              mountPath: /app/selphid-sdk/config/license.lic
              subPath: license.lic
            - name: config
              readOnly: false
              mountPath: /app/selphid-sdk/config
---

apiVersion: v1
kind: Service
metadata:
  name: selphid-service
  namespace: selphid-sdk
spec:
  ports:
    - name: http
      protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: selphid-sdk
  type: ClusterIP
---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: selphid-ingress
  namespace: selphid-sdk
  annotations:
    konghq.com/strip-path: "true"
spec:
  ingressClassName: kong
  rules:
    - host: core-test-selphid.facephi.dev
      http:
        paths:
          - path: /selphid
            pathType: Prefix
            backend:
              service:
                name: selphid-service
                port:
                  number: 8080
---
```

## 2.2 Secret

Es necesario declarar un secret de kubernetes donde se pasa la licencia a kubernetes.

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: ocr-license-secret
  namespace: facephi-ocr-service
stringData:
  license.lic: |-
    # Json license content provided by Facephi
```

### 2.3 Volúmenes

Es necesario mapear un volumen en `/app/selphid-sdk/config`, donde SelphID leerá el fichero de licencia y escribirá la información de log. Por defecto, la ruta donde se almacena el fichero de licencia es `/app/selphid-sdk/config/license.lic`.

```yaml
...
  spec:
    volumes:
      - name: license-volume
        secret:
          secretName: license-secret
          defaultMode: 420
      - name: config
        emptyDir:
          sizeLimit: 50Mi
...
    volumeMounts:
      - name: license-volume
        readOnly: true
        mountPath: /app/selphid-sdk/config/license.lic
        subPath: license.lic
      - name: config
        readOnly: false
        mountPath: /app/selphid-sdk/config
```

### 2.4 Variables de entorno

```yaml
    env:
    - name: FACEPHI_SELPHID_FACIALAUTHENTICATION_THRESHOLD
    value: '65'
    - name: FACEPHI_SELPHID_FACIALLIVENESS_THRESHOLD
    value: '60'
    - name: LICENSE_PATH
    value: /path/to/license
    - name: CONFIG_FILE
    value: /path/to/config/config.json
    - name: DEBUG_PATH
    value: /path/to/debug
    - name: USAGE_PATH
    value: /path/to/usage
    - name: FACEPHI_SELPHID_REST_AUTH_ENABLED
      value: 'true'
    - name: FACEPHI_SELPHID_REST_AUTH_JWT_SECRET
      value: shared-secret
    - name: FACEPHI_SELPHID_REST_AUTH_ACCEPT_AUTHORIZATION_HEADER
      value: 'true'
    - name: FACEPHI_SELPHID_REST_AUTH_ACCEPT_API_KEY_HEADER
      value: 'true'
    - name: FACEPHI_SELPHID_REST_AUTH_API_KEY_HEADER_NAME
      value: x-api-key
    - name: FACESDK_NUM_THREADS_ENGINE
      value: '8'
    - name: FACEPHI_SELPHID_FACIALEXTRACTOR_NUM_THREADS
      value: '8'
    - name: FACEPHI_SELPHID_FACIALLIVENESS_NUM_THREADS
      value: '8'
```

Cada una de ellas modifica un aspecto del comportamiento de SelphID SDK:

* `FACEPHI_SELPHID_FACIALAUTHENTICATION_THRESHOLD`: Modifica el umbral al realizar una FacialAuthentication. El valor por defecto es `65` (0-100).
* `FACEPHI_SELPHID_FACIALLIVENESS_THRESHOLD`: Modifica el umbral al realizar una FacialLiveness. El valor por defecto es `50` (0-100).
* `LICENSE_PATH`: Ruta alternativa donde buscar el fichero `license.lic`. Por defecto es `/app/selphid-sdk/config/license.lic`.
* `CONFIG_FILE`: Ruta a un fichero de configuración personalizado del servicio api-rest. Por defecto es `/app/selphid-sdk/config/config.json`
* `DEBUG_PATH`: Ruta alternativa para guardar los ficheros de log. Por defecto es `/app/selphid-sdk/config`.
* `USAGE_PATH`: Ruta alternativa para guardar los ficheros de uso. Por defecto es `/app/selphid-sdk/config`.
* `FACEPHI_SELPHID_REST_AUTH_ENABLED`, `FACEPHI_SELPHID_REST_AUTH_JWT_SECRET`, `FACEPHI_SELPHID_REST_AUTH_ACCEPT_AUTHORIZATION_HEADER`, `FACEPHI_SELPHID_REST_AUTH_ACCEPT_API_KEY_HEADER`, `FACEPHI_SELPHID_REST_AUTH_API_KEY_HEADER_NAME`: Parámetros opcionales de configuración de la autenticación JWT de la API REST, únicos en el arranque.
* `FACESDK_NUM_THREADS_ENGINE`: Número de hilos asignados al servicio de Liveness. **Solo en las versiones `5.x`**. Por defecto `4`.
* `FACEPHI_SELPHID_FACIALEXTRACTOR_NUM_THREADS`: Número de hilos asignados al servicio de Authentication. **Solo en las versiones `6.x`**. Por defecto `4`.
* `FACEPHI_SELPHID_FACIALLIVENESS_NUM_THREADS`: Número de hilos asignados al servicio de Liveness. **Solo en las versiones `6.x`**. Por defecto `4`.

### 2.5 Service

#### 2.5.1 LoadBalancer

Tenemos en cuenta que configuraremos un LoadBalancer con Kong por delante para acceder al servicio SelphID SDK. Tenga en cuenta que el servicio se expone en el puerto `80` y ataca al Pod en el `8080`.

```yaml
apiVersion: v1
kind: Service
metadata:
  name: selphid-service
  namespace: selphid-sdk
spec:
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8080
  selector:
    name: selphid-sdk
  type: ClusterIP
```

#### 2.5.2 Ingress

Configuramos un Ingress por delante para redirigir las peticiones de Kong al servicio dentro del Pod que expusimos previamente en el puerto 80.

## 3 Despliegue mediante Helm chart

Es posible automatizar el despliegue de selphid en un clúster de Kubernetes utilizando la herramienta `helm`.

```bash
helm upgrade --install <release-name> selphid-sdk-1.0.0.tgz --namespace <namespace> --create-namespace --wait
```

donde:

* `<release-name>`: Nombre para identificar la instalación.
* `<namespace>`: Namespace de Kubernetes donde se realizará el despliegue.
* `--create-namespace`: El namespace se creará si no existe.
* `--wait`: Espera hasta que todo se haya iniciado correctamente antes de informar de cualquier mensaje de éxito.

El fichero `selphid-sdk-1.0.0.tgz` se proporcionará para el despliegue y contendrá todas las plantillas y ficheros de configuración necesarios para `helm`.

```
selphid-sdk
├─ .helmignore
├─ Chart.yaml
├─ values.yaml
└─ templates
   ├─ deployment.yaml
   ├─ pvc.yaml
   ├─ secret.yaml
   ├─ service.yaml
   └─ serviceaccount.yaml
```

### 3.1 Chart.yaml

```yaml
apiVersion: v2
appVersion: 1.0.0
description: A Helm chart for SelphID SDK
name: selphid-sdk
type: application
version: 1.0.0
```

### 3.2 values.yaml

En este fichero debe configurar los valores específicos del despliegue:

```yaml
replicaCount: 1

image:
  repository: selphid-sdk-rest-api
  pullPolicy: IfNotPresent
  tag: 6.8.0

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

license:

resources:
  limits:
    cpu: 4
    memory: 8192Mi
  requests:
    cpu: 2
    memory: 3072Mi

affinity:
  podAntiAffinity:
    enabled: true

nodeSelector: {}

tolerations: []

service:
  type: NodePort
  port: 8080
  nodePort: 32080

storage:
  class: standard
  capacity: 100Mi

serviceAccount:
  create: true
  annotations: {}
  name: ""

podAnnotations: {}

podSecurityContext: {}

securityContext: {}
```

## 4 Tipos de instancia

Los tipos de instancia recomendados para utilizar el servicio SelphID SDK a nivel de producción serían los siguientes, donde se muestran los Pods de SelphID SDK que caben en función del tipo de instancia utilizado.

| Tipo de instancia | CPU | Memoria | Capacidad de Pods del SDK |
| ----------------- | --- | ------- | ------------------------- |
| c5.xlarge         | 4   | 8       | 2                         |
| c5.2xlarge        | 8   | 16      | 4                         |
| c5.4xlarge        | 16  | 32      | 9                         |
