Pular para o conteúdo principal
Kubernetes

Duas ou mais réplicas atrás de um Service ClusterIP, acessíveis apenas pelo seu back-end.

Markdown

Pré-requisitos​

  • Um cluster Kubernetes e acesso a ele via kubectl.
  • Um banco de dados PostgreSQL dedicado ao Human Plugin, acessível a partir do cluster. Veja Pré-requisitos e acesso.
  • As credenciais do registry e a chave de acesso fornecidas pela Unico.

Tudo abaixo vai em um namespace próprio:

kubectl create namespace human-plugin

1. Pull secret do registry​

kubectl -n human-plugin create secret docker-registry unico-registry \
--docker-server=pkg.unico.run \
--docker-username="<username>" \
--docker-password="<token>"

2. Secret de configurações​

kubectl -n human-plugin create secret generic human-plugin \
--from-literal=HUMAN_API_ACCESS_KEY='<your access key>' \
--from-literal=POSTGRES_ADDRESS_HOST='<database host>' \
--from-literal=POSTGRES_USER='human_plugin' \
--from-literal=POSTGRES_PASSWORD='<database password>'

Adicione POSTGRES_ADDRESS_PORT, POSTGRES_DATABASE ou POSTGRES_SSL_MODE somente se seu banco de dados diferir dos valores padrão em Configuração. Se você gerencia segredos com outra ferramenta (External Secrets, Sealed Secrets, um vault), crie as mesmas chaves com ela. Nunca faça commit de um manifesto de Secret com valores.

3. Deployment e Service​

human-plugin.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: human-plugin
namespace: human-plugin
spec:
replicas: 2
selector:
matchLabels: { app: human-plugin }
template:
metadata:
labels: { app: human-plugin }
spec:
terminationGracePeriodSeconds: 60
imagePullSecrets:
- name: unico-registry
containers:
- name: human-plugin
image: pkg.unico.run/human-plugin-api:latest
imagePullPolicy: Always
ports:
- { name: http, containerPort: 8080 }
envFrom:
- secretRef: { name: human-plugin }
resources:
requests: { cpu: "1", memory: 1Gi }
limits: { cpu: "1", memory: 1Gi }
readinessProbe:
httpGet: { path: /health/ready, port: http }
timeoutSeconds: 5
livenessProbe:
httpGet: { path: /health/live, port: http }
periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: human-plugin
namespace: human-plugin
spec:
selector: { app: human-plugin }
ports:
- { name: http, port: 8080, targetPort: http }
kubectl apply -f human-plugin.yaml
kubectl -n human-plugin rollout status deployment/human-plugin
  • replicas: 2: as réplicas compartilham o banco de dados, então você pode executar quantas precisar. Duas mantêm o Human Plugin disponível enquanto uma reinicia.
  • terminationGracePeriodSeconds: 60: o Human Plugin espera até 55 segundos pelas requisições em andamento ao parar. O padrão do Kubernetes, 30 segundos, pode interromper um create.
  • imagePullPolicy: Always: com a tag latest, cada novo Pod baixa a versão mais recente.
  • Probes: a readiness mantém o tráfego longe de uma réplica até que o banco de dados dela responda, e timeoutSeconds: 5 faz a probe falhar quando o banco para de responder. Veja Saúde e monitoramento.
  • Recursos: os valores acima são o mínimo para cada réplica. Veja Requisitos de hardware.

4. Restrinja o acesso​

Seu back-end acessa o Human Plugin em http://human-plugin.human-plugin.svc:8080. O Human Plugin não tem autenticação própria, portanto:

  • não exponha o Service por meio de um Ingress, um LoadBalancer ou um NodePort;
  • permita apenas o namespace do seu back-end com uma NetworkPolicy.
network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: human-plugin-allow-backend
namespace: human-plugin
spec:
podSelector:
matchLabels: { app: human-plugin }
policyTypes: [Ingress]
ingress:
- from:
- namespaceSelector:
matchLabels: { kubernetes.io/metadata.name: <your back-end namespace> }
ports:
- { port: 8080 }

O próprio Human Plugin precisa de HTTPS de saída para a Unico e de acesso ao seu banco de dados. Veja Rede e segurança.

5. Valide​

kubectl -n human-plugin port-forward svc/human-plugin 8080:8080

Em outro terminal, verifique a readiness e execute a requisição de create do Quickstart contra http://127.0.0.1:8080:

curl --fail http://127.0.0.1:8080/health/ready

Logs​

kubectl -n human-plugin logs deploy/human-plugin --since=10m

Atualização​

kubectl -n human-plugin rollout restart deployment/human-plugin

Os novos Pods baixam a imagem mais recente e substituem os antigos um de cada vez, quando estiverem prontos. Veja Operações.