Kubernetes Managed
Visualize Kubernetes resources and monitor changes through queries and alerts.
- Installation
- Migration
- Authorization
- Data Model
- Types
- Release Notes
Installation
Prerequisites
See the Migration tab for the full cutover sequence, data model differences, and answers to common migration questions.
Before installing the Kubernetes Managed integration, you must have a Kubernetes collector running. For instructions on setting up the Kubernetes collector, see the Kubernetes collector documentation.
- Web
- Helm
Configuration in JupiterOne
-
Navigate to the Integrations tab in JupiterOne and select Kubernetes Managed.
-
Click New Instance to begin configuring your integration and provide the following:
-
The Account Name used to identify the Kubernetes account in JupiterOne. Ingested entities will have this value stored in
tag.AccountNamewhen theAccountNametoggle is enabled. -
Description to assist in identifying the integration instance, if desired.
-
When prompted about where should this run, select the Kubernetes collector you created in the prerequisites.
-
Use Default Kubernetes Configuration (optional): Enable when running the integration outside of a Kubernetes cluster, such as on a local machine. When disabled, the integration uses the cluster's built-in in-cluster authentication. Disabled by default.
-
Ingest All Node Images (optional): Enable to ingest every image cached on each node, instead of only the images in use by a running container. Required to ingest images at all if you are not ingesting pods. Disabled by default. See Image ingestion.
-
-
Click Create after all values are provided and your instance appears in the list of all your Kubernetes Managed instances.
Helm
The Helm-based install is for users that would like their integrations managed via Kubernetes resources.
- Ensure you have the repository set up and updated
helm repo add jupiterone https://jupiterone.github.io/helm-charts
helm repo update
- Find the name of your runner. The integration needs to know the name of the runner.
kubectl get integrationrunner -n jupiterone
Output
NAME STATE DETAIL REGISTRATION AGE
runner running registered 162m
- Configuration Options
Values:
-
collectorName- (Default "runner"). This is the name of the Runner/Collector you installed as part of the Kubernetes Operator installation. -
includeNamespaces- An array of namespace names to include. If specified, only these namespaces will be ingested. -
excludeNamespaces- An array of namespace names to exclude from ingestion. -
loadKubernetesConfigFromDefault- (Default false). Set totruewhen running the integration outside of a Kubernetes cluster (for example, on your local machine). Whenfalse, the integration uses the cluster's built-in in-cluster authentication. -
crdMappingConfig- Path to a YAML file containing the CRD mapping configuration (see Advanced: Configuring Custom Resource Definitions section below). -
ingestAllNodeImages- (Default false). Set totrueto ingest every image cached on each node, instead of only the images in use by a running container. Required to ingest images at all if you are not ingesting pods. See Image ingestion. -
pollingInterval- (Default ONE_WEEK). Specifies how often the integration runs to collect data. Options:- DISABLED
- THIRTY_MINUTES
- ONE_HOUR
- FOUR_HOURS
- EIGHT_HOURS
- TWELVE_HOURS
- ONE_DAY
- ONE_WEEK
-
pollingIntervalCron- (Default disabled). If setting this field, set pollingInterval to DISABLED. This option has two fields:houranddayOfWeek. Example:--set pollingInterval=DISABLED --set pollingIntervalCron.hour=2 --set pollingIntervalCron.dayOfWeek=0 -
ingestionSources- (Default: integration defaults). Enables (true) or disables (false) individual resource types by ingestion source ID. Unlisted sources keep their default; Container Specs (container-specs) is the only source disabled by default. Runhelm show values jupiterone/kubernetes-managedfor the full list of IDs. Set it in a values file:ingestionSources:secrets: falsecontainer-specs: truePass the file on every install and upgrade (
-f values.yaml). Ahelm upgradethat passes other values (-for--set) but not this one resets it, which returns every source to its default, unless the upgrade uses--reuse-values.--set ingestionSources.secrets=falsealso works, but every later upgrade that passes values must repeat it.- Dependencies: some sources feed others. Disabling
podsalso stops containers and volumes, and the images used by containers. Disablingcontainersstops those images too. Disablingnodesstops all image ingestion. WithingestAllNodeImagesset totrue, images cached on nodes are still ingested whilepodsorcontainersis disabled. - Ownership: when set, this value owns the instance's ingestion source settings. Changes made in the JupiterOne UI are replaced the next time you change it. Account-level defaults configured for the integration are applied only when the instance is created, and the first change to this value replaces them, so list every non-default setting you want to keep. Removing the value returns every source to the integration's default.
- Validation: the operator applies only valid entries. An ID that is not one of the integration's ingestion sources, or a disable of a source that cannot be disabled, is not applied and is reported in the
IngestionSourcesAppliedcondition, as is an entry JupiterOne did not store. - Versions: requires Integration Operator v0.5.0 or later (operator chart 1.5.0 or later), and kubernetes-managed chart 1.0.9 or later (
helm show values jupiterone/kubernetes-managedlistsingestionSources). Older operators and older kubernetes-managed charts silently ignore it. After upgrading, runhelm repo update, thenhelm upgradethis chart again: an older CRD droppedingestionSourceswhen the resource was stored, so the value takes effect only once the chart is applied again.
- Dependencies: some sources feed others. Disabling
-
commonLabels,commonAnnotations- (Default none). Labels and annotations for theIntegrationInstance, its Secret, and every object the operator creates for this integration's runs, including the job pod. -
jobLabels,jobAnnotations,podLabels,podAnnotations- (Default none). Extra labels and annotations for this integration's runs only:jobLabelsandjobAnnotationsgo on the run's Secrets,IntegrationInstanceJobandJob, andpodLabelsandpodAnnotationsgo on the job pod. Changes apply to the next run.commonLabels:team: securitypodAnnotations:sidecar.istio.io/inject: "false"These override the operator and runner charts' values on the same key. Quote numbers (
"1234"). Node selectors, tolerations and other scheduling settings are set on the operator chart. They require kubernetes-managed chart 1.0.10 or later and Integration Operator v0.6.0 or later (operator chart 1.6.0 or later); upgrade the operator chart first. See Labels, Annotations and Scheduling.
For a complete list of configuration options, run:
helm show values jupiterone/kubernetes-managed
- Install the Managed Kubernetes Helm chart Add in your configuration options from above into this command:
helm install kubernetes jupiterone/kubernetes-managed -n jupiterone --set collectorName=<runnerName>
- Verify Installation Check that the integration was successfully installed and registered with JupiterOne:
kubectl get integrationinstance -n jupiterone
Output
NAME READY REASON AGE
kubernetes True Success 176m
Data Volume Configuration
By default, the integration ingests all namespaces in your cluster. Use the options below to limit which namespaces are included.
Data Filtering Options
| Field | Description | Default |
|---|---|---|
| Include Specific Namespaces | Restrict ingestion to the listed namespaces only. Separate names with commas. If left empty, all namespaces are ingested (unless exclusions are specified). | All namespaces |
| Exclude Specific Namespaces | Skip the listed namespaces during ingestion. Useful for omitting system namespaces such as kube-system. Separate names with commas. | None |
Image ingestion
By default, kube_image entities are created only for images in use by a running container, and each container is linked to its image with a kube_container USES kube_image relationship. Images are derived from pods, so a cluster that does not ingest pods produces no images.
Enable Ingest All Node Images (ingestAllNodeImages) to also ingest the images cached on each node, whether or not a container is running them, and to relate each node to the images it holds with kube_node HAS kube_image. This is the option to use if you are not ingesting pods and still want image inventory.
| Field | Description | Default |
|---|---|---|
| Ingest All Node Images | Ingest every image in each node's local image cache in addition to the images in use by a running container. | Disabled |
A node reports its cached images through Node.status.images, which kubelet truncates at --node-status-max-images (default 50, -1 disables the limit) and which only covers images present in that node's local cache. Enabling this option therefore gives a best-effort inventory per node rather than a guaranteed complete one. Set --node-status-max-images=-1 on your kubelets if you need the full list.
RBAC
The Kubernetes collector installs with a ClusterRole that provides read-only access to Kubernetes resources. The collector has permissions to get, list, and watch the following:
Core Resources:
- Pods, namespaces, service accounts, config maps, nodes, services, secrets, and events
Application Workloads:
- Deployments, replica sets, stateful sets, daemon sets, jobs, and cron jobs
Networking:
- Ingresses and network policies
RBAC and Security:
- Cluster roles, cluster role bindings, roles, and role bindings
- Self-subject access reviews and subject access reviews
- Token reviews
Extensions:
- All resources in the extensions API group
Integration Management:
- Integration instance jobs, integration runners, and their status and finalizers (for managing integration workloads)
All permissions are read-only (get, list, watch) and do not allow modification of any cluster resources.
Advanced: Configuring Custom Resource Definitions (CRDs)
By default, the Kubernetes Managed integration ingests standard Kubernetes resources. However, you can extend the integration to also collect and map Custom Resource Definitions (CRDs) that exist in your cluster. This is particularly useful for capturing custom resources created by operators, such as IntegrationRunners and IntegrationInstanceJobs from the JupiterOne Kubernetes Operator.
Overview
The CRD configuration allows you to:
- Define which custom resources to ingest: Specify the CRD resources you want to collect from your cluster
- Map resource properties: Transform CRD fields into JupiterOne entity properties
- Create relationships: Define how custom resources relate to other entities in your JupiterOne graph
Configuration File Structure
The CRD configuration is defined in a YAML file with two main sections: resources and relationships. This configuration file can be provided when setting up your integration instance.
Resources Section
The resources section defines which custom resources to ingest and how to map their properties to JupiterOne entities.
Each resource entry contains:
-
name(required): The fully qualified name of the CRD resource type, following the format<plural>.<group>. For example,integrationrunners.integrations.jupiterone.iorefers to theIntegrationRunnerCRD in theintegrations.jupiterone.ioAPI group. -
version(optional): The API version of the resource. For example,v1indicates the resource uses version 1 of the API. If not provided, all versions will be ingested. -
_type(required): The entity type that will be assigned to ingested resources in JupiterOne. This is a custom identifier that you'll use to query and reference these entities. It should follow the patternkube_cr_<resource_name>(e.g.,kube_cr_integration_runner). -
_class(required): The entity class that categorizes the resource in JupiterOne's data model. All supported entity classes can be found in the JupiterOne Data Model documentation. -
propertyToFieldMap(required): A mapping that defines how fields from the Kubernetes resource are transformed into JupiterOne entity properties. This is where you specify which Kubernetes resource fields map to which JupiterOne properties._key(required): Maps to the unique identifier for the entity in JupiterOne. It's recommended to usemetadata.uidto ensure uniqueness.- Standard properties: Common mappings include:
name: Usually maps tometadata.namenamespace: Usually maps tometadata.namespacecreatedOn: Usually maps tometadata.creationTimestamp
- Custom properties: You can map any field from the resource's
specorstatussections to custom properties. For example,accountId: spec.accountIdmaps theaccountIdfield from the resource's spec to a property calledaccountIdon the JupiterOne entity.
Relationships Section
The relationships section defines how custom resources relate to other entities in your JupiterOne graph. This allows you to create meaningful connections between resources, such as showing which secrets an IntegrationRunner uses or which runner an IntegrationInstanceJob runs on.
Each relationship entry contains:
-
_class(required): The type of relationship. All supported relationship classes can be found in the JupiterOne Data Model documentation. -
sourceType(required): The entity type of the source entity in the relationship. This should match the_typeyou defined in the resources section (e.g.,kube_cr_integration_runner). -
targetType(required): The entity type of the target entity in the relationship. This can be:- Another custom resource type you've defined (e.g.,
kube_cr_integration_instance_job) - A standard Kubernetes resource type (e.g.,
kube_secret,kube_pod,kube_namespace)
- Another custom resource type you've defined (e.g.,
-
matchBy(required): Defines how to match the source and target entities to create the relationship. This is a key-value mapping where:- The key is a property name on the source entity (e.g.,
secretName) - The value is a property name on the target entity (e.g.,
name)
The relationship is created when the source entity's property value matches the target entity's property value. You can specify multiple match conditions, and all must be satisfied (AND logic). For example:
matchBy:secretName: namenamespace: namespaceThis creates a relationship when both the
secretNameon the source matches thenameon the target, AND thenamespaceon the source matches thenamespaceon the target.noteIf a property is not defined for either the source or the target, the relationship won't be created. Undefined doesn't match with undefined.
- The key is a property name on the source entity (e.g.,
Example Configuration
Here's a complete example configuration that ingests IntegrationRunners and IntegrationInstanceJobs and creates relationships between them and their associated secrets:
resources:
- name: integrationrunners.integrations.jupiterone.io
version: v1
_type: kube_cr_integration_runner
_class: Process
propertyToFieldMap:
_key: metadata.uid
name: metadata.name
namespace: metadata.namespace
createdOn: metadata.creationTimestamp
accountId: spec.accountId
collectorId: spec.collectorId
collectorPoolId: spec.collectorPoolId
jupiterOneEnvironment: spec.jupiterOneEnvironment
secretAPITokenName: spec.secretAPITokenName
secretName: spec.secretName
syncIntervalSeconds: spec.syncIntervalSeconds
- name: integrationinstancejobs.integrations.jupiterone.io
_type: kube_cr_integration_instance_job
_class: Task
propertyToFieldMap:
_key: metadata.uid
name: metadata.name
namespace: metadata.namespace
createdOn: metadata.creationTimestamp
accountId: spec.accountId
certificateIdentity: spec.certificateIdentity
image: spec.image
integrationDefinitionName: spec.integrationDefinitionName
integrationInstanceId: spec.integrationInstanceId
integrationInstanceJobId: spec.integrationInstanceJobId
integrationRunnerName: spec.integrationRunnerName
secretName: spec.secretName
relationships:
- _class: HAS
sourceType: kube_cr_integration_runner
targetType: kube_secret
matchBy:
secretName: name
namespace: namespace
- _class: HAS
sourceType: kube_cr_integration_instance_job
targetType: kube_secret
matchBy:
secretName: name
namespace: namespace
- _class: HAS
sourceType: kube_cr_integration_instance_job
targetType: kube_cr_integration_runner
matchBy:
integrationRunnerName: name
namespace: namespace
Understanding the Example
Resources Explained:
-
IntegrationRunner Resource:
- Ingested as
kube_cr_integration_runnerentities with classProcess - Maps standard Kubernetes metadata (uid, name, namespace, creationTimestamp)
- Maps custom spec fields like
accountId,collectorId, andsyncIntervalSecondsto entity properties - The
secretNameproperty is used later to create relationships with secrets
- Ingested as
-
IntegrationInstanceJob Resource:
- Ingested as
kube_cr_integration_instance_jobentities with classTask - Similar metadata mapping
- Maps job-specific fields like
integrationInstanceId,image, andintegrationRunnerName - The
integrationRunnerNameproperty links jobs to their runners
- Ingested as
Relationships Explained:
-
IntegrationRunner → Secret:
- Creates a
HASrelationship from each IntegrationRunner to the secret it uses - Matches when the runner's
secretNameequals the secret'snameAND they're in the samenamespace
- Creates a
-
IntegrationInstanceJob → Secret:
- Creates a
HASrelationship from each IntegrationInstanceJob to its associated secret - Uses the same matching logic as above
- Creates a
-
IntegrationInstanceJob → IntegrationRunner:
- Creates a
HASrelationship showing which runner executes each job - Matches when the job's
integrationRunnerNameequals the runner'snameAND they're in the samenamespace
- Creates a
Next steps
Now that your integration instance has been configured, it will begin running on the polling interval you provided, populating data within JupiterOne. Continue on to our Instance management guide to learn more about working with and editing integration instances.