Instalação do Kubepit
Pré-requisitos
O Kubepit requer:
-
Um cluster Kubernetes;
-
O cadastro prévio dos Deployments (aplicações);
-
Um provedor OIDC (OpenID Connect) com as permissões documentadas na seção à seguir.
O provisionamento de uma aplicação no Kubernetes envolve o cadastro do Deployment, que pode incluir variáveis de ambiente, estratégia de rollout, probes de monitoramento, dentre outras configurações, mais eventuais objetos associados, como ConfigMaps (ex: arquivos de profile da aplicação), Volumes e VolumeClaims (armazenamento), Service (DNS), Ingress (proxy / Load Balancer) etc.
A configuração do Kubernetes fica sob responsabilidade da equipe com autoridade para isso, normalmente uma equipe dedicada a infraestrutura ou parte do squad com essa competência, tal como um analista de DevOps com acesso privilegiado. Tipicamente as configurações são feitas uma vez e alteradas rara ou eventualmente.
Uma vez configurados os Deployments, as atualizações podem ser gerenciadas via Kubepit.
Instalação
O Kubepit é composto de duas aplicações: o kubepit-service, backend, kubepit-web, frontend web.
Ambos podem ser instalados como Pods no Kubernetes. É fornecida imagem Docker all-in-one.
Por padrão o Kubepit se conecta no cluster no qual o container kubepit-service foi instalado.
É possível configurar o Kubepit para gerenciar um cluster remoto. Para isso, informe o caminho e nome
do kubeconfig.yml através da propriedade Spring Boot app.kubeconfig-file ou variável de ambiente
APP_KUBECONFIG_FILE.
Por motivo de segurança, o Kubepit gerencia somente Deployments com o label 'kubepit: enabled',
que deve ser adicionado também nos Namespaces correspondentes.
Controle de Acesso
O Kubepit utiliza OIDC (OpenID Connect) com JWT como esquema de autenticação e autorização. As permissões devem
ser entregues pelo Provedor OIDC no atributo roles (array de strings) do JWT bem como no JSON do UserInfo:
| Role | Descrição |
|---|---|
"kubepit" |
Permissão mínima, permite acesso de leitura às Requisições de Mudança e à página de status das aplicações. |
"kubepit:settings:update" |
Permite que o usuário administre o Kubepit (*1). |
"kubepit:change:request" |
Permite que o usuário registre uma nova requisição de mudança. |
"kubepit:change:approve" |
Permite que o usuário aprove uma requisição de mudança (*2). |
"kubepit:change:cancel" |
Permite que o usuário cancele uma requisição de mudança (*3). |
"kubepit:change:schedule" |
Permite que o usuário agende a requisição de mudança para uma data arbitrária. |
"kubepit:change:inspect" |
Permite que o usuário visualize dados técnicos da mudança (*4). |
"kubepit:deploy:restart" |
Permite que o usuário reinicie uma aplicação. Essa ação não está vinculada a um fluxo de gestão de mudança. |
Nota *1: Dentre as configurações disponíveis, é possível habilitar a segregação de papéis, tal que a aprovação da mudança não pode ser feita pelo mesmo usuário solicitante; permite também configurar o agendamento (expressão cron) para as implantações das mudanças.
Nota *2: Se a opção de segregação de papéis estiver ativa, o aprovador necessariamente deve ser um usuário diferente do solicitante.
Nota *3: O solicitante sempre pode cancelar seu próprio pedido.
Nota *4: Essa permissão é sensível e para fins de depuração e auditoria, pois os dados técnicos incluem snapshots dos principais objetos do Kubernetes envolvidos na aplicação da mudança, a citar o conteúdo YAML do Deployment, que pode conter dados restritos.
Exemplo de JWT:
{
"sub": "e2fcfbcf-4d3c-4d60-9fbb-75e4f12df7da",
"iss": "https://oidc.domain.com/realm",
"exp": 32503680000,
"scope": "openid email profile",
"name": "Nome do Usuário",
"email": "[email protected]",
"user_id": "12345-6",
"roles": [
"kubepit",
"kubepit:settings:update",
"kubepit:change:request",
"kubepit:change:approve",
"kubepit:change:cancel",
"kubepit:change:schedule",
"kubepit:change:inspect",
"kubepit:deploy:restart"
]
}
Personalizando o Kubepit
Banco de Dados
O Kubepit é fornecido com o banco de dados H2, cujo diretório de dados fica na pasta /data do container.
Qualquer SGBD compatível com JPA 2 e Liquibase pode ser utilizado. As configurações de banco são definidas via propriedades padrões do Spring Boot. Exemplo de utilização do PostgreSQL:
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://domain:5432/kubepit
spring.datasource.username=kubepit
spring.datasource.password=...
spring.jpa.properties.hibernate.default_schema=main
Os drivers para PostgreSQL, MySQL, MariaDB e SQLServer estão inclusos por padrão.
| SGBD | Driver | Versão |
|---|---|---|
| PostgreSQL | postgresql | 42.7.4 |
| MySQL | mysql-connector-j | 8.4.0 |
| MariaDB | mariadb-java-client | 3.4.1 |
| SQLServer | mssql-jdbc | 12.8.1.jre11 |
Para utilização de outros servidores de bancos de dados, inclua o driver no pom.xml a partir do
código-fonte do projeto e faça o build da imagem do Kubepit.
O H2 é recomendado para fins de avaliação do Kubepit ou uso em pequena escala. Configure o SGDB adequado conforme seu ambiente produtivo, considerando, dentre outros, os requisitos de controle, performance e segurança.
O console web do H2 está disponível na URL de path /h2-console. Dados padrões de acesso:
- JDBC URL:
jdbc:h2:/data/h2/kubepit - Usuário:
root - Senha: (vazia).
As configurações do H2 podem ser ajustadas via propriedades do Spring Boot.
Templates de Notificações
As notificações emitidas pelo Kubepit utilizam templates em FreeMarker.
É possível fornecer templates próprios. Para isso, configure no container do Kubepit
o diretório que contém os templates conforme a propriedade Spring Boot
spring.freemarker.template-loader-path ou variável de ambiente SPRING_FREEMARKER_TEMPLATE_LOADER_PATH.
Arquivos esperados na pasta de templates:
ChangeApproved_Mail_Body.ftl
ChangeApproved_Mail_Subject.ftl
ChangeCanceled_Mail_Body.ftl
ChangeCanceled_Mail_Subject.ftl
ChangeCreated_Mail_Body.ftl
ChangeCreated_Mail_Subject.ftl
ChangeFailed_Mail_Body.ftl
ChangeFailed_Mail_Subject.ftl
ChangeDeployed_Mail_Body.ftl
ChangeDeployed_Mail_Subject.ftl
ChangeScheduled_Mail_Body.ftl
ChangeScheduled_Mail_Subject.ftl
RolloutCompleted_Mail_Body.ftl
RolloutCompleted_Mail_Subject.ftl
RolloutFailed_Mail_Body.ftl
RolloutFailed_Mail_Subject.ftl
RolloutUnavailable_Mail_Body.ftl
RolloutUnavailable_Mail_Subject.ftl
Os arquivos originais podem ser usados como modelo, disponíveis na pasta
/src/main/resources/templates do projeto.
Parâmetros
O Kubepit suporta os seguintes parâmetros Spring Boot, que podem ser informados conforme as possibilidades
do Spring, como arquivo de propriedades, variáveis de ambiente ou parâmetros de JVM via JAVA_OPTS:
| Propriedade | Variável de ambiente | Valor padrão | Descrição |
|---|---|---|---|
app.label-selector |
APP_LABEL_SELECTOR |
kubepit=enabled |
Expressão label selector que torna um Namespace e Deployment gerenciáveis pelo Kubepit. |
app.annotation-key-restarted |
APP_ANNOTATION_KEY_RESTARTED |
kubepit/restartedAt |
Chave do annotation que o Kubepit aplica no Deployment Kubernetes (em spec.template.metadata.annotations) quando é utilizada a funcionalidade de restart da aplicação. |
app.annotation-key-change |
APP_ANNOTATION_KEY_CHANGE |
kubepit/lastChangeUid |
Chave do annotation que o Kubepit aplica no Deployment Kubernetes para persistir o UID do Change Request. Auxilia na auditoria e rastreamento de mudanças. O annotation é aplicado em spec.template.metadata.annotations e metadata.annotations. |
app.rollout.fail-fast.reasons |
APP_ROLLOUT_FAIL_FAST_REASONS |
ImagePullBackOff, CrashLoopBackOff, FailedCreate, Error, RunContainerError |
Lista de valores de reason de status que faz o Kubepit entender que houve falha no Pod durante a janela de rollout. |
app.kubeconfig-file |
APP_KUBECONFIG_FILE |
(não definido) | Se informado, indica o caminho do arquivo de conexão para o cluster Kubernetes. Por padrão o Kubepit acessa o cluster no qual o container kubepit-service foi instalado. |
app.user-key |
APP_USER_KEY |
email |
Informe email ou user_id. Indica o campo chave do JWT que será considerado na validação de segregação de papéis. |
Informações Adicionais
Atributos da Mudança
A Requisição de Mudança possui os seguintes atributos:
| Atributo | Descrição |
|---|---|
uid |
Identificação da Requisição de Mudança. Persistida no Deployment quando a Requisição de Mudança é aplicada, nos annotations em spec.template.metadata e metadata, conforme chave configurada em app.annotation-key-release. |
namespace |
Nome do Namespace do Deployment associada à Requisição de Mudança. |
deploymentName |
Nome do Deployment associada à Requisição de Mudança. |
currentImage |
Caminho completo da imagem do container principal (índice 0) no momento da criação da Requisição de Mudança. |
newImageVersion |
Versão solicitada para implantação (nova tag da imagem). |
changeStatusDescription |
Valores: New, Approved, Canceled, Processing, Deployed e Failed. |
changeStatusId |
Respectivamente, de 1 a 6. |
rolloutStatusDescription |
Valores: Not started, Started, Completed, Failed, Unavailable e Unknown. |
rolloutStatusId |
Respectivamente, de 1 a 6. |
requestEvent |
Dados da ação de criação da Requisição de Mudança, contém: eventDate, userId, userName e userEmail. Os três dados do usuário são oriundos dos claims JWT user_id, name e email. |
approvalEvent |
Dados da ação de aprovação da Requisição de Mudança, com mesmos atributos acima. |
cancellationEvent |
Dados da ação de cancelamento da Requisição de Mudança, com mesmos atributos acima. |
schedulingEvent |
Dados da última ação de agendamento da Requisição de Mudança, com mesmos atributos acima. |
scheduleDate |
Data em que mudança será aplicada no cluster. |
deploymentDate |
Data em que mudança foi aplicada no cluster. |
rolloutUpdateDate |
Última data em que a situação do rollout foi atualizada. |
completionDate |
Data em que o rollout foi marcado como Completed (disponibilidade 100%). |
failedDate |
Data em que a aplicação da mudança no cluster ou o rollout falhou. |
deploymentUid |
UID do Deployment no momento da aplicação da mudança no cluster. |
deploymentGeneration |
Geração do Deployment imediatamente após a aplicação da mudança no cluster. |
deploymentRevision |
Revisão do Deployment imediatamente após a aplicação da mudança no cluster. |
deploymentDeadlineSeconds |
Valor do progress deadline imediatamente após a aplicação da mudança no cluster. |
replicaSetUid |
UID do ReplicaSet relativo ao rollout da nova geração do Deployment. |
podTemplateHash |
PodTemplateHash obtido do ReplicaSet relativo ao rollout da nova geração do Deployment. |
processingStartDate |
Momento em que o Kubepit iniciou a aplicação da Requisição de Mudança. Passos executados: validações -> snapshots de YAMLs -> atualização do Deployment -> snapshots de YAMLs. |
processingEndDate |
Momento em que o Kubepit concluiu a aplicação da Requisição de Mudança. |
trackingStartDate |
Momento em que o Kubepit iniciou a iteração mais recente do rastreamento do rollout. |
trackingEndDate |
Momento em que o Kubepit concluiu a iteração mais recente do rastreamento do rollout. |
rolloutStatusDelayed |
Se true, indica que a situação do rollout está um pouco atrasada (algum delay na captura pelo Kubepit), de forma que não seria conveniente considerar que a diferença completion/failedDate - deploymentDate como sendo o tempo total do rollout. |
errorMessage |
Erro na aplicação da mudança no cluster ou no rollout. |
Considerações Finais
-
O Kubepit não cria ou apaga Deployments ou quaisquer outros objetos no Kubernetes.
-
O Kubepit monitora a atualização dos Pods dentro do cluster, porém não interfere na estratégia de rollout nem na escalabilidade.
-
O Kubepit atualiza o container principal do Deployment (índice 0).