Implantação no Kubernetes
Este artigo tem como objetivo guiar você na implantação rápida do NocoBase em modo de cluster em um ambiente Kubernetes. Presume-se que você já esteja familiarizado com o ambiente Kubernetes e tenha concluído as etapas em Preparações.
Dica
Para verificar rapidamente o processo de implantação no Kubernetes, o ambiente operacional deste artigo é um cluster K3s de nó único (SO: Ubuntu). Este guia também é aplicável a clusters Kubernetes padrão. Se você encontrar alguma diferença ao implantar em um cluster Kubernetes padrão, por favor, nos avise.
Ambiente de Cluster
Se você já possui um ambiente de cluster Kubernetes, pode pular esta etapa.
Prepare um servidor com Debian / Ubuntu instalado e execute um cluster K3s em modo de nó único nele. Para saber mais sobre o K3s, visite o site oficial do K3s.
Siga os passos abaixo:
- Acesse o servidor via SSH.
- No servidor, use o script oficial para instalar o nó mestre do cluster K3s.
# Após a instalação, o arquivo kubeconfig padrão é /etc/rancher/k3s/k3s.yaml
curl -sfL https://get.k3s.io | sh -
# Verifique se a configuração está correta
kubectl get node
Implantação da Aplicação em Cluster
Implante a aplicação NocoBase em modo de cluster em um ambiente Kubernetes.
Variáveis de Ambiente
Geralmente, as variáveis de ambiente devem ser separadas do arquivo de configuração de implantação da aplicação. Este artigo usa um ConfigMap como exemplo de orquestração. Em um ambiente de produção, você pode usar Secrets para separar ainda mais informações sensíveis.
Siga os passos abaixo:
- Crie o arquivo
nocobase-cm.yaml.
apiVersion: v1
kind: ConfigMap
metadata:
name: nocobase-config
data:
# Defina seu fuso horário, por exemplo, America/Sao_Paulo, UTC
TZ: America/Sao_Paulo
# As configurações de banco de dados e Redis abaixo usam os serviços PostgreSQL e Redis do cluster, conforme o documento "Implantação de Middleware no Kubernetes".
# Se o seu ambiente já possui serviços de banco de dados e Redis existentes, modifique as configurações correspondentes abaixo.
CACHE_DEFAULT_STORE: redis
# Use um serviço Redis existente ou implantado por você.
CACHE_REDIS_URL: "redis://redis-0.redis-service:6379/0"
PUBSUB_ADAPTER_REDIS_URL: "redis://redis-0.redis-service:6379/1"
LOCK_ADAPTER_REDIS_URL: "redis:/redis-0.redis-service:6379/2"
# Use um serviço PostgreSQL existente ou implantado por você.
DB_DATABASE: nocobase
DB_DIALECT: postgres
DB_HOST: "postgres-0.postgres-service"
DB_PASSWORD: nocobase123
DB_PORT: "5432"
DB_UNDERSCORED: "true"
DB_USER: nocobase
# nome de usuário da plataforma de serviço
NOCOBASE_PKG_USERNAME: "<seu usuário>"
# senha da plataforma de serviço
NOCOBASE_PKG_PASSWORD: "<sua senha>"
# ... outras variáveis de ambiente
- Execute o comando
kubectl para implantar o ConfigMap.
kubectl apply -f nocobase-cm.yaml
Armazenamento Compartilhado
Diferentes nós de uma aplicação NocoBase implantada em modo de cluster precisam montar o mesmo diretório de armazenamento (storage). Para isso, você precisará criar um Volume Persistente (PV) que suporte acesso de leitura e escrita por múltiplos nós (ReadWriteMany). Geralmente, você criaria um disco na nuvem na plataforma do seu provedor de serviços e o vincularia como um PV, ou pode montar um diretório de armazenamento compartilhado usando outros métodos, como NFS.
Implantação da Aplicação
Para a implantação inicial, comece com um único nó. Após a conclusão, você pode escalar para múltiplos nós.
- Crie o arquivo
nocobase-apps.yaml.
# Crie um PVC. Múltiplos Pods implantados por este Deployment montarão o mesmo diretório de armazenamento persistente através deste PVC.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nocobase-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: "" # Definido explicitamente como vazio, pois o exemplo usa o serviço NFS do nó mestre, evitando o StorageClass padrão.
---
# O Service da aplicação, que fornece serviços para fora do cluster após ser vinculado a um Ingress.
apiVersion: v1
kind: Service
metadata:
name: nocobase
spec:
ports:
- name: nocobase
port: 13000
targetPort: 13000
selector:
app: nocobase
type: ClusterIP
---
:::tip Aviso de tradução por IA
Esta documentação foi traduzida automaticamente por IA.
:::
# O Deployment da aplicação, que pode implantar múltiplos contêineres da aplicação.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nocobase
spec:
replicas: 1 # Implantação inicial com apenas um nó.
selector:
matchLabels:
app: nocobase
template:
metadata:
labels:
app: nocobase
spec:
containers:
- name: nocobase
image: nocobase/nocobase:1.6
ports:
- containerPort: 13000
# Carrega as variáveis de ambiente do ConfigMap implantado anteriormente.
envFrom:
- configMapRef:
name: nocobase-config
volumeMounts:
- name: nocobase-data
mountPath: /app/nocobase/storage
# Declara as requisições e limites de recursos para o serviço.
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
# Comando de liveness probe. O cluster usa isso para determinar se o Pod precisa ser reiniciado.
livenessProbe:
httpGet:
path: /api/__health_check
port: 13000
initialDelaySeconds: 60
# Comando de readiness probe. O cluster usa isso para determinar se deve direcionar o tráfego do Service para o Pod.
readinessProbe:
httpGet:
path: /api/__health_check
port: 13000
initialDelaySeconds: 30
# Monta o armazenamento persistente via PVC.
volumes:
- name: nocobase-data
persistentVolumeClaim:
claimName: nocobase-pvc
- Execute o comando
kubectl para implantar o serviço da aplicação NocoBase.
kubectl apply -f nocobase-apps.yaml
- Verifique o status do serviço da aplicação NocoBase.
# Verifique o status dos Pods do serviço NocoBase
kubectl get pods -l app=nocobase
A saída de exemplo é a seguinte. Um STATUS de Running indica que o serviço foi iniciado com sucesso:
NAME READY STATUS RESTARTS AGE
nocobase-5558b774d7-w6swf 1/1 Running 0 7h6m
- Na primeira inicialização da aplicação, você precisará habilitar manualmente os seguintes plugins na interface de administração:
- @nocobase/plugin-sync-adapter-redis
- @nocobase/plugin-lock-adapter-redis
Depois disso, você pode escalar. Por exemplo, para escalar para 4 nós:
kubectl scale deployment nocobase --replicas=4
Alterações na Aplicação
Alterações na aplicação referem-se às seguintes situações:
- Atualização da versão da aplicação
- Instalação de novos plugins
- Ativação de plugins
O NocoBase ainda não oferece suporte à sincronização automática de alterações entre múltiplas instâncias em um cluster para os cenários acima. Portanto, você precisará lidar com eles manualmente, seguindo os passos abaixo. Estes passos envolvem apenas alterações no serviço da aplicação. Antes de fazer qualquer alteração, por favor, faça backup do seu banco de dados e do armazenamento persistente.
Atualização Contínua da Versão da Aplicação
-
Execute o comando kubectl set image para alterar a versão da imagem do contêiner do Deployment.
kubectl set image deployment/nocobase nocobase=nocobase/nocobase:1.7
-
Verifique o status da atualização contínua.
# Verifique o progresso geral da atualização contínua do Deployment
kubectl rollout status deployment/nocobase
# Verifique o status de cada Pod
kubectl get pods -l app=nocobase
Se você encontrar algum problema durante ou após a atualização da versão da aplicação e precisar reverter, execute o comando abaixo para reverter a versão da imagem do contêiner:
kubectl rollout undo deployment/nocobase
Reinício Suave da Aplicação
Após instalar ou ativar novos plugins, você precisará atualizar a configuração ou o estado da aplicação. Você pode usar o comando abaixo para reiniciar suavemente cada Pod.
-
Execute o comando kubectl rollout restart.
kubectl rollout restart deployment/nocobase
-
Verifique o status do reinício contínuo.
# Verifique o progresso geral do reinício do Deployment
kubectl rollout status deployment/nocobase
# Verifique o status de cada Pod
kubectl get pods -l app=nocobase
Gateway da Aplicação
Para que uma aplicação implantada em um cluster Kubernetes seja acessível externamente, você precisará vincular um Ingress ao Service da aplicação. O ambiente de cluster usado neste artigo é o K3s, que vem com Traefik como o Ingress Controller padrão.
Traefik IngressRoute
Siga os passos abaixo:
-
Crie o arquivo nocobase-ingress.yaml.
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nocobase-ingress
spec:
entryPoints:
- web
routes:
# Aqui, 'nocobase.local' deve ser substituído por um nome de domínio real que aponte para o IP do cluster.
# Se você não tiver um domínio para verificação, pode modificar o arquivo hosts local para adicionar um registro para nocobase.local apontando para o IP do cluster.
# Você poderá então acessar a aplicação NocoBase no cluster abrindo http://nocobase.local no seu navegador.
- match: Host(`nocobase.local`)
kind: Rule
services:
# Este é o Service criado ao implantar a aplicação nocobase na seção "Implantação da Aplicação" acima.
- name: nocobase
port: 13000
-
Execute o comando kubectl para implantar o Ingress da aplicação NocoBase.
kubectl apply -f nocobase-ingress.yaml
Ingress-Nginx
A maioria dos clusters Kubernetes usa Ingress-Nginx como o Ingress Controller. Abaixo está um arquivo nocobase-ingress.yaml baseado em Ingress-Nginx:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: nocobase-ingress
spec:
rules:
# Aqui, 'nocobase.local' deve ser substituído por um nome de domínio real que aponte para o IP do cluster.
# Se você não tiver um domínio para verificação, pode modificar o arquivo hosts local para adicionar um registro para nocobase.local apontando para o IP do cluster.
# Você poderá então acessar a aplicação NocoBase no cluster abrindo http://nocobase.local no seu navegador.
- host: nocobase.local
http:
paths:
- backend:
serviceName: nocobase
servicePort: 13000
Usando Helm Charts
Criamos Helm Charts para a aplicação NocoBase, permitindo que você implante o serviço da aplicação NocoBase no Kubernetes usando o Helm CLI.
Pré-requisitos
Certifique-se de que clientes como kubectl e helm estejam instalados no seu ambiente operacional e que o kubectl possa se conectar corretamente ao cluster de destino.
Adicionar Repositório
Adicione o repositório dos Helm Charts do NocoBase:
# Adicione o repositório dos Helm Charts do NocoBase
helm repo add nocobase https://nocobase.github.io/helm-charts
# Atualize o índice do Helm
helm repo update
-
Crie o arquivo values.yaml.
persistent:
# Tamanho necessário para o armazenamento compartilhado do cluster NocoBase
size: 10Gi
# Classe de armazenamento fornecida pelo Kubernetes do serviço de nuvem
# Assim como na seção "Implantação da Aplicação", este é explicitamente definido como vazio porque usa o serviço NFS do nó mestre.
storageClassName: ""
configMap:
data:
# Defina seu fuso horário, por exemplo, America/Sao_Paulo, UTC
TZ: America/Sao_Paulo
# As configurações de banco de dados e Redis abaixo usam os serviços PostgreSQL e Redis do cluster, conforme o documento "Implantação de Middleware no Kubernetes".
# Se o seu ambiente já possui serviços de banco de dados e Redis existentes, modifique as configurações correspondentes abaixo.
CACHE_DEFAULT_STORE: redis
# Use um serviço Redis existente ou implantado por você.
CACHE_REDIS_URL: "redis://redis-0.redis-service:6379/0"
PUBSUB_ADAPTER_REDIS_URL: "redis://redis-0.redis-service:6379/1"
LOCK_ADAPTER_REDIS_URL: "redis:/redis-0.redis-service:6379/2"
# Use um serviço PostgreSQL existente ou implantado por você.
DB_DATABASE: nocobase
DB_DIALECT: postgres
DB_HOST: "postgres-0.postgres-service"
DB_PASSWORD: nocobase123
DB_PORT: "5432"
DB_UNDERSCORED: "true"
DB_USER: nocobase
# nome de usuário da plataforma de serviço
NOCOBASE_PKG_USERNAME: "<seu usuário>"
# senha da plataforma de serviço
NOCOBASE_PKG_PASSWORD: "<sua senha>"
# ... outras variáveis de ambiente
-
Execute o comando helm install para iniciar a instalação.
helm install nocobase nocobase/nocobase --values values.yaml