> 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/docs.facephi-pt-br/sdks/backend-sdk/selphid/installation/kubernetes_deployment.md).

# Implantação em Kubernetes

## 1. Introdução

A seguir, especifica-se tudo o que é necessário para instalar o serviço SelphID SDK em um ambiente Kubernetes.

## 2. Implantação manual

### 2.1 Introdução

Podemos implantar o SelphID SDK em um cluster Kubernetes, utilizando o comando `kubectl`:

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

Usando um arquivo 'manifest.yaml' semelhante a este:

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

apiVersion: v1
kind: Secret
metadata:
  name: license-secret
  namespace: selphid-sdk
stringData:
  stringData:
  # Escreva aqui o conteúdo da sua licença. Ex.:
  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 o nome e a versão da sua imagem
          image: >-
            selphid-sdk-rest-api:major.minor.patch
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          # Variáveis opcionais de configuração do serviço
          env:
            - name: FACEPHI_SELPHID_FACIALAUTHENTICATION_THRESHOLD
              value: '65'
            - name: FACEPHI_SELPHID_FACIALLIVENESS_THRESHOLD
              value: '60'

            # Somente para versões 5.X
            - name: FACESDK_NUM_THREADS_ENGINE
              value: '8'

            # Somente para versões 6.X
            - 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

É necessário declarar um secret do Kubernetes onde a licença é passada para o Kubernetes.

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: ocr-license-secret
  namespace: facephi-ocr-service
stringData:
  license.lic: |-
    # Conteúdo da licença JSON fornecido pela Facephi
```

### 2.3 Volumes

É necessário mapear um volume em `/app/selphid-sdk/config`, onde SelphID lerá o arquivo de licença e gravará as informações de log. Por padrão, o caminho onde o arquivo de licença é armazenado é `/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 Variáveis de ambiente

```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 uma delas modifica um aspecto do comportamento do SelphID SDK:

* `FACEPHI_SELPHID_FACIALAUTHENTICATION_THRESHOLD`: Altera o limiar ao realizar uma FacialAuthentication. O valor padrão é `65` (0-100).
* `FACEPHI_SELPHID_FACIALLIVENESS_THRESHOLD`: Altera o limiar ao realizar uma FacialLiveness. O valor padrão é `50` (0-100).
* `LICENSE_PATH`: Caminho alternativo para buscar o arquivo `license.lic`. Por padrão é `/app/selphid-sdk/config/license.lic`.
* `CONFIG_FILE`: Caminho para um arquivo de configuração personalizado do serviço api-rest. Por padrão é `/app/selphid-sdk/config/config.json`
* `DEBUG_PATH`: Caminho alternativo para salvar os arquivos de log. Por padrão é `/app/selphid-sdk/config`.
* `USAGE_PATH`: Caminho alternativo para salvar os arquivos de uso. Por padrão é `/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 opcionais de configuração da autenticação JWT da API Rest, únicos na inicialização.
* `FACESDK_NUM_THREADS_ENGINE`: Número de threads atribuídos ao serviço de Liveness. **Somente nas versões `5.x`**. Por padrão `4`.
* `FACEPHI_SELPHID_FACIALEXTRACTOR_NUM_THREADS`: Número de threads atribuídos ao serviço de Authentication. **Somente nas versões `6.x`**. Por padrão `4`.
* `FACEPHI_SELPHID_FACIALLIVENESS_NUM_THREADS`: Número de threads atribuídos ao serviço de Liveness. **Somente nas versões `6.x`**. Por padrão `4`.

### 2.5 Service

#### 2.5.1 LoadBalancer

Levamos em conta que configuraremos um LoadBalancer com Kong na frente para acessar o serviço SelphID SDK. Observe que o serviço é exposto na porta `80` e direciona para o Pod no `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 um Ingress na frente para redirecionar as requisições de Kong ao serviço dentro do Pod que expusemos anteriormente na porta 80.

## 3 Implantação por meio de Helm chart

É possível automatizar a implantação de selphid em um cluster Kubernetes utilizando a ferramenta `helm`.

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

onde:

* `<release-name>`: Nome para identificar a instalação.
* `<namespace>`: Namespace do Kubernetes onde a implantação será realizada.
* `--create-namespace`: O namespace será criado se não existir.
* `--wait`: Aguarda até que tudo tenha iniciado corretamente antes de informar qualquer mensagem de sucesso.

O arquivo `selphid-sdk-1.0.0.tgz` será fornecido para a implantação e conterá todos os templates e arquivos de configuração necessários 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: Um Helm chart para SelphID SDK
name: selphid-sdk
type: application
version: 1.0.0
```

### 3.2 values.yaml

Neste arquivo, você deve configurar os valores específicos da implantação:

```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 instância

Os tipos de instância recomendados para usar o serviço SelphID SDK em produção seriam os seguintes, onde são mostrados os Pods do SelphID SDK que cabem em função do tipo de instância utilizado.

| Tipo de instância | CPU | Memória | Capacidade de Pods do SDK |
| ----------------- | --- | ------- | ------------------------- |
| c5.xlarge         | 4   | 8       | 2                         |
| c5.2xlarge        | 8   | 16      | 4                         |
| c5.4xlarge        | 16  | 32      | 9                         |
