Razee é um projeto de código aberto desenvolvido pela IBM para automatizar e gerenciar a implementação de recursos do Kubernetes em clusters, ambientes e provedores de nuvem e para visualizar informações de implementação de seus recursos para que você possa monitorar o processo de implementação e encontrar problemas de implementação mais rapidamente.
Veja os links a seguir para começar a usar o Razee:
Revise os principais recursos do Razee e como você pode aproveitá-los para gerenciar a implantação de recursos do Kubernetes para seus clusters.
O Razee consiste em três módulos, RazeeDash, RazeeDeployables e RazeeDeploy, que são fracamente acoplados e podem ser usados de forma independente. Com o RazeeDash, você pode criar dinamicamente um inventário ao vivo de seus recursos do Kubernetes e usar filtros poderosos e recursos de alerta para visualizar informações de configuração e solucionar problemas em seu processo de implantação mais rapidamente. Os componentes RazeeDeploy são projetados para simplificar implantações de vários clusters, modelando recursos do Kubernetes, agrupando recursos e clusters e definindo regras para esses agrupamentos para que você possa criar uma configuração flexível que seja aplicada em clusters, ambientes e nuvens.
Componente | Descrição |
---|---|
Guardião do Vigia | O Watch Keeper é responsável por recuperar informações de configuração dos recursos do Kubernetes e enviar esses dados para a API RazeeDash. Para usar o Watch Keeper, basta instalar este componente em seu cluster e adicionar o rótulo razee/watch-resource a todos os recursos que você deseja monitorar. Depois de adicionar o rótulo, o Watch Keeper recupera informações de configuração do servidor API Kubernetes e envia imediatamente esses dados para a API RazeeDash. Este processo se repete uma vez a cada hora. Além disso, o Watch Keeper adiciona um observador de eventos do Kubernetes ao seu recurso para que o Watch Keeper seja notificado pelo Kubernetes quando a configuração do seu recurso for alterada. |
API RazeeDash | API RazeeDash é um serviço que recebe configurações e definições de recursos do Kubernetes do Watch Keeper. Os dados enviados para a API RazeeDash são armazenados automaticamente no MongoDB. |
RazeeDash | RazeeDash visualiza dados recuperados pelo Watch Keeper e cria dinamicamente um inventário de seus recursos Kubernetes em seu cluster. Você pode usar o filtro inteligente e os recursos de alerta para analisar esses dados e identificar e resolver rapidamente problemas em seu processo de implantação. |
Assinatura de cluster | ClusterSubscription é uma implantação Razee que monitora assinaturas no Razee para verificar se existem assinaturas ativas para um cluster. Se uma assinatura for encontrada, a versão associada do recurso Kubernetes será extraída do Razee e aplicada automaticamente no cluster. |
Componente | Descrição |
---|---|
Núcleo RazeeDeploy | RazeeDeploy Core é uma ferramenta de entrega contínua executada em seu cluster e que você pode usar para configurar CustomResourceDefinitions (CRD), controladores Kubernetes e dependências para os componentes RazeeDeploy. |
RazeeDeploy Delta | RazeeDeploy Delta é um componente do RazeeDeploy Core que é executado em seu cluster e mantém as definições de recursos personalizados e os controladores Kubernetes dos componentes RazeeDeploy atualizados. |
RemoteResource e Recurso Remoto S3 | RemoteResource e RemoteResourceS3 são definições de recursos customizados e controladores que você pode usar para implantar automaticamente recursos do Kubernetes armazenados em um repositório de origem. Em vez de aplicar manualmente esses arquivos YAML em cada cluster, ambiente ou entre nuvens sempre que uma atualização é feita, basta definir o repositório de origem em seu recurso remoto e criar o recurso remoto em seu cluster. O controlador de recursos remoto se conecta automaticamente ao seu repositório de origem, baixa o arquivo de configuração do Kubernetes e aplica o arquivo ao seu cluster. |
Modelo de bigode | MustacheTemplate é uma definição de recurso customizada e um controlador para definir variáveis de ambiente que você pode usar para substituir partes do arquivo YAML em outros arquivos YAML do Kubernetes. Por exemplo, use as variáveis de ambiente do seu modelo bigode para criar a URL do seu recurso remoto para que você possa apontar para a versão do aplicativo que deseja implantar. |
FeatureFlagSetLD | FeatureFlagSetLD é uma definição de recurso personalizado e controlador para recuperar automaticamente valores de sinalizador de recurso do Launch Darkly. Com sinalizadores de recursos, você pode controlar qual código é implantado em seu cluster e gerenciar várias versões de recursos do Kubernetes em clusters, ambientes ou nuvens. |
Conjunto gerenciado | ManagedSet é uma definição de recurso customizada e um controlador para agrupar recursos do Kubernetes que você deseja criar e aplicar ao cluster ao mesmo tempo. |
Utilitários do Kubernetes | Os utilitários do Kubernetes são um pacote npm que você pode usar para simplificar a comunicação com o Kubernetes. |
Para implantar o Razee em seu cluster, seu cluster deve atender aos seguintes requisitos:
Primeiro instale razeedeploy-delta em seu cliente executando:
kubectl apply -f https://github.com/razee-io/Razee/releases/latest/download/razeedeploy.yaml
Exemplo de saída:
namespace/razeedeploy created
serviceaccount/razeedeploy-sa created
clusterrole.rbac.authorization.k8s.io/razeedeploy-admin-cr configured
clusterrolebinding.rbac.authorization.k8s.io/razeedeploy-rb configured
job.batch/razeedeploy-job created
kubectl get deploy -n razeedeploy
NAME READY UP-TO-DATE AVAILABLE AGE
remoteresource-controller 1/1 1 1 56s
Instale os componentes RazeeDash em seu cluster. Para armazenar dados enviados para a API RazeeDash, você deve configurar uma instância do MongoDB. Você pode optar por configurar o RazeeDash e uma única instância do MongoDB usando o arquivo razeedash-all-in-one.yaml
fornecido ou configurar o RazeeDash com uma instância existente do MongoDB que é executada em seu cluster. Nota : Se você já possui uma instância do RazeeDash em execução em um de seus clusters e, em vez disso, deseja apenas adicionar outro cluster à sua lista de inventário, você pode pular esta etapa e continuar instalando o componente Watchkeeper em seu cluster.
Para instalar o RazeeDash e uma única instância do MongoDB :
kubectl apply -f https://github.com/razee-io/Razee/releases/latest/download/razeedash-all-in-one.yaml
Exemplo de saída:
persistentvolume/mongo-pv-volume created
persistentvolumeclaim/mongo-pv-claim created
deployment.apps/mongo created
service/mongo created
secret/razeedash-secret created
remoteresource.deploy.razee.io/razeedash created
service/razeedash-lb created
service/razeedash-api-lb created
Para usar uma instância existente do MongoDB :
Crie o segredo razeedash para mongo_url. Substitua o comando abaixo pelo nome de usuário e senha reais junto com 3 instâncias de host para mongo-0, mongo-1 e mongo-3 junto com as portas corretas. Certifique-se de que o final do URL do mongo tenha /razeedash?ssl=true
.
Exemplo :
kubectl -n razee create secret generic razeedash-secret --from-literal " mongo_url=mongodb://username:password@mongo‑0:27017,mongo‑1:27017,mongo‑2:27017/razeedash?ssl=true "
kubectl apply -f https://github.com/razee-io/Razee/releases/latest/download/razeedash.yaml
Aguarde a conclusão da implantação razeedash-api
. Se você optou por criar o RazeeDash usando o arquivo razeedash-all-in-one.yaml
fornecido na etapa anterior, uma instância do MongoDB será criada em seu cluster e conectada à instância da API RazeeDash. A configuração do MongoDB leva alguns minutos para ser concluída e pode levar a erros intermitentes MongoNetworkError
na implantação da API RazeeDash. Quando o MongoDB está totalmente configurado, o Kubernetes conclui automaticamente a configuração da sua instância da API RazeeDash.
kubectl logs deploy/razeedash-api -n razee
Exemplo de saída se o MongoDB ainda não estiver configurado:
> [email protected] start /usr/src
> node app/index.js
(node:16) UnhandledPromiseRejectionWarning: MongoNetworkError: getaddrinfo
ENOTFOUND mongo
at Socket. < anonymous > (/usr/src/node_modules/mongodb-core/lib/connection/connect.js:287:16)
at Object.onceWrapper (events.js:284:20)
at Socket.emit (events.js:196:13)
at emitErrorNT (internal/streams/destroy.js:91:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
at processTicksAndRejections (internal/process/task_queues.js:84:9)
(node:16) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch (). (rejection id: 1)
(node:16) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Exemplo de saída se a API RazeeDash estiver totalmente configurada:
> [email protected] start /usr/src
> node app/index.js
{ " name " : " apollo/subscription " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Apollo streaming servic e is configured on redisUrl: redis://redis-service:6379/0 " , " time " : " 2020-06-03T21:57:16.021Z " , " v " :0}
{ " name " : " apollo/subscription " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Apollo streaming is ena bled on redis endpoint redis-service:6379 " , " time " : " 2020-06-03T21:57:17.062Z " , " v " :0}
{ " name " : " / " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Created new collection users index users " , " time " : " 2020-06-03T21:57:17.222Z " , " v " :0}
{ " name " : " / " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Created new View clusterStatsView " , " time " : " 2020-06-03T21:57:17.239Z " , " v " :0}
{ " name " : " / " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Created new View resourceStatsView " , " time " : " 2020-06-03T21:57:17.241Z " , " v " :0}
{ " name " : " apollo/models " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " SetupDistributedCollections r eceived modelName=resources for DB mongodb://mongo:27017/razeedash " , " time " : " 2020-06-03T21:57:17.284Z " , " v " :0}
{ " name " : " apollo/models " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " SetupDistributedCollections r eceived modelName=orgs for DB mongodb://mongo:27017/razeedash " , " time " : " 2020-06-03T21:57:17.295Z " , " v " :0}
{ " name " : " apollo/models " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " SetupDistributedCollections:c lusters - received modelName=clusters for DB mongodb://mongo:27017/razeedash " , " time " : " 2020-06-03T21:57:17.297Z " , " v " :0}
{ " name " : " apollo " , " parseUA " :false, " excludes " :[ " referer " , " url " , " short-body " , " user-agent " , " req " , " res " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Initialize apollo application for default auth " , " time " : " 2020-06-03T21:57:17.298Z " , " v " :0}
{ " name " : " apollo " , " parseUA " :false, " excludes " :[ " referer " , " url " , " short-body " , " user-agent " , " req " , " res " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " [] Apollo server c ustom plugin are loaded. " , " time " : " 2020-06-03T21:57:17.299Z " , " v " :0}
{ " name " : " razeedash-api " , " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " ? razeedash-api listening on port 3333/api " , " time " : " 2020-06-03T21:57:17.723Z " , " v " :0}
{ " name " : " apollo " , " parseUA " :false, " excludes " :[ " referer " , " url " , " short-body " , " user-agent " , " req " , " res " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " ? Apollo server listening on http://[::]:3333/graphql " , " time " : " 2020-06-03T21:57:17.734Z " , " v " :0}
Recupere o endereço IP externo dos serviços de balanceador de carga razeedash-lb
e razeedash-api-lb
que são criados automaticamente durante a configuração da API RazeeDash. razeedash-lb
serve como endpoint público para sua instância RazeeDash e razeedash-api-lb
serve como endpoint público para sua instância de API RazeeDash. Usando os endereços IP públicos que foram atribuídos, você pode construir as URLs públicas usadas para acessar o RazeeDash e os componentes da API RazeeDash. Para finalizar a configuração do RazeeDash, os dois URLs devem ser armazenados no mapa de configuração do RazeeDash. Use os seguintes comandos Bash para recuperar os endereços IP públicos, construir os URLs públicos e armazenar os URLs no mapa de configuração do RazeeDash. Você também pode executar o script Bash bin/kc_create_razeedash_config.sh
. Observe que você deve incluir o final /
no final de root_url
e razeedash_api_url
em seu mapa de configuração do RazeeDash.
# Amazon EKS uses host names, IBM Cloud Kubernetes Service uses Ingress IP addresses. This handle both.
RAZEEDASH_LB_IP= $( kubectl get service razeedash-lb -n razee -o jsonpath= " {.status.loadBalancer.ingress[*].ip} " )
RAZEEDASH_API_LB_IP= $( kubectl get service razeedash-api-lb -n razee -o jsonpath= " {.status.loadBalancer.ingress[*].ip} " )
RAZEEDASH_LB_HOSTNAME= $( kubectl get service razeedash-lb -n razee -o jsonpath= " {.status.loadBalancer.ingress[*].hostname} " )
RAZEEDASH_API_LB_HOSTNAME= $( kubectl get service razeedash-api-lb -n razee -o jsonpath= " {.status.loadBalancer.ingress[*].hostname} " )
RAZEEDASH_LB= ${RAZEEDASH_LB_HOSTNAME} && [[ " ${RAZEEDASH_LB_IP} " != " " ]] && RAZEEDASH_LB= ${RAZEEDASH_LB_IP}
RAZEEDASH_API_LB= ${RAZEEDASH_API_LB_HOSTNAME} && [[ " ${RAZEEDASH_API_LB_IP} " != " " ]] && RAZEEDASH_API_LB= ${RAZEEDASH_API_LB_IP}
kubectl create configmap razeedash-config -n razee
--from-literal=root_url=http:// " ${RAZEEDASH_LB} " :8080/
--from-literal=razeedash_api_url=http:// " ${RAZEEDASH_API_LB} " :8081/
Verifique se todos os componentes do Razee estão implantados e mostram 1/1
na coluna READY da saída CLI.
kubectl get deployments -n razee
Exemplo de saída:
NAME READY UP-TO-DATE AVAILABLE AGE
featureflagsetld-controller 1/1 1 1 53m
managedset-controller 1/1 1 1 53m
mongo 1/1 1 1 34m
mustachetemplate-controller 1/1 1 1 53m
razeedash 1/1 1 1 25m
razeedash-api 1/1 1 1 25m
razeedeploy-delta 1/1 1 1 53m
remoteresource-controller 1/1 1 1 53m
remoteresources3-controller 1/1 1 1 53m
Abra a tela de boas-vindas do RazeeDash.
open http:// " ${RAZEEDASH_LB} " :8080
Crie um aplicativo OAuth
para RazeeDash no GitHub, GitHub Enterprise ou Bitbucket.
Na tela de boas-vindas do RazeeDash, selecione o bloco da ferramenta onde deseja criar o aplicativo OAuth
.
Siga as instruções na janela pop-up para criar o aplicativo OAuth
.
Clique em Salvar configuração .
Na tela de boas-vindas do RazeeDash, clique em Entrar com <integration_tool> .
Siga as instruções na janela pop-up para conceder ao RazeeDash acesso à ferramenta de integração que você escolheu.
Se precisar redefinir qualquer uma das credenciais OAuth
, você pode começar de novo abrindo um shell mongo em sua instância e executando
> use razeedash
> db.meteor_accounts_loginServiceConfiguration.remove({})
Instale o Watch Keeper em cada cluster que você deseja monitorar. O cluster onde você instala o Watch Keeper pode ser um cluster diferente daquele onde você instalou o RazeeDash.
No console RazeeDash, clique em Registrar .
Clique em Gerenciar .
Copie o comando Instalar Razee Agent kubectl
.
Execute o comando no cluster que você deseja monitorar para criar os componentes do Watch Keeper. Se você instalar o Watch Keeper no mesmo cluster em que instalou o RazeeDash, verá mensagens informando que alguns dos componentes do Watch Keeper já existem em seu cluster. Você pode ignorar essas mensagens.
kubectl create -f http:// < razeedash-api-lb_external_IP > :8081/api/install/cluster ? orgKey=orgApiKey- < org_api_key >
Exemplo de saída para um cluster onde o RazeeDash está instalado:
deployment.apps/remoteresource-controller created
configmap/watch-keeper-config created
secret/watch-keeper-secret created
remoteresource.deploy.razee.io/watch-keeper-rr created
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : namespaces
" razee " already exists
Error from server (AlreadyExists): customresourcedefinitions.
apiextensions.k8s.io " remoteresources.deploy.razee.io " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : namespaces
" razee " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : serviceaccounts
" razeedeploy-sa " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : clusterroles.
rbac.authorization.k8s.io " razeedeploy-admin-cr " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " :
clusterrolebindings.rbac.authorization.k8s.io " razeedeploy-rb " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : configmaps
" razeedeploy-delta-resource-uris " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : deployments.apps
" razeedeploy-delta " already exists
Exemplo de saída para um cluster onde o RazeeDash não está instalado:
configmap/watch-keeper-config created
secret/watch-keeper-secret created
clusterrole.rbac.authorization.k8s.io/cluster-reader created
serviceaccount/watch-keeper-sa created
clusterrolebinding.rbac.authorization.k8s.io/watch-keeper-rb created
networkpolicy.networking.k8s.io/watch-keeper-deny-ingress created
deployment.apps/watch-keeper created
Error from server (AlreadyExists): namespaces " razee " already exists
Aguarde a conclusão da implantação do Watch Keeper.
kubectl get deployment -n razee | grep watch-keeper
Exemplo de saída:
watch-keeper 1/1 1 1 2m5s
No console RazeeDash, clique em RazeeDash para abrir a página de detalhes do RazeeDash e verifique se você pode ver as informações de implantação do seu pod Watch Keeper.
Com o Watch Keeper configurado em seu cluster, você pode recuperar informações de implantação para outros recursos do Kubernetes que deseja monitorar. Os dados são enviados automaticamente para a API RazeeDash e você pode acessar, monitorar e analisar esses dados com RazeeDash.
Decida quais informações você deseja que o Watch Keeper recupere escolhendo entre os seguintes níveis de detalhe de informações:
lite
: recupera os metadata
e a seção status
da configuração do recurso Kubernetes.detail
: recupera todos os dados de configuração de um recurso do Kubernetes, mas deixa de fora as variáveis de ambiente e a seção data
dos mapas de configuração e segredos.debug
: recupera todos os dados de configuração de um recurso Kubernetes, incluindo variáveis de ambiente e os data
. seção de mapas de configuração e segredos. Estas informações podem incluir informações confidenciais, portanto use esta opção com cuidado. Adicione o rótulo razee/watch-resource
à seção de rótulos de todos os recursos do Kubernetes que você deseja monitorar e especifique o nível de detalhe das informações. Por exemplo, se quiser monitorar uma implantação do Kubernetes, use o comando a seguir. Depois de adicionar o rótulo ao seu recurso, o Watch Keeper verifica automaticamente o seu recurso e envia dados para a API RazeeDash. Em seguida, seu recurso é verificado uma vez a cada hora. Além disso, o Watch Keeper adiciona um observador de eventos do Kubernetes ao seu recurso para que o Watch Keeper seja notificado pelo Kubernetes quando a configuração do seu recurso for alterada.
kubectl edit deployment < deployment_name >
Exemplo de arquivo YAML:
apiVersion : extensions/v1beta1
kind : Deployment
metadata :
annotations :
deployment.kubernetes.io/revision : " 1 "
kubectl.kubernetes.io/last-applied-configuration : |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"myapp"},"name":"expandpvc","namespace":"default"},"spec":{"selector":{"matchLabels":{"app":"myapp"}},"template":{"metadata":{"labels":{"app":"myapp"}},"spec":{"con