Como instalar o Instant API no Kubernetes
Oz Instant API é uma implantação sem estado do Oz API: executa análises de Liveness e correspondência facial e retorna resultados imediatamente, sem armazenar qualquer mídia ou resultados. Este guia cobre a instalação dele no Kubernetes via o Helm chart.
O exemplo abaixo é baseado na versão 1.0.2 do chart. No entanto, este é um exemplo ilustrativo, e recomendamos usar a versão mais recente do chart.
Pré-requisitos
Antes de começar: solicite estes itens ao seu representante da Oz.
credenciais do DockerHub – para baixar a imagem do Instant API (usado na etapa 2 de Preparação).).
chave de licença – necessária para executar o Instant API (etapa 3 de Preparação).).
tag da imagem – a versão da imagem da aplicação a ser implantada (usada em seu
arquivo values).
Se você planejar usar OzCapsula, também será necessário gerar um par de chaves JWT (etapa 4 de Preparação).).
Kubernetes 1.23+ – o chart usa autoscaling/v2 (HPA com políticas de comportamento, GA em 1.23), networking.k8s.io/v1 (Ingress, GA em 1.19), e policy/v1 (PDB, GA em 1.21). Clusters executando 1.21–1.22 são parcialmente suportados por fallback automático para autoscaling/v2beta2 e policy/v1beta1.
Antes da instalação, verifique se os seguintes componentes estão em execução no seu cluster:
Controlador Ingress (um dos seguintes, ao usar a API Ingress):
F5 NGINX Ingress Controller >= 3.0 (recomendado, IngressClass:
f5-nginx).ingress-nginx >= 1.0 (legado, em descontinuação, IngressClass:
nginx).
CRDs do Gateway API >= 1.0 e um controlador compatível (ex.: Istio >= 1.20, Envoy Gateway, Cilium) – ao usar a Gateway API em vez de Ingress. O chart cria
gateway.networking.k8s.io/v1recursos (Gateway, HTTPRoute).cert-manager >= 1.0 com um
ClusterIssuer(para certificados TLS). Para TLS da Gateway API, é necessário cert-manager >= 1.5 com--feature-gates=ExperimentalGatewayAPISupport=true.metrics-server >= 0.5 (necessário para autoscaling com HPA).
cluster-autoscaler (opcional, para escalonamento automático de nós).
KEDA >= 2.0 (opcional, alternativa ao HPA padrão; o chart usa
keda.sh/v1alpha1API ScaledObject).Prometheus Operator (kube-prometheus-stack) >= 0.44 (opcional, para
monitoring.coreos.com/v1suporte a ServiceMonitor).
Preparação).
1. Crie um namespace
kubectl create namespace api-instant
2. Crie secret de pull da imagem
Como alternativa, se você já tiver uma .dockerconfigjson string base64 pré-codificada (ex.: fornecida pelo Suporte da Oz), use uma das opções:
Depois:
O valor abaixo de .dockerconfigjson é uma string JSON codificada em base64 no formato {"auths":{"<https://index.docker.io/v1/>":{"username":"...","password":"...","auth":"..."}}}. Entre em contato com o Suporte da Oz para obter as credenciais. O nome do secret deve corresponder a imagePull.secret em seus values (padrão: oz-dockerhub-creds).
3. Obtenha uma chave de licença
Entre em contato Suporte da Oz para obter sua chave de licença.
4. Crie secret JWT (opcional)
O Instant API, no caso de uso do OzCapsula, requer um par de chaves JWT para tokens de sessão. Gere as chaves e crie o secret:
O nome do secret deve corresponder a api.jwt.secretName em seus values (padrão: "").
Instalação
1. Adicione o repositório Helm
2. Aplique a configuração básica
Crie um my-values.yaml arquivo:
Instale o chart:
3. Verifique a instalação
Para verificar que a API está ativa e respondendo, chame GET {{host}}/api/healthcheck.
Para confirmar que ela processa solicitações de verificação, execute uma análise no Instant API implantado.
Atualização
Configuração principal
Somente os parâmetros marcados como Obrigatórios devem ser definidos (eles aparecem na Configuração básica acima). Todos os outros parâmetros são opcionais – você só precisa saber que eles existem e pode sobrescrevê-los se necessário.
imagePull.secret
Nome do secret de pull da imagem
oz-dockerhub-creds
imagePull.policy
Política de pull da imagem
IfNotPresent
affinity
Regras globais de afinidade de pods (nodeAffinity, podAffinity, podAntiAffinity)
{}
nodeSelector
Restrições globais de seletor de nós
{}
tolerations
Tolerations globais
[]
api.hostname
Obrigatório. Hostname público para o Instant API
somehost.example.local
api.additionalHostnames
Hostnames adicionais (ex.: aliases de CDN); adicionados às regras de Ingress e aos listeners do Gateway
[]
api.licenseKey
Obrigatório. Chave de licença para o Instant API (do Suporte da Oz)
""
api.extraEnvs
Variáveis de ambiente adicionais (pares chave-valor). Armazenadas em um ConfigMap – não coloque segredos aqui.
{NUM_WORKERS: "16", ...}
api.extraEnvVarsSecret
Nome de um Secret existente cujas chaves são injetadas como variáveis de ambiente (via envFrom.secretRef). Use para valores sensíveis, como credenciais do S3.
""
api.image.tag
Obrigatório. Tag da imagem da aplicação (entre em contato com o Suporte da Oz)
""
api.resources
requests/limits de CPU e memória
requests/limits: 15 CPU, 28Gi RAM
api.autoscaling.hpa.enabled
Ativar HPA
true
api.autoscaling.keda.enabled
Ativar KEDA ScaledObject
false
api.ingress.enabled
Criar recurso Ingress
true
api.ingress.className
classe do Ingress
nginx
api.ingress.annotations
anotações do Ingress (proxy, CORS, etc.)
{}
api.ingress.tls.enabled
Ativar TLS
true
api.ingress.tls.clusterIssuer
ClusterIssuer do cert-manager
letsencrypt-production
api.gateway.enabled
Criar recursos da Gateway API (mutuamente exclusivo com api.ingress)
false
api.gateway.className
nome da classe do Gateway
istio
api.gateway.annotations
anotações do Gateway
{}
api.gateway.tls.enabled
Ativar TLS no Gateway
true
api.gateway.tls.clusterIssuer
ClusterIssuer do cert-manager para o Gateway
letsencrypt-production-dns
api.proxy.enabled
Ativar proxy HTTP
false
api.proxy.url
URL do proxy
<http://proxy.local:3128>
api.proxy.auth.existingSecret
Nome de um Secret existente com all_proxy a chave contendo a URL completa do proxy. Se definido, login/senha são ignorados.
""
api.proxy.auth.login
Nome de usuário do proxy (usado quando existingSecret não está definido)
""
api.proxy.auth.password
Senha do proxy – caracteres especiais são codificados automaticamente com percent-encoding (usado quando existingSecret não está definido)
""
api.serviceMonitor.enabled
Criar ServiceMonitor do Prometheus
true
Para a lista completa de parâmetros, consulte values.yaml.
Gerenciamento de tráfego
Este chart suporta duas maneiras de rotear tráfego externo para o Instant API: API Ingress do K8s e API Gateway do K8s. Elas são mutuamente exclusivas – habilite apenas uma por vez.
Importante: Qualquer configuração de gerenciamento de tráfego (balanceamento de carga, tentativas, pooling de conexões, CORS, etc.) deve ser validada com testes de carga que reflitam a configuração escolhida e o perfil real de tráfego do cliente.
Você pode usar qualquer controlador que implemente a API K8s escolhida. Os exemplos abaixo mostram as opções mais comuns.
Opção 1: API Ingress do K8s (padrão)
Defina api.ingress.enabled: true (padrão) e api.gateway.enabled: false.
O chart cria um recurso Ingress Você precisa de um controlador Ingress instalado no seu cluster. Defina api.ingress.className para corresponder à IngressClass do seu controlador.
api.ingress.annotations está vazio por padrão. Adicione as anotações de que seu controlador precisa.
Controlador Ingress-NGINX – exemplo de configuração
Observação: O Ingress-NGINX projeto está em descontinuação. Considere migrar para o F5 NGINX Ingress Controller.
Controlador F5 NGINX Ingress – exemplo de configuração
O F5 NGINX Ingress Controller não possui anotações dedicadas para CORS. Use nginx.org/location-snippets com add_header diretivas em vez disso.
Consulte a documentação de anotações do F5 NGINX IC e o guia de migração do ingress-nginx.
Outros controladores Ingress
Qualquer controlador que implemente a API Ingress do Kubernetes funcionará. Defina api.ingress.className para a IngressClass do seu controlador e forneça as anotações apropriadas.
Opção 2: Gateway API
Defina api.ingress.enabled: false e api.gateway.enabled: true.
O chart cria um recurso Gateway e HTTPRoute Você precisa de um controlador que implemente a Gateway API do Kubernetes (ex.: Istio, Envoy Gateway, Cilium). Defina api.gateway.className para corresponder à sua GatewayClass.
Istio – exemplo de configuração
Pré-requisitos:
Istio >= 1.20 com CRDs do Gateway API instalado
cert-manager >= 1.5 com
--feature-gates=ExperimentalGatewayAPISupport=true
O chart cria Gateway e HTTPRoute recursos. Políticas de tráfego como balanceamento de carga, tentativas e CORS não são gerenciadas por este chart ao usar a Gateway API. Configure-as com CRDs do Istio aplicadas junto com o release do Helm.
Balanceamento de carga
DestinationRule
loadBalancer.simple: LEAST_REQUEST
Agrupamento de conexões
DestinationRule
connectionPool.http.maxRequestsPerConnection
Detecção de outliers
DestinationRule
outlierDetection (expulsar endpoints não saudáveis em 5xx)
Tentativas
EnvoyFilter
Nível de rota retryPolicy
CORS
EnvoyFilter
Filtro CORS do Envoy (typedPerFilterConfig)
Istio – balanceamento de carga, agrupamento de conexões e detecção de outliers
Crie um DestinationRule direcionado ao serviço Instant API (substitua <release-name> pelo nome do seu release do Helm, por ex. oz-api-instant):
Por padrão, LEAST_REQUEST seleciona o endpoint menos carregado dentre 2 candidatos aleatórios. Para uma distribuição mais uniforme entre os pods (especialmente útil com cargas pesadas de verificação de liveness), crie um EnvoyFilter para aumentar o tamanho do conjunto de candidatos:
Maior choice_count valores melhoram a distribuição de carga, mas adicionam uma pequena sobrecarga por requisição. Um valor de 5 é um bom ponto de partida para clusters com 5+ pods.
Como alternativa, no Istio >= 1.22 (Envoy >= 1.30) é possível usar o FULL_SCAN método de seleção, que verifica todos os endpoints e escolhe o que tiver menos requisições ativas (empates são resolvidos via amostragem por reservatório). Isso garante a escolha ótima, mas custa O(n) por requisição, portanto é mais adequado para implantações com um pequeno número de pods ou baixo RPS:
Quando load_balancing_policy está definido, ele tem precedência sobre o legado lb_policy / least_request_lb_config campos. Use uma abordagem ou a outra, não ambas.
Istio – tentativas
Crie um EnvoyFilter para adicionar uma política de tentativas no nível da rota:
Istio – CORS
Crie um EnvoyFilter para configurar os cabeçalhos CORS:
Substitua <release-name> pelo nome do seu release do Helm (por ex. oz-api-instant). O DestinationRule e EnvoyFilter os recursos acima são não fazem parte deste chart – aplique-os com kubectl apply após instalar o release do Helm.
A configuração exata do EnvoyFilter pode variar dependendo da sua versão do Istio. Teste com istioctl proxy-config routes e istioctl proxy-config listeners para verificar se os filtros foram aplicados corretamente.
Outros controladores da Gateway API
Qualquer controlador que implemente a Gateway API do Kubernetes funcionará. Defina api.gateway.className para o seu GatewayClass e adicione configurações específicas do controlador via api.gateway.annotations.
OpenShift Route
Este chart não cria recursos do OpenShift Route. Se precisar usar Routes, defina api.ingress.enabled: false e api.gateway.enabled: false, então crie manualmente um Route para a http-api porta do serviço (<release-name>-api).
Certificados TLS
Tanto as opções Ingress quanto Gateway suportam o provisionamento automático de certificados TLS via cert-manager. Defina clusterIssuer ou issuer em api.ingress.tls ou api.gateway.tls para referenciar seu issuer do cert-manager.
Configuração de proxy
Se o pod da Instant API exigir acesso à internet por meio de um proxy HTTP, defina api.proxy.enabled: true.
As duas opções abaixo são igualmente seguras – escolha a que melhor se adequar à sua configuração.
Opção 1: credenciais embutidas
Caracteres especiais na senha são codificados em percentuais automaticamente pelo chart.
Opção 2: Secret existente
Use isto quando as credenciais contiverem caracteres difíceis de escapar em YAML, ou quando você quiser manter as credenciais totalmente fora dos arquivos de values. Crie um Secret com a URL completa do proxy pré-codificada:
Em seguida, referencie-o em values:
Quando auth.existingSecret está definido, auth.login e auth.password são ignorados. O Secret deve conter uma chave chamada all_proxy com a URL completa do proxy, incluindo credenciais.
Armazenamento em S3
Instant API pode armazenar dados de verificação de liveness em um bucket S3 ou compatível com S3 em vez de armazenamento local. Duas variáveis de ambiente são sempre necessárias para habilitar o S3:
OZ_INSTANT_SAVING_ARTIFACTS_ENABLED: "true"(para versões de API abaixo de 6.5:OZ_INSTANT_SAVING_ARTIFACTS_IN_S3_ENABLED)OZ_FILE_STORAGE_TYPE: "S3".
Parâmetros não sensíveis do S3 vão em api.extraEnvs; as credenciais devem ser colocadas em um Secret pré-criado referenciado por api.extraEnvVarsSecret – suas chaves são injetadas como variáveis de ambiente junto com o ConfigMap.
Opção 1: AWS S3 com chaves de acesso
Crie um Secret com as credenciais:
Referencie-o em values junto com os parâmetros não sensíveis do S3:
Opção 2: AWS S3 com função IAM (EKS IRSA)
Use isto ao executar no EKS com IAM Roles for Service Accounts. Não são necessárias chaves de acesso – o pod assume uma função IAM via a service account.
1. Crie o bucket S3.
2. Crie um OIDC Identity Provider no IAM:
Type: OpenID Connect
Audience:
sts.amazonaws.com
3. Crie uma policy do IAM:
4. Crie uma função IAM com a seguinte política de confiança e, em seguida, anexe a policy da etapa 3:
Exemplo:
5. Anote a service account do chart com o ARN da função:
6. Defina variáveis de ambiente do S3 (sem chaves de acesso necessárias):
Opção 3: armazenamento compatível com S3 (MinIO, NetApp StorageGRID, etc.)
Compatibilidade testada: MinIO 5.4.0, NetApp StorageGRID 11.8.
Desinstalar
Isso não exclui os secrets de JWT e de pull da imagem. Remova-os manualmente, se necessário.
Atualizado
Isto foi útil?
