Falcon is the CrowdStrike platform purpose-built to stop breaches via a unified set of cloud-delivered technologies that prevent all types of attacks — including malware and much more.
- Kubernetes Cluster Compatibility
- Dependencies
- Installation
- Falcon Configuration Options
- Installing on Kubernetes Cluster Nodes
- Installing in Kubernetes Cluster as a Sidecar
The Falcon Helm chart has been tested to deploy on the following Kubernetes distributions:
- Amazon Elastic Kubernetes Service (EKS)
- Daemonset (node) sensor support for EKS nodes
- Container sensor support for EKS Fargate nodes
- Azure Kubernetes Service (AKS)
- Google Kubernetes Engine (GKE)
- Rancher K3s
OpenShift: OpenShift is not a recommended configuration for this Helm chart. The official Red Hat certified CrowdStrike Falcon Operator is the recommended installation method for OpenShift clusters. A best-effort compatibility mode is available for the node DaemonSet only (see OpenShift Compatibility below).
- Requires a x86_64 or ARM64 Kubernetes cluster
- Must be a CrowdStrike customer with access to the Falcon Linux Sensor (container image) and Falcon Container from the CrowdStrike Container Registry.
- Kubernetes nodes must be Linux distributions supported by CrowdStrike.
- Before deploying the Helm chart, you should have a Falcon Linux Sensor and/or Falcon Container sensor in your own container registry or use CrowdStrike's registry before installing the Helm Chart. See the Deployment Considerations for more.
- Helm 3.x is installed and supported by the Kubernetes vendor.
| Helm Chart Version | Falcon Sensor Version | Notes |
|---|---|---|
1.36.0 |
>= 7.35 |
— |
1.35.0 |
>= 7.35 |
Added Falcon Data Protection for Cloud support for self-managed Kubernetes clusters. |
1.34.2 |
>= 7.31 |
— |
1.34.1 |
>= 7.31 |
falcon-sensor images now use a non-regionalized unified image repo, starting with 7.31. |
The
falcon-sensorchart manages both node DaemonSet and container sensor sidecar deployments.
| Helm Chart Version | Falcon Container Sensor Version | Notes |
|---|---|---|
1.36.0 |
>= 7.37 |
Added AI-DR support. |
1.35.0 |
>= 7.31 |
— |
1.34.2 |
>= 7.31 |
falcon-container images now use a non-regionalized unified image repo, starting with 7.33. |
1.34.1 |
>= 7.31 |
— |
helm repo add crowdstrike https://crowdstrike.github.io/falcon-helm
helm repo update
The following tables lists the Falcon Sensor configurable parameters and their default values.
| Parameter | Description | Default |
|---|---|---|
falcon.cid |
CrowdStrike Customer ID (CID) | None (Required) |
falcon.apd |
App Proxy Disable (APD) | None |
falcon.aph |
App Proxy Hostname (APH) | None |
falcon.app |
App Proxy Port (APP) | None |
falcon.trace |
Set trace level. (none,err,warn,info,debug) |
none |
falcon.feature |
Sensor Feature options | None |
falcon.billing |
Utilize default or metered billing | None |
falcon.tags |
Comma separated list of tags for sensor grouping | None |
falcon.provisioning_token |
Provisioning token value | None |
To ensure a successful deployment, you will want to ensure that:
- By default, the Helm Chart installs in the
defaultnamespace. Best practices for deploying to Kubernetes is to create a new namespace. This can be done by adding-n falcon-system --create-namespaceto yourhelm installcommand. The namespace can be any name that you wish to use. - The Falcon Linux Sensor (not the Falcon Container) should be used as the container image to deploy to Kubernetes nodes.
- You must be a cluster administrator to deploy Helm Charts to the cluster.
- When deploying the Falcon Linux Sensor (container image) to Kubernetes nodes, it is a requirement that the Falcon Sensor run as a privileged container so that the Sensor can properly work with the kernel. This is a requirement for any kernel module that gets deployed to any container-optimized operating system regardless of whether it is a security sensor, graphics card driver, etc.
- The Falcon Linux Sensor should be deployed to Kubernetes environments that allow node access or installation via a Kubernetes DaemonSet.
- The Falcon Linux Sensor will create
/opt/CrowdStrikeon the Kubernetes nodes. DO NOT DELETE this folder. - CrowdStrike's Helm Chart is a project, not a product, and released to the community as a way to automate sensor deployment to kubernetes clusters. The upstream repository for this project is https://github.com/CrowdStrike/falcon-helm.
Important notes for Kubernetes and other container deployments of the Falcon sensor.
- Falcon Node sensor for Linux with sensor version 7.33 and earlier: We do not recommend enabling the Uninstall and maintenance protection policy setting for DaemonSet deployments. This setting can cause operational issues that require manual intervention.
- Falcon Node sensor for Linux with sensors version 7.34 and later: DaemonSet deployments do not support the Uninstall and maintenance protection policy setting and automatically ignores it.
- Falcon Container sensor for Linux: Deployed as a sidecar container within application pods. This sensor does not support the Uninstall and maintenance protection policy setting and automatically ignores it.
Starting with Kubernetes 1.25, Pod Security Standards will be enforced. Setting the appropriate Pod Security Standards policy needs to be performed by adding a label to the namespace. Run the following command replacing my-existing-namespace with the namespace that you have installed the falcon sensors e.g. falcon-system..
kubectl label --overwrite ns my-existing-namespace \
pod-security.kubernetes.io/enforce=privileged
If desired to silence the warning and change the auditing level for the Pod Security Standard, add the following labels
kubectl label ns --overwrite my-existing-namespace pod-security.kubernetes.io/audit=privileged
kubectl label ns --overwrite my-existing-namespace pod-security.kubernetes.io/warn=privileged
helm upgrade --install falcon-helm crowdstrike/falcon-sensor \
--set falcon.cid="<CrowdStrike_CID>" \
--set node.image.repository="<Your_Registry>/falcon-node-sensor"
Above command will install the CrowdStrike Falcon Helm Chart with the release name falcon-helm in the namespace your kubectl context is currently set to.
You can install also install into a customized namespace by running the following:
helm upgrade --install falcon-helm crowdstrike/falcon-sensor \
-n falcon-system --create-namespace \
--set falcon.cid="<CrowdStrike_CID>" \
--set node.image.repository="<Your_Registry>/falcon-node-sensor"
For more details please see the falcon-helm repository.
The following tables lists the more common configurable parameters of the chart and their default values for installing on a Kubernetes node.
| Parameter | Description | Default |
|---|---|---|
node.enabled |
Enable installation on the Kubernetes node | true |
node.backend |
Choose sensor backend (kernel,bpf).NOTE: Sensor 6.49+ only |
bpf |
node.gke.autopilot |
Enable if running on GKE Autopilot clusters | false |
node.image.repository |
Falcon Sensor Node registry/image name | falcon-node-sensor |
node.image.tag |
The version of the official image to use | latest (Use node.image.digest instead for security and production) |
node.image.digest |
The sha256 digest of the official image to use | None (Use instead of the image tag for security and production) |
node.image.pullPolicy |
Policy for updating images | Always |
node.image.pullSecrets |
Pull secrets for private registry | None (Conflicts with node.image.registryConfigJSON) |
node.image.registryConfigJSON |
base64 encoded docker config json for the pull secret | None (Conflicts with node.image.pullSecrets) |
node.daemonset.resources |
Configure Node sensor resource requests and limits (eBPF mode only) If you configure resources, you must configure the CPU and Memory Resource requests and limits correctly for your node instances for the node sensor to run properly! |
None (Minimum setting of 250m CPU and 500Mi memory allowed). Default for GKE Autopilot is 750m CPU and 1.5Gi memory. |
node.cleanupOnly |
Run the cleanup Daemonset only. | false Requires node.hooks.postDelete.enabled: true |
node.clusterName |
When running on an unmanaged K8S cluster, set a cluster name. When running on managed K8S (e.g. EKS, GKE, AKS), cluster name is resolved cloud-side | None |
falcon.cid |
CrowdStrike Customer ID (CID) | None (Required if falconSecret.enabled is false) |
falcon.cloud |
CrowdStrike cloud region (us-1, us-2, eu-1, us-gov-1, us-gov-2)NOTE: This option is supported by Falcon sensor version 7.28 and above |
None |
falconSecret.enabled |
Enable k8s secrets to inject sensitive Falcon values | false (Must be true if falcon.cid is not set) |
falconSecret.secretName |
Existing k8s secret name to inject sensitive Falcon values. The secret must be under the same namespace as the sensor deployment. Secret name must be "falcon-node-sensor-secret" if deploying to a GKE Autopilot cluster. |
None (Existing secret must include FALCONCTL_OPT_CID) |
falcon.cid and node.image.repository are required values.
For a complete listing of configurable parameters, run the following command:
helm show values crowdstrike/falcon-sensor
Running Daemonset Pods with privileged access on GKE Autopilot requires special configurations due to default security restrictions. To enable these privileged Pods, you need to configure an AllowlistSynchronizer. This resource applies CrowdStrike specific WorkloadAllowlists to your cluster, which the GKE Autopilot validating webhook uses to approve Pod deployments based on their manifest spec and image digests. Follow these steps to properly configure the AllowlistSynchronizer: Comment
- Create a file named
allowlist-synchronizer.yamlwith the following contents:
apiVersion: auto.gke.io/v1
kind: AllowlistSynchronizer
metadata:
name: crowdstrike-synchronizer
spec:
allowlistPaths:
- CrowdStrike/falcon-sensor/*
- Apply the AllowlistSynchronizer to your cluster:
kubectl apply -f allowlist-synchronizer.yaml
- Ensure the AllowlistSynchronizer is running:
kubectl get allowlistsynchronizers
- Ensure the AllowlistSynchronizer has fetched the WorkloadAllowlist:
kubectl get workloadallowlists
An example output of the above command is:
NAME AGE
crowdstrike-falconsensor-cleanup-allowlist-v1.0.0 7d
crowdstrike-falconsensor-cleanup-allowlist-v1.0.1 7d
crowdstrike-falconsensor-cleanup-allowlist-v1.0.2 7d
crowdstrike-falconsensor-deploy-allowlist-v1.0.0 7d
crowdstrike-falconsensor-deploy-allowlist-v1.0.1 7d
crowdstrike-falconsensor-deploy-allowlist-v1.0.2 7d
crowdstrike-falconsensor-deploy-allowlist-v1.0.3 6h40m
crowdstrike-falconsensor-falconctl-allowlist-v1.0.0 7d
crowdstrike-falconsensor-falconctl-allowlist-v1.0.1 7d
The WorkloadAllowlists serve the following purposes:
- crowdstrike-falconsensor-cleanup-allowlist-vX.X.X: Authorizes the Falcon Sensor Cleanup DaemonSet to operate within the cluster.
- crowdstrike-falconsensor-deploy-allowlist-vX.X.X: Permits the deployment and execution of the Falcon Sensor Deploy DaemonSet in the cluster environment.
- crowdstrike-falconsensor-falconctl-allowlist-vX.X.X: Enables the Falconctl job to run, facilitating sensor configuration and management tasks.
Note
Additional information about AllowlistSynchronizer can be found here: https://cloud.google.com/kubernetes-engine/docs/reference/crds/allowlistsynchronizer
WorkloadAllowlists ensure that only authorized container images are deployed to pods by verifying their image digests. To view the list of approved image digests, execute the following command:
kubectl get workloadallowlists <crowdstrike-falconsensor-XXXXXXX-allowlist-vX.X.X> -o=jsonpath='{range .containerImageDigests[*].imageDigests[*]}{@}{"\n"}{end}'
To obtain the Falcon Node sensor image, you have two options:
- Pull directly from the CrowdStrike registry
- Copy the image from the CrowdStrike registry to your private registry
For option 2, we provide an automation script to simplify the process: https://github.com/CrowdStrike/falcon-scripts/tree/main/bash/containers/falcon-container-sensor-pull
When copying images to a private registry, it's crucial to preserve the image digest. We recommend using tools like Skopeo for this purpose, as they ensure the digest of the image remains the same after the transfer.
When using the falconSecret configuration options with GKE Autopilot, falconSecret.secretName must be "falcon-node-sensor-secret". Any other K8s secret name for the falconSecret option is disallowed.
To ensure a successful deployment, you will want to ensure that:
- You must be a cluster administrator to deploy Helm Charts to the cluster.
- When deploying the Falcon Container as a sidecar sensor, make sure that there are no firewall rules blocking communication to the Mutating Webhook. This will most likely result in a
context deadline exceedederror. The default port for the Webhook is4433. - The Falcon Container as a sidecar sensor should be deployed to Kubernetes managed environments, or environments that do not allow node access or installation via a Kubernetes DaemonSet.
- CrowdStrike's Helm Chart is a project, not a product, and released to the community as a way to automate sensor deployment to kubernetes clusters. The upstream repository for this project is https://github.com/CrowdStrike/falcon-helm.
- Be aware that there is advanced Helm Chart functionality in use and those specific features may not work fully with GitOps tools like ArgoCD. The reason for this is that ArgoCD does not fully support Helm when compared to FluxCD. For features that do not work in this instance, disable those features until ArgoCD supports Helm correctly.
helm upgrade --install falcon-helm crowdstrike/falcon-sensor \
--set node.enabled=false \
--set container.enabled=true \
--set falcon.cid="<CrowdStrike_CID>" \
--set container.image.repository="<Your_Registry>/falcon-sensor"
Above command will install the CrowdStrike Falcon Helm Chart with the release name falcon-helm in the namespace your kubectl context is currently set to.
You can install also install into a customized namespace by running the following:
helm upgrade --install falcon-helm crowdstrike/falcon-sensor \
-n falcon-system --create-namespace \
--set node.enabled=false \
--set container.enabled=true \
--set falcon.cid="<CrowdStrike_CID>" \
--set container.image.repository="<Your_Registry>/falcon-sensor"
For Kubernetes clusters <1.22 (or 1.21 where the NamespaceDefaultLabelName feature gate is NOT enabled), be sure to label your namespace for injector exclusion before installing the Container sensor:
kubectl create namespace falcon-system
kubectl label namespace falcon-system kubernetes.io/metadata.name=falcon-system
The following tables lists the more common configurable parameters of the chart and their default values for installing the Container sensor as a Sidecar.
| Parameter | Description | Default |
|---|---|---|
container.enabled |
Enable installation on the Kubernetes node | false |
container.replicas |
Configure replica count | 2 |
container.topologySpreadConstraints |
Defines the way pods are spread across nodes | maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: crowdstrike.com/component: crowdstrike-falcon-injector |
container.azure.enabled |
For AKS without the pulltoken option | false |
container.azure.azureConfig |
Path to the Kubernetes Azure config file on worker nodes | /etc/kubernetes/azure.json |
container.disableNSInjection |
Disable injection for all Namespaces | false |
container.disablePodInjection |
Disable injection for all Pods | false |
container.alternateMountPath |
Enable volume mounts at /falcon instead of /tmp for NVCF environment | false |
container.certExpiration |
Certificate validity duration in number of days | 3650 |
container.registryCertSecret |
Name of generic Secret with additional CAs for external registries | None |
container.image.repository |
Falcon Sensor Node registry/image name | falcon-sensor |
container.image.tag |
The version of the official image to use. | latest (Use container.image.digest instead for security and production.) |
container.image.digest |
The sha256 digest of the official image to use. | None (Use instead of image tag for security and production.) |
container.image.pullPolicy |
Policy for updating images | Always |
container.image.pullSecrets.enable |
Enable pull secrets for private registry | false |
container.image.pullSecrets.namespaces |
List of Namespaces to pull the Falcon sensor from an authenticated registry | None |
container.image.pullSecrets.allNamespaces |
Use Helm's lookup function to deploy the pull secret to all namespaces. Helm chart must be re-run everytime a new namespace is created. | false |
container.image.pullSecrets.registryConfigJSON |
base64 encoded docker config json for the pull secret | None |
container.image.sensorResources |
The requests and limits of the sensor (see example below) | None |
falcon.cid |
CrowdStrike Customer ID (CID) | None (Required if falconSecret.enabled is false) |
falconSecret.enabled |
Enable k8s secrets to inject sensitive Falcon values | false (Must be true if falcon.cid is not set) |
falconSecret.secretName |
Existing k8s secret name to inject sensitive Falcon values. The secret must be under the same namespace as the sensor deployment. |
None (Existing secret must include FALCONCTL_OPT_CID) |
falcon.cid and container.image.repository are required values.
For a complete listing of configurable parameters, run the following command:
helm show values crowdstrike/falcon-sensor
If you need to provide a list of values to a --set command, you need to escape the commas between the values e.g. --set falcon.tags="tag1\,tag2\,tag3"
When setting container.image.sensorResources, the simplest method would be to provide a values file to the helm install command.
Example:
helm upgrade --install falcon-helm crowdstrike/falcon-sensor \
--set node.enabled=false \
--set container.enabled=true \
--set falcon.cid="<CrowdStrike_CID>" \
--set container.image.repository="<Your_Registry>/falcon-sensor" \
--values values.yamlWhere values.yaml is
container:
sensorResources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 10m
memory: 20MiOf course, one could specify all options in the values.yaml file and skip the --set options altogether:
node:
enabled: false
container:
enabled: true
image:
repository: "<Your_Registry>/falcon-sensor"
sensorResources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 10m
memory: 20Mi
falcon:
cid: "<CrowdStrike_CID>"If using a local values file is not an option, you could do this:
helm upgrade --install falcon-helm crowdstrike/falcon-sensor \
--set node.enabled=false \
--set container.enabled=true \
--set falcon.cid="<CrowdStrike_CID>" \
--set container.image.repository="<Your_Registry>/falcon-sensor" \
--set container.sensorResources.limits.memory="128Mi" \
--set container.sensorResources.limits.cpu="100m" \
--set container.sensorResources.requests.memory="20Mi" \
--set container.sensorResources.requests.cpu="10m"AITap requires configuration of the AI-DR Collector, and enabling AITap for namespaces and/or pods. The following guide explains the different options for enabling AITap for your AI workloads.
Note
AITap is only active for pods where the Falcon Container sensor is injected. Namespaces or pods not configured for container sensor injection will not have AITap enabled regardless of the AITap configuration.
| Parameter | Description | Default |
|---|---|---|
container.aitap.namespaces |
Comma-separated list of namespaces where AITap should be enabled. Example: "ns1,ns2,ns3" | None |
container.aitap.allNamespaces |
Enable AITap in all namespaces. Reserved system namespaces are automatically excluded. | false |
container.aitap.aidrCollectorBaseApiUrl |
AI-DR Collector Base API URL for the Application Collector | None (Required to enable AITap) |
container.aitap.aidrCollectorApiToken |
AI-DR Collector API token for the Application Collector | None |
container.aitap.aidrSecretName |
Custom AI-DR Kubernetes secret name | <release-name>-aitap-aidr-secret |
container.aitap.useExistingSecret |
Use an existing AI-DR secret. When true, Helm does NOT create the AI-DR secret. When false (default), Helm propagates secrets to target namespaces. | false |
If you would like to manage your own AI-DR collector secret, you can use an existing secret with
the .collector-aidr-token data key and your AI-DR collector token as the value.
Example AI-DR secret:
apiVersion: v1
kind: Secret
metadata:
name: <YOUR_AIDR_SECRET_NAME>
namespace: ai-services
type: Opaque
stringData:
.collector-aidr-token: "<YOUR_COLLECTOR_API_TOKEN>"In your helm values, your container.aitap.aidrSecretName must match the name of the secret you created.
Helm AITap Values:
container:
aitap:
useExistingSecret: true
aidrSecretName: <YOUR_AIDR_SECRET_NAME>
aidrCollectorBaseApiUrl: "<YOUR_COLLECTOR_API_BASE_URL>"Note
When useExistingSecret is true, only aidrCollectorBaseApiUrl is required. When not managing your own secret,
aidrCollectorBaseApiUrl and aidrCollectorApiToken are both required.
AITap can be enabled for specific pods, specific namespaces, or in all namespaces. You can control this behavior with the following options.
Option 1: Specific Pods
If you prefer to have granular control of AITap, you can enable AITap for specific pods only.
To enable AITap for specific pods, you must annotate the pod with sensor.falcon-system.crowdstrike.com/enable-aitap-events: "true".
You must also set useExistingSecret: true and aidrSecretName: <YOUR_AIDR_SECRET_NAME>,
and create your own AI-DR secret in each applicable namespace.
Deployment manifest example with annotations:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-application
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: my-application
template:
metadata:
labels:
app: my-application
annotations:
sensor.falcon-system.crowdstrike.com/enable-aitap-events: "true"Helm AITap Values:
container:
aitap:
useExistingSecret: true
aidrSecretName: "<YOUR_AIDR_SECRET_NAME>"
aidrCollectorBaseApiUrl: "<YOUR_COLLECTOR_API_BASE_URL>"With container.aitap.allNamespaces: false and container.aitap.namespaces not configured:
- Falcon Container sensor does not enable AITap for any namespaces by default.
- Helm does NOT create AI-DR secrets in any namespace.
- You must create your own AI-DR secret with the
aidrSecretNamein each target namespace.
Option 2: Specific Namespaces
To enable AITap for specific namespaces only, use the namespaces: "namespace-1,namespace-2" option.
container:
aitap:
namespaces: "namespace-1,namespace-2,namespace-3" # Comma-separated list
aidrCollectorApiToken: "<YOUR_COLLECTOR_API_TOKEN>"
aidrCollectorBaseApiUrl: "<YOUR_COLLECTOR_API_BASE_URL>"Once the falcon-sensor helm chart is deployed, you must run a helm upgrade with any additional namespaces you want
AITap enabled for appended to container.aitap.namespaces.
Note
Make sure all namespaces in container.aitap.namespaces already exist at the time of your helm install.
Your helm install will continue and result in a failed state, if it fails to find a namespace in the list of namespaces.
When using the helm --set option, the commas must be escaped to prevent the helm CLI from incorrectly parsing
your command. For example:
helm install falcon-sensor crowdstrike/falcon-sensor -n falcon-system --set container.aitap.namespaces="namespace-1\,namespace-2"
Option 3: Combination of Namespaces and Pods
You can use a combination of namespaces and the sensor.falcon-system.crowdstrike.com/enable-aitap-events: "true" pod annotation to enabled AITap for specific namespaces, and individual pods not included in the list of namespaces.
container:
aitap:
namespaces: "namespace-1,namespace-2"
# If namespace-3 has a 1 pod with `sensor.falcon-system.crowdstrike.com/enable-aitap-events: "true"`
# the aidrSecretName must match the existing AI-DR secret in namespace-3.
aidrSecretName: "<YOUR_AIDR_SECRET_NAME>"
aidrCollectorApiToken: "<YOUR_COLLECTOR_API_TOKEN>"
aidrCollectorBaseApiUrl: "<YOUR_COLLECTOR_API_BASE_URL>"You must manage your own AI-DR secret with the same name as aidrSecretName in any namespace not included in the list of namespaces, which in this example would be 'namespace-3'.
Option 4: Enable AITap for your entire cluster
To enable AITap for all namespaces, use the allNamespaces: true option.
container:
aitap:
allNamespaces: true
aidrCollectorApiToken: "<YOUR_COLLECTOR_API_TOKEN>"
aidrCollectorBaseApiUrl: "<YOUR_COLLECTOR_API_BASE_URL>"AITap will be enabled in:
- All other namespaces except reserved system namespaces
The following namespaces are automatically excluded:
kube-system,kube-public,kube-node-leasefalcon-system,falcon-kac,falcon-image-analyzer- The deployment namespace
Once the falcon-sensor helm chart is deployed, you must run a helm upgrade if you want AITap enabled for any new namespaces created after the initial helm install.
Note
DaemonSet deployments of sensor versions 7.33 and earlier of the Falcon sensor for Linux are blocked from updates and uninstallation if their sensor update policy has the Uninstall and maintenance protection setting enabled. Before upgrading or uninstalling these versions of the sensor, move the sensors to a new sensor update policy with this policy setting turned off. For more info, see Sensor update and uninstallation for DaemonSet sensor versions 7.33 and lower.
To uninstall, run the following command:
helm uninstall falcon-helm
To uninstall from a custom namespace, run the following command:
helm uninstall falcon-helm -n falcon-system
You may need/want to delete the falcon-system as well since helm will not do it for you:
kubectl delete ns falcon-system
After sensor deletion, it's important to run the cleanup DaemonSet to remove the /opt/CrowdStrike directory from all nodes. This cleanup process is automatically executed during a helm uninstall by default. However, in large clusters, the cleanup may occasionally encounter issues due to the extended time required for full deployment.
Failing to remove the /opt/CrowdStrike directory may lead to these potential problems:
- Unnecessary disk space consumption by the
/opt/CrowdStrikedirectory. - Reuse of the previous Agent ID (AID) found in
/opt/CrowdStrike/falconstoreduring subsequent sensor reinstallations.
If the automatic cleanup fails, you can manually run the cleanup DaemonSet by running the following:
helm install falcon-helm crowdstrike/falcon-sensor -n <NAMESPACE>\
--set node.image.repository="<Your_Registry>/falcon-node-sensor>" \
--set node.enabled=true \
--set node.cleanupOnly=trueValidate removal of the /opt/Crowdstrike directory with the following command:
for node in $(kubectl get nodes -o name); do
echo -n "$node: "
kubectl debug $node -it --image=busybox -- /bin/sh -c 'if test -d /opt/CrowdStrike; then echo "CrowdStrike directory still exists"; else echo "CrowdStrike directory successfully deleted"; fi'
doneAfter validating the removal of the /opt/Crowdstrike directory, the cleanup Daemonset should be deleted:
helm uninstall falcon-helm -n <NAMESPACE>\Note: OpenShift is not a recommended configuration for this Helm chart. The official Red Hat certified CrowdStrike Falcon Operator is the recommended installation method for OpenShift clusters.
This chart provides a best-effort compatibility mode for deploying the Falcon node sensor as a DaemonSet on OpenShift clusters. The container sensor (container.enabled) is not supported on OpenShift and will produce an error if enabled alongside node.openshift.enabled.
OpenShift uses Security Context Constraints (SCC) to control pod privileges. Because the Falcon node sensor requires privileged host access (hostPID, hostIPC, hostNetwork, and a privileged container), the default restricted SCC is insufficient.
When node.openshift.enabled=true and node.openshift.createSCC=true, the chart creates an SCC named <release-name>-falcon-sensor-node-sensor and binds it to the DaemonSet and cleanup DaemonSet service accounts.
Helm User Permissions: When node.openshift.createSCC: true, the user or service account running Helm must have permission to create, update, and delete SecurityContextConstraints resources at the cluster level.
To use an existing SCC instead, set node.openshift.createSCC=false, define node.openshift.sccName with the name of your SCC, and ensure the SCC is created prior to deployment. The SCC must be bound to the service accounts manually before installing.
OpenShift runs Pod Security Admission in warn/audit mode alongside SCCs. To suppress PSA warnings for the install namespace, label it before installing:
kubectl label namespace falcon-system \
pod-security.kubernetes.io/enforce=privileged \
pod-security.kubernetes.io/warn=privileged \
pod-security.kubernetes.io/audit=privileged| Parameter | Description | Default |
|---|---|---|
node.openshift.enabled |
Enable OpenShift compatibility mode for the node DaemonSet | false |
node.openshift.createSCC |
Create a SecurityContextConstraints resource granting the DaemonSet service account the required privileges |
true |
node.openshift.sccName |
Name of the SCC to create or use. If empty, defaults to <release-name>-falcon-sensor-node-sensor |
"" (auto-generated from release name) |
Kubernetes 1.23+ enforces Pod Security Standards (PSS) which can block privileged pods like the Falcon node sensor. Apply the required privileged PSS labels to the install namespace before installing:
kubectl label namespace <namespace> \
pod-security.kubernetes.io/enforce=privileged \
pod-security.kubernetes.io/warn=privileged \
pod-security.kubernetes.io/audit=privilegedIn automated testing environments, set testing.labelNamespace: true to apply these labels automatically via a pre-install Job. This requires outbound access to docker.io and is not suitable for air-gapped or registry-restricted environments.
Set node.openshift.enabled=true to enable OpenShift compatibility mode. The chart will automatically create and manage the required SCC unless node.openshift.createSCC=false is set.
For additional configuration options, see the OpenShift Values table above.