Razee es un proyecto de código abierto desarrollado por IBM para automatizar y gestionar la implementación de recursos de Kubernetes en clústeres, entornos y proveedores de nube, y para visualizar información de implementación de sus recursos para que pueda monitorear el proceso de implementación y encontrar problemas de implementación. más rápidamente.
Consulte los siguientes enlaces para comenzar con Razee:
Revise las características clave de Razee y cómo puede aprovecharlas para administrar la implementación de recursos de Kubernetes para sus clústeres.
Razee consta de tres módulos, RazeeDash, RazeeDeployables y RazeeDeploy, que están ligeramente acoplados y se pueden utilizar de forma independiente. Con RazeeDash, puede crear dinámicamente un inventario en vivo de sus recursos de Kubernetes y utilizar potentes capacidades de filtrado y alertas para visualizar información de configuración y solucionar problemas en su proceso de implementación más rápidamente. Los componentes de RazeeDeploy están diseñados para simplificar las implementaciones de múltiples clústeres al crear plantillas de recursos de Kubernetes, agrupar recursos y clústeres, y definir reglas para estas agrupaciones, de modo que pueda crear una configuración flexible que se aplique en todos los clústeres, entornos y nubes.
Componente | Descripción |
---|---|
Guardián del reloj | Watch Keeper es responsable de recuperar información de configuración de los recursos de Kubernetes y de enviar estos datos a la API RazeeDash. Para usar Watch Keeper, simplemente instale este componente en su clúster y agregue la etiqueta razee/watch-resource a todos los recursos que desee monitorear. Después de agregar la etiqueta, Watch Keeper recupera información de configuración del servidor API de Kubernetes y envía inmediatamente estos datos a la API RazeeDash. Este proceso se repite una vez cada hora. Además, Watch Keeper agrega un observador de eventos de Kubernetes a su recurso para que Kubernetes notifique a Watch Keeper cuando cambie la configuración de su recurso. |
API Razee Dash | RazeeDash API es un servicio que recibe configuraciones de recursos de Kubernetes y definiciones de recursos de Watch Keeper. Los datos que se envían a la API RazeeDash se almacenan automáticamente en MongoDB. |
RazeeDash | RazeeDash visualiza los datos que Watch Keeper recupera y crea dinámicamente un inventario de sus recursos de Kubernetes en su clúster. Puede utilizar el filtro inteligente y las capacidades de alerta para analizar estos datos e identificar y resolver rápidamente problemas en su proceso de implementación. |
Suscripción de clúster | ClusterSubscription es una implementación de Razee que monitorea las suscripciones en Razee para verificar si existen suscripciones activas para un clúster. Si se encuentra una suscripción, la versión asociada del recurso de Kubernetes se extrae de Razee y se aplica automáticamente en el clúster. |
Componente | Descripción |
---|---|
RazeeDeploy Core | RazeeDeploy Core es una herramienta de entrega continua que se ejecuta en su clúster y que puede usar para configurar CustomResourceDefinitions (CRD), controladores de Kubernetes y dependencias para los componentes de RazeeDeploy. |
RazeeImplementar Delta | RazeeDeploy Delta es un componente de RazeeDeploy Core que se ejecuta en su clúster y mantiene actualizadas las definiciones de recursos personalizados y los controladores de Kubernetes de los componentes de RazeeDeploy. |
RemoteResource y recurso remoto S3 | RemoteResource y RemoteResourceS3 son controladores y definiciones de recursos personalizados que puede utilizar para implementar automáticamente recursos de Kubernetes almacenados en un repositorio de origen. En lugar de aplicar manualmente estos archivos YAML en cada clúster, entorno o entre nubes cada vez que se realiza una actualización, simplemente defina el repositorio de origen en su recurso remoto y cree el recurso remoto en su clúster. El controlador de recursos remoto se conecta automáticamente a su repositorio de origen, descarga el archivo de configuración de Kubernetes y aplica el archivo a su clúster. |
BigotePlantilla | MustacheTemplate es un controlador y una definición de recursos personalizados para definir variables de entorno que puede usar para reemplazar partes de archivos YAML en otros archivos YAML de Kubernetes. Por ejemplo, use las variables de entorno de su plantilla de bigote para crear la URL de su recurso remoto para que pueda señalar la versión de la aplicación que desea implementar. |
CaracterísticaFlagSetLD | FeatureFlagSetLD es un controlador y una definición de recursos personalizados para recuperar automáticamente los valores de los indicadores de funciones de Launch Darkly. Con los indicadores de funciones, puede controlar qué código se implementa en su clúster y administrar múltiples versiones de recursos de Kubernetes en clústeres, entornos o nubes. |
Conjunto administrado | ManagedSet es una definición de recursos personalizada y un controlador para agrupar los recursos de Kubernetes que desea crear y aplicar al clúster al mismo tiempo. |
Utilidades de Kubernetes | Las utilidades de Kubernetes son un paquete npm que puede utilizar para simplificar la comunicación con Kubernetes. |
Para implementar Razee en su clúster, su clúster debe cumplir con los siguientes requisitos:
Primero instale razeedeploy-delta en su custer ejecutando:
kubectl apply -f https://github.com/razee-io/Razee/releases/latest/download/razeedeploy.yaml
Salida de ejemplo:
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 los componentes de RazeeDash en su clúster. Para almacenar datos que se envían a la API RazeeDash, debe configurar una instancia de MongoDB. Puede optar por configurar RazeeDash y una única instancia de MongoDB utilizando el archivo razeedash-all-in-one.yaml
proporcionado o configurar RazeeDash con una instancia de MongoDB existente que se ejecuta en su clúster. Nota : Si ya tiene una instancia en ejecución de RazeeDash en uno de sus clústeres y, en cambio, desea simplemente agregar otro clúster a su lista de inventario, puede omitir este paso y continuar con la instalación del componente Watchkeeper en su clúster.
Para instalar RazeeDash y una única instancia de MongoDB :
kubectl apply -f https://github.com/razee-io/Razee/releases/latest/download/razeedash-all-in-one.yaml
Salida de ejemplo:
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 utilizar una instancia de MongoDB existente :
Cree el secreto razeedash para mongo_url. Sustituya el siguiente comando por el nombre de usuario y la contraseña reales junto con 3 instancias de host para mongo-0, mongo-1 y mongo-3 junto con los puertos correctos. Asegúrese de que el final de la URL de mongo tenga /razeedash?ssl=true
.
Ejemplo :
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
Espere a que se complete la implementación razeedash-api
. Si elige crear RazeeDash utilizando el archivo razeedash-all-in-one.yaml
proporcionado en el paso anterior, se crea una instancia de MongoDB en su clúster y se conecta a la instancia de la API de RazeeDash. La configuración de MongoDB tarda unos minutos en completarse y puede provocar errores intermitentes MongoNetworkError
en la implementación de la API RazeeDash. Cuando MongoDB está completamente configurado, Kubernetes finaliza automáticamente la configuración de su instancia de API RazeeDash.
kubectl logs deploy/razeedash-api -n razee
Salida de ejemplo si MongoDB aún no está 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.
Salida de ejemplo si la API RazeeDash está completamente 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 la dirección IP externa de sus servicios de balanceador de carga razeedash-lb
y razeedash-api-lb
que se crean automáticamente durante la configuración de la API RazeeDash. razeedash-lb
sirve como punto final público para su instancia de RazeeDash y razeedash-api-lb
sirve como punto final público para su instancia de API RazeeDash. Al utilizar las direcciones IP públicas que se asignaron, puede crear las URL públicas que utiliza para acceder a los componentes RazeeDash y API de RazeeDash. Para finalizar la configuración de RazeeDash, las dos URL deben almacenarse en el mapa de configuración de RazeeDash. Utilice los siguientes comandos Bash para recuperar las direcciones IP públicas, crear las URL públicas y almacenar las URL en el mapa de configuración de RazeeDash. También puede ejecutar el script Bash bin/kc_create_razeedash_config.sh
. Tenga en cuenta que debe incluir el final /
al final de root_url
y razeedash_api_url
en su mapa de configuración de 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 que todos los componentes de Razee estén implementados y muestre 1/1
en la columna LISTO de la salida de su CLI.
kubectl get deployments -n razee
Salida de ejemplo:
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 la pantalla de bienvenida de RazeeDash.
open http:// " ${RAZEEDASH_LB} " :8080
Cree una aplicación OAuth
para RazeeDash en GitHub, GitHub Enterprise o Bitbucket.
Desde la pantalla de bienvenida de RazeeDash, seleccione el mosaico de la herramienta donde desea crear la aplicación OAuth
.
Siga las instrucciones en la ventana emergente para crear la aplicación OAuth
.
Haga clic en Guardar configuración .
Desde la pantalla de bienvenida de RazeeDash, haga clic en Iniciar sesión con <integration_tool> .
Siga las instrucciones en la ventana emergente para otorgarle a RazeeDash acceso a la herramienta de integración que eligió.
Si necesita restablecer cualquiera de las credenciales OAuth
, puede comenzar de nuevo abriendo un shell mongo en su instancia y ejecutando
> use razeedash
> db.meteor_accounts_loginServiceConfiguration.remove({})
Instale Watch Keeper en cada clúster que desee monitorear. El clúster donde instala Watch Keeper puede ser un clúster diferente al que instaló RazeeDash.
Desde la consola RazeeDash, haga clic en Registrarse .
Haga clic en Administrar .
Copie el comando Instalar Razee Agent kubectl
.
Ejecute el comando en el clúster que desea monitorear para crear los componentes de Watch Keeper. Si instala Watch Keeper en el mismo clúster donde instaló RazeeDash, verá mensajes de que algunos de los componentes de Watch Keeper ya existen en su clúster. Puedes ignorar estos mensajes.
kubectl create -f http:// < razeedash-api-lb_external_IP > :8081/api/install/cluster ? orgKey=orgApiKey- < org_api_key >
Salida de ejemplo para un clúster donde está instalado RazeeDash:
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
Salida de ejemplo para un clúster donde RazeeDash no 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
Espere a que finalice la implementación de Watch Keeper.
kubectl get deployment -n razee | grep watch-keeper
Salida de ejemplo:
watch-keeper 1/1 1 1 2m5s
Desde la consola RazeeDash, haga clic en RazeeDash para abrir la página de detalles de RazeeDash y verifique que pueda ver la información de implementación de su módulo Watch Keeper.
Con Watch Keeper configurado en su clúster, puede recuperar información de implementación para otros recursos de Kubernetes que desee monitorear. Los datos se envían automáticamente a la API de RazeeDash y usted puede acceder, monitorear y analizar estos datos con RazeeDash.
Decida qué información desea que Watch Keeper recupere eligiendo entre los siguientes niveles de detalle de información:
lite
: recupera la sección de metadata
y status
de la configuración de recursos de Kubernetes.detail
: recupera todos los datos de configuración de un recurso de Kubernetes, pero omite las variables de entorno y la sección data
de los mapas de configuración y los secretos.debug
: recupera todos los datos de configuración de un recurso de Kubernetes, incluidas las variables de entorno y los data
. sección de mapas de configuración y secretos. Esta información puede incluir información confidencial, así que utilice esta opción con cuidado. Agregue la etiqueta razee/watch-resource
a la sección de etiquetas de todos los recursos de Kubernetes que desee monitorear y especifique el nivel de detalle de la información. Por ejemplo, si desea monitorear una implementación de Kubernetes, use el siguiente comando. Después de agregar la etiqueta a su recurso, Watch Keeper escanea automáticamente su recurso y envía datos a la API RazeeDash. Luego, su recurso se escanea una vez cada hora. Además, Watch Keeper agrega un observador de eventos de Kubernetes a su recurso para que Kubernetes notifique a Watch Keeper cuando cambie la configuración de su recurso.
kubectl edit deployment < deployment_name >
Ejemplo de archivo 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