Instalação do Kubepit

Pré-requisitos

O Kubepit requer:

  1. Um cluster Kubernetes;

  2. O cadastro prévio dos Deployments (aplicações);

  3. 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

  1. O Kubepit não cria ou apaga Deployments ou quaisquer outros objetos no Kubernetes.

  2. O Kubepit monitora a atualização dos Pods dentro do cluster, porém não interfere na estratégia de rollout nem na escalabilidade.

  3. O Kubepit atualiza o container principal do Deployment (índice 0).