Configuration
The Sensor and Cluster Manager are shipped with default configurations that should be suitable for most installations, but can be customized by setting values in the Upwind Operator chart.
Using Kubernetes Secret for Upwind Operator clientId and clientSecret
The Upwind Operator requires a clientId and clientSecret to authenticate with the Upwind API. These credentials can be provided as a Kubernetes Secret, which is then referenced in the Upwind Operator configuration.
The Secret convention is as follows:
clientId: $CLIENT_ID
clientSecret: $CLIENT_SECRET
For example, you can create it with the following command:
kubectl create secret generic --namespace upwind upwind-secret \
--from-literal=clientId=$CLIENT_ID \
--from-literal=clientSecret=$CLIENT_SECRET
To reference the Secret in the Upwind Operator configuration, you must use the following configuration:
credentials:
create: false
name: upwind-secret
Enabling Scan Jobs
The scan jobs model allows you to reduce the scanner memory footprint because the scanner consumes resources only when it needs to perform a scan, unlike the daemonset model where scanner sidecar is reserved resources throughout its lifecycle. The scan jobs are managed by the Cluster Manager which initiates scans when pods with fresh images are encountered in the cluster, and to refresh existing SBOM findings, typically every 24 hrs.
Helm Values
To enable the Scan Jobs deployment model for the Scanner, upgrade the Upwind Operator chart to disable the scanner as a sidecar container in the Sensor Daemonset and activate management of the jobs from the Cluster Manager. Ensure you have updated to the latest upwind-operator chart before enabling Scan Jobs.
agent:
values:
scanAgent:
enabled: false
clusterAgent:
values:
scanJob:
enabled: true
Refer Configuration Library for additional configuration.
Tuning Scan Jobs
Scan jobs performance can be tuned using the following configuration options. Set it as environment variables at clusterAgent.env or as args at clusterAgent.extraArgs.
| Environment Variable | Arg | Description | Default |
|---|---|---|---|
UPWIND_IMAGE_SCAN_JOBS_THRESHOLD | --image-scan-jobs-threshold | Scan jobs will not be scheduled if the number of active jobs exceeds this limit. | 5 |
UPWIND_IMAGE_SCAN_PENDING_JOBS_THRESHOLD | --image-scan-pending-jobs-threshold | Scan jobs will not be scheduled if the number of pending jobs exceeds this limit, even if active jobs do not exceed image-scan-jobs-threshold. | 5 |
UPWIND_IMAGE_SCAN_JOB_TAINT_EXCEPTIONS | --image-scan-job-taint-exceptions | Node taints where the scan job should not run e.g. key=value:NoSchedule. | |
UPWIND_SCANNER_MEM_INCREASE | --scanner-mem-increase | Scan job memory increase factor for retries in case of OOMKill. | 1.5 |
UPWIND_SCANNER_MEM_LIMIT | --scanner-mem-limit | Scan job memory limit for retries, as a percentage of node capacity. | 75 |
UPWIND_SCAN_REPROCESSING_INTERVAL | --scan-reprocessing-interval | Interval, in seconds, to reprocess all pods for scanning, if not scanned already. | 14400 |
Configure with Prometheus
Prometheus is a monitoring system commonly used with Kubernetes, which gathers metrics (e.g. CPU usage) from various sources and stores them. You can then query them with a tool like Grafana, which lets you display a graph of the CPU usage of your pods.
Monitoring of the sensors and cluster manager can be enabled by setting the following chart values in the upwind-operator chart:
agent:
values:
agent:
metrics:
enabled: true
podMonitor:
enabled: true
scanAgent:
metrics:
enabled: true
clusterAgent:
values:
serviceMonitor:
enabled: true
Note that the sensor pod is a host-networked pod and enabling metrics will require that the sensor be able to use ports 59090 (for the agent container metrics) and 59091 (for the scan agent container metrics). The metrics port can be configured via the agent.metrics.port and scanAgent.metrics.port agent chart parameters.
The Prometheus PodMonitor resource in Kubernetes is defined by the following:
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: monitoring-upwind-agents
labels:
app.kubernetes.io/name: upwind-agent
spec:
podMetricsEndpoints:
- honorLabels: true
path: /metrics
port: agent-metrics
scheme: http
scrapeTimeout: 30s
jobLabel: upwind-agent
namespaceSelector:
matchNames:
- upwind
selector:
matchLabels:
app.kubernetes.io/instance: upwind-agent
app.kubernetes.io/name: agent
The Prometheus ServiceMonitor resource in Kubernetes is defined by the following:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: upwind-cluster-agent
spec:
jobLabel: upwind-cluster-agent
selector:
matchExpressions:
- key: app.kubernetes.io/name
values:
- cluster-agent
operator: In
namespaceSelector:
matchNames:
- upwind
endpoints:
- port: metrics
interval: 30s
Purpose of the Cluster Manager and Sensor ClusterRole
Upwind creates and utilizes the upwind-cluster-agent ClusterRole, configured to monitor and audit key Kubernetes resources. This role is tailored for observing and reporting on the state and configuration of various Kubernetes objects, necessary for ensuring a comprehensive security and operational overview.
The upwind-cluster-agent ClusterRole is defined with the following rules:
Core API Group (apiGroups: [""]):
Resources: Services, namespaces, nodes and pods.
Actions Allowed: ["watch", "list", "get"]
Apps API Group: ["apps"]:
Resources: Deployments, replicasets, daemonsets, and statefulsets.
Actions Allowed: ["watch", "list", "get"]
Networking API Group: ["networking.k8s.io"]:
Resources: Network policies and ingresses.
Actions Allowed: ["watch", "list", "get"]
Batch API Group: ["batch"]:
Resources: Jobs and cronjobs.
Actions Allowed: ["watch", "list", "get"]
CustomResouceDefinition API Group ["apiextensions.k8s.io"]:
Resources: CustomResourceDefinitions
Actions Allowed: ["watch", "list", "get"]
Additionally, Upwind creates and uses the upwind-agent ClusterRole with the following configuration:
Core API Group (apiGroups: [""]):
Resources: Services, namespaces, nodes and pods.
Actions Allowed: ["watch", "list", "get"]
Apps API Group: ["apps"]:
Resources: Deployments, replicasets, daemonsets, and statefulsets.
Actions Allowed: ["watch", "list", "get"]
Batch API Group: ["batch"]:
Resources: Jobs and cronjobs.
Actions Allowed: ["watch", "list", "get"]
CustomResouceDefinition API Group ["apiextensions.k8s.io"]:
Resources: CustomResourceDefinitions
Actions Allowed: ["watch", "list", "get"]
The Upwind Cluster Manager and Sensor ClusterRole are configured to access specific types of resources within designated API groups, focusing on services, namespaces, various workload controllers, and networking configurations. The verbs watch, list, and get provide read-only access, allowing Upwind to observe and report on resource states without modifying them. The ClusterRole adheres to the principle of least privilege by limiting its scope to specific resource types, reducing potential security risks.
Tuning the Sensor and Cluster Manager
The Sensor pods will use memory roughly in proportion to the level of network and process activity on the node the Sensor is running on, and is not dependent on the overall size of the Kubernetes cluster. Most of the memory the Sensor uses is dedicated to internal caches of data related to active network connections. Depending on your specific environment, it may be beneficial to adjust the size or expiration time of these caches by configuring the Sensor daemonset by modifying agent.values.agent.config.connCache or agent.values.agent.config.connTrackCache. Increasing the cache sizes will allow the sensor to monitor more concurrent network connections. Reducing the size of the caches or the expiration time can reduce memory usage.
The Cluster Manager will use memory roughly in proportion to the size of the cluster it is running in and the amount of network traffic in the cluster. For clusters larger than 50 nodes or with more than 1 GB/s of network traffic, it's recommended to increase the memory requests and limits for the Cluster Manager.
Proxy Configuration
All cluster components the operator, cluster manager, sensor and scanner will all respect the HTTP_PROXY family of environment variables for egress communication The helm charts have a proxy object that can be configured
proxy:
enabled: true|false
httpProxy: ""
httpsProxy: ""
noProxy: ""
httpProxy
Used as the proxy URL for HTTP requests unless overridden by noProxy.
httpsProxy
Used as the proxy URL for HTTPS requests unless overridden by noProxy When not specified will use the value from httpProxy
noProxy
Specifies a string that contains comma-separated values specifying hosts that should be excluded from proxying. Each value is represent by:
- an IP address (
1.2.3.4) - an IP address prefix in CIDR notation (
1.2.3.0/24) - a domain name
An IP address prefix and domain name can also include a literal port
number (
1.2.3.4:80). A domain name matches that name and all subdomains.
Configuring TLS/mTLS
The sensor and cluster manager can be configured to use TLS/mTLS for communications between them.
The sensor and cluster manager pods expect their respective certificates and their associated keys to exist in a secret,
and their corresponding CA certificates to exist in a config map. By default the sensor pod expects a secret named
upwind-secrets-agent-certs for the sensor certificate and key, and a config map named upwind-config-agent-peer-ca-certs
for the CA certificate. These names can be configured in the upwind operator chart.
Similarly the cluster manager pod expects a secret named upwind-secrets-cluster-agent-certs for the cluster manager
certificate and key, and a config map named upwind-config-cluster-agent-peer-ca-certs for the CA certificate.
It can be convenient to use cert-manager and trust-manager (see the official docs for more) to manage the creation of the required secrets and config maps.
If cert-manager is enabled a Certificate which represents a certificate request to obtain
a signed certificate from a configured Issuer or ClusterIssuer will be created during the installation of the
upwind-operator chart and cert-manager will create secrets for the TLS certificates where the sensor and cluster manager
pods expect to find them. Furthermore, trust-manager can be configured to create the config maps for the CA certificates
where the sensor and cluster manager pods expect to find them upon the creation of the secrets.
When installing trust-manager it should be configured to read source secrets from the upwind namespace
by setting the value app.trust.namespace to upwind i.e. --set app.trust.namespace=upwind.
With cert-manager and trust-manager set up to create the expected secrets and config maps
(or they have been created manually in which case the certManager field can be omitted in the configs below)
TLS/mTLS can be enabled by setting the following chart values in the upwind-operator chart:
- TLS
- mTLS
agent:
values:
tls:
ca:
enabled: true
agent:
extraArgs:
- --in-cluster-tls=true
- --ca-cert-enabled=true
clusterAgent:
values:
tls:
certManager:
enabled: true
issuerRef:
name: my-ca-issuer
certificates:
enabled: true
extraArgs:
- --self-signed=false
agent:
values:
tls:
certManager:
enabled: true
issuerRef:
name: my-ca-issuer
certificates:
enabled: true
ca:
enabled: true
agent:
extraArgs:
- --in-cluster-tls=true
- --ca-cert-enabled=true
clusterAgent:
values:
tls:
certManager:
enabled: true
issuerRef:
name: my-ca-issuer
certificates:
enabled: true
ca:
enabled: true
extraArgs:
- --self-signed=false
- --ca-cert-enabled=true
While the sensor and cluster manager pods support automatic reloading of TLS certificates, automatic reloading of CA certificates is not supported. Therefore, the relevant component must be restarted to pick up changes to the CA certificate. For example, if the CA that signs the cluster manager certificates is changed, the sensors must be restarted to recognize the new CA before the cluster manager pods start using certificates signed by it.
Enabling response
To enable the response feature, verify that the --responses-enabled flag is set to true.
For example:
{
"agent": {
"values": {
"agent": {
"extraArgs": [
...
"--responses-enabled=true",
...
]
},
...
},
"clusterAgent": {
"values": {
"extraArgs": [
"--responses-enabled=true"
],
...
}
}
}
EKS Auto Mode
In EKS Auto Mode, the hop limit for IMDS is set to 1 and can not be updated. This prevents most pods from accessing IMDS unless they are using host networking. In this case, you must provide the AWS account ID via a flag to the Upwind Operator and Upwind Cluster Manager components since they can not load the account ID from IMDS. Example values for the upwind-operator chart:
credentials:
clientId: XXX
clientSecret: XXX
extraArgs:
- --cloud-account-id=XXXX
clusterAgent:
values:
extraArgs:
- --cloud-account-id=XXXX
Google Autopilot Clusters
In Google Autopilot Clusters, additional configuration of the sensor is required to allow the pods to launch.
credentials:
clientId: XXX
clientSecret: XXX
agent:
values:
extraArgs:
- --cluster-name=<CLUSTER NAME>
providers:
gke:
autopilot:
enabled: true
clusterAgent:
values:
extraArgs:
- --cluster-name=<CLUSTER NAME>
extraArgs:
- --cluster-name=<CLUSTER NAME>
Nodes in Autopilot clusters do not have a label indicating the cluster name, so on order for the name of the cluster to be correctly displayed in the Upwind Console it needs to be passed to the components as a flag.
API Catalog Configuration
There are a number of flags to control the data included in the API Catalog.
| Environment Variable | Flag | Description | Default |
|---|---|---|---|
UPWIND_API_SEC_CATALOG | --api-sec-catalog=true | Whether to enable the API Catalog. | true |
UPWIND_API_SEC_REQUESTS_SAMPLE_CNT | --api-sec-requests-sample-cnt=1000 | Maximum number of request samples to include in an API Catalog report. Set to 0 to disable request sampling entirely. | 1000 |
UPWIND_API_SEC_REQUESTS_SAMPLE_SIZE_MAX | --api-sec-requests-sample-size-max=1024 | Maximum size of request body. Set to 0 to disable including request bodies. | 1024 |
UPWIND_API_SEC_RESPONSE_SAMPLE_SIZE_MAX | --api-sec-response-sample-size-max=1024 | Maximum size of response body. Set to 0 to disable including response bodies. | 1024 |
UPWIND_API_SEC_EXCLUDE_SENSITIVE_BODY | --api-sec-exclude-sensitive-body=false | Whether to mask the entire request or response body on a sensitive data match | false |
These flags or environment values can be added to the agent.values.extraArgs or agent.values.env lists in the upwind-operator chart.
gVisor Support
The Upwind Sensor includes support for monitoring applications running in gVisor sandboxes, providing enhanced security isolation for sensitive workloads. gVisor implements a userspace kernel that acts as a security boundary between containerized applications and the host system.
Learn more about gVisor support including configuration, architecture, and deployment options.
Istio Ambient Mesh Support
In order for the Upwind Sensor to accurately report network activity when Istio Ambient mesh is enabled, traffic must be monitored at layer 7 instead of layer 4. Set the --network-flow-sock and --network-flow-sock-all flags on the sensor. Example values for the upwind-operator chart with these flags set:
credentials:
clientId: XXX
clientSecret: XXX
agent:
values:
extraArgs:
- --network-flow-sock
- --network-flow-sock-all
S3 Report Upload
The Cluster Manager can write a copy of the reports it sends to Upwind into an S3 bucket you own, or into S3-compatible object storage.
Learn more about S3 report upload including credentials, bucket configuration, and the report types available.
Configuration Library
Below are the supported helm values for Upwind components. Note that you may need to upgrade to latest helm chart release version to use some of the values listed below.
- Upwind Operator
- Upwind Cluster Manager
- Upwind Sensor
# -- `[Optional]` Overrides application name.
nameOverride: ""
# -- `[Optional]` Overrides the full qualified application name.
fullnameOverride: ""
# Image.
# @see: <https://kubernetes.io/docs/concepts/containers/images/>
image:
# -- `[Optional]` Specifies the image registry/repository.
repository: public.ecr.aws/upwindsecurity/images/operator
# -- `[Optional]` Specifies the image pull policy.
pullPolicy: IfNotPresent
# -- `[Optional]` Specifies the image tag. Defaults to `.Chart.AppVersion`.
tag: ""
# -- `[Optional]` Specifies the image pull secrets.
# The Upwind Operator image is publicly available, but when self hosting images or using a proxy repository that
# requires authentication the imagePullSecrets can be set.
imagePullSecrets: []
# Service account.
# @see: <https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/>
serviceAccount:
# -- `[Optional]` Specifies whether a Service Account should be created.
create: true
# -- `[Optional]` Specifies the annotations for the Service Account.
annotations: {}
# -- `[Optional]` Specifies the name of the Service Account. Defaults to fully qualified application name.
name:
# -- `[Optional]` Specifies the Deployment annotations.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>
annotations: {}
# -- `[Optional]` Specifies the Pod annotations.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>
podAnnotations: {}
# `[Required]` Compute resources granted to the controller
resources:
limits:
cpu: 500m
memory: 500Mi
requests:
cpu: 10m
memory: 256Mi
# `[Required]` Deployment livenessProbe
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 8081
scheme: HTTP
initialDelaySeconds: 15
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 1
# `[Required]` Deployment readinessProbe
readinessProbe:
failureThreshold: 3
httpGet:
path: /readyz
port: 8081
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
# -- `[Optional]` Specifies the region of the Upwind Endpoints. Defaults to `us`
region: # @schema type:[string, null]
# [Static Secret] Upwind Application Credentials (OAuth 2.0 Client Credentials).
credentials:
# -- `[Optional]` Specifies whether a Secret should be created.
create: true
# -- `[Optional]` Specifies the name of the Secret. Defaults to fully qualified application name.
# When create is set to false this will be used as a reference to an existing Secret to use.
name: # @schema type:[string, null]
# -- `[Required]` Specifies the application's Client ID.
clientId: # @schema type:[string, null]
# -- `[Required]` Specifies the application's Client Secret.
clientSecret: # @schema type:[string, null
# -- `[Optional]` Specifies annotations for the Credentials Secret
annotations: {}
# -- `[Required]` Specifies the name of the Secret to be created.
registrySecretName: # @schema type:[string, null]
# -- `[Required]` Specifies the name of the Secret to be created.
agentSecretName: # @schema type:[string, null]
# [Agent Component] Configuration settings specifically for the Agent Custom Resource
agent:
# -- `[Optional]` Specifies whether or not this chart will create the Agent
# component resource. Disable to manage this resource on your own.
create: true
# -- `[Required]` The name of the Upwind `Agent` resource to create. Defaults
# to `upwind`. Final pod names will be `upwind-agent-...`.
name: upwind
# -- `[Optional]` Configures the reconciliation frequency of the Agent
# resource. Default is 1h.
interval: # @schema type:[string, null]
# -- `[Optional]` If specified, pins the version of the Agent component to a
# specific release. If unset, the Upwind Operator will automatically upgrade
# releases as they become available.
version: # @schema type:[string, null]
# -- `[Optional]` if specified, these custom values will be added to the
# Agent spec, and passed through to the Agent helm chart.
values: {}
# [Cluster Agent Component] Configuration settings specifically for the
# ClusterAgent Custom Resource
clusterAgent:
# -- `[Optional]` Specifies whether or not this chart will create the
# ClusterAgent component resource. Disable to manage this resource on your
# own.
create: true
# -- `[Required]` The name of the Upwind `ClusterAgent` resource to create.
# Defaults to `upwind`. Final pod names will be `upwind-cluster-agent-...`.
name: upwind
# -- `[Optional]` Configures the reconciliation frequency of the ClusterAgent
# resource. Default is 1h.
interval: # @schema type:[string, null]
# -- `[Optional]` If specified, pins the version of the ClusterAgent
# component to a specific release. If unset, the Upwind Operator will
# automatically upgrade releases as they become available.
version: # @schema type:[string, null]
# -- `[Optional]` if specified, these custom values will be added to the
# ClusterAgent spec, and passed through to the Cluster Agent helm chart.
values: {}
# Configuration settings specifically for the Operator itself
operator:
# -- `[Optional]` Set the log level for the controller.
logLevel: info
extraVolumes: []
extraVolumeMounts: []
# -- `[Optional]` If specified, this controls the Oauth Endpoint that the
# Operator will use to generate secret credentials for the components and for
# image pulling.
oauthEndpoint: # @schema type:[string, null]
# -- `[Optional]` If specified, this controls the audience value used by the
# Operator when generating credential tokens for the Agent and the Cluster
# Agent.
agentEndpoint: # @schema type:[string, null]
# --`[Optional]` If specified, this controls the audience value used by the
# Operator when generating credential Image Pull Secrets used to pull the
# Component images from the private registry.
registryEndpoint: # @schema type:[string, null]
# -- `[Optional]` If set to true, the Operator will use Helm to manage the
# Agent and Cluster Agent components. Defaults to true.
useHelm: true
# -- `[Optional]` SecurityContext for the operator container
securityContext:
privileged: false
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 65532
runAsGroup: 65532
capabilities:
drop:
- ALL
# -- `[Optional]` Deployment progressDeadlineSeconds.
progressDeadlineSeconds: # @schema type:[string, null]
# -- `[Optional]` The number of Upwind Secret Controllers to run.
replicas: # @schema type:[integer, null]
# -- `[Optional]` Deployment revisionHistoryLimit.
revisionHistoryLimit: # @schema type:[integer, null]
# -- `[Optional]` Deployment strategy.
strategy: # @schema type:[string, null]
# -- `[Optional]` Specifies the priorityClass to use. Defaults to unset.
priorityClassName:
# -- `[Optional]` Specifies the RuntimeClass for the operator pod (e.g. `edera`).
# Defaults to unset (the cluster default runtime).
runtimeClassName: # @schema type:[string, null]
# -- `[Optional]` Specifies the node selector.
# @see: <https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/>
nodeSelector: {}
# -- `[Optional]` Specifies the tolerations for nodes that have taints on them.
# @see: <https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/>
tolerations: []
# -- `[Optional]` Specifies the DNS policy for the pod. Defaults to "ClusterFirst".
# Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'.
# @see: <https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy>
dnsPolicy: "" # @schema type:[string, null]
# -- `[Optional]` Specifies custom DNS configuration for the pod.
# Useful for overriding ndots, search domains, etc.
# @see: <https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-dns-config>
dnsConfig: {}
# -- ``[Optional]` Pod SecurityContext
securityContext:
seccompProfile:
type: RuntimeDefault
# `[Optional]` Allowed profiles that can be set for pod.
# Applies to Red Hat Openshift installation only and should be set according to `.securityContext.seccompProfile.type` value.
#
# @see: https://docs.redhat.com/en/documentation/openshift_container_platform/3.11/html-single/architecture/index#authorization-seccomp
openshift:
scc:
seccompProfiles:
- runtime/default
# -- `[Required]` Pod affinity settings. The default allows linux or windows
# nodes on amd64/arm64. On EKS Windows you additionally need
# `nodeSelector.kubernetes.io/os: windows` — the EKS VPC Resource Controller's
# mutating webhook only annotates Windows pods with
# `vpc.amazonaws.com/PrivateIPv4Address` when it reads `spec.nodeSelector`,
# not `spec.affinity`.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
- arm64
- key: kubernetes.io/os
operator: In
values:
- linux
- windows
# -- `[Required]` Additional command line arguments for the manager.
extraArgs:
# Ensure that we are reconciling the custom Component resources
- --enable-custom-resources=true
# -- `[Optional]` Additional environment variables for the manager.
extraEnv: []
# -- `[Optional]` Any additional labels that should be added to resources
# created by this chart.
extraLabels:
# This label is defined externally to the helper functions to enable
# overriding it with a different value in the EKS add-on chart.
# The common value Release[dot]Service (using [dot] notation to avoid
# validation issues) is not supported in EKS add-ons managed through
# the AWS Marketplace. However, in Helm, the value is always Helm,
# so it may be acceptable to simply use a hard-coded default value instead.
app.kubernetes.io/managed-by: Helm
identities:
# -- Names of ConfigMaps the cluster-agent will be allowed to read.
configMaps:
- aws-auth
# -- `[Optional]` Parameters configurable by parent charts.
global:
# [Static Secret] Upwind Application Credentials (OAuth 2.0 Client Credentials).
credentials:
# -- `[Optional]` Specifies whether a Secret should be created.
create: true
# -- `[Required]` Specifies the application's Client ID.
clientId: # @schema type:[string, null]
# -- `[Required]` Specifies the application's Client Secret.
clientSecret: # @schema type:[string, null]
# -- This adds proxy configuration for outbound http/https traffic from the components
proxy:
enabled: false
httpProxy: ""
httpsProxy: ""
noProxy: ""
# -- `[Optional]` Kubernetes provider configuration, propagated to both the
# agent and cluster-agent charts (like `region` and `proxy`). Declare it here
# instead of repeating it inside `agent.values` and `clusterAgent.values`; a
# `providers` key set directly in a component's values takes precedence for
# that component. When empty nothing is propagated, so existing CRs are left
# untouched. Example: `--set providers.gke.autopilot.enabled=true`.
providers: {}
# -- the names of additional agent custom resources managed by the operator.
extraAgentResources: []
clusterRole:
# -- Enables permissions to read all resources.
enableCustomResources: true
# -- `[Optional]` Overrides application name.
nameOverride: ""
# -- `[Optional]` Overrides the full qualified application name.
fullnameOverride: ""
# -- `[Optional]` Custom labels to add to all resources created by this chart.
extraLabels: {}
# -- `[Optional]` Specifies the number of desired Pods.
# @see: <https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#replicas>
replicas: 1
# -- Specifies the image repository.
registry: registry.upwind.io
# -- Specifies the image pull policy.
imagePullPolicy: IfNotPresent
# -- `[Optional]` Specifies the image pull secrets.
imagePullSecrets:
- name: upwind-secrets-registry-credentials
# Image.
# @see: <https://kubernetes.io/docs/concepts/containers/images/>
image:
# -- Specifies the image name and path for the cluster agent image.
repository: images/cluster-agent
# -- `[Optional]` Specifies the image tag. Defaults to `.Chart.AppVersion`.
tag: ""
# -- This adds proxy configuration for outbound http/https traffic from the cluster manager
proxy:
enabled: false
httpProxy: ""
httpsProxy: ""
noProxy: ""
# Service account.
# @see: <https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/>
serviceAccount:
# -- `[Optional]` Specifies whether a Service Account should be created.
# Even if create is set to false it will set up the DameonSet using a service account by name, which
# should then be provided. For provided Service Account their name can be set using `name:`
create: true
# -- `[Optional]` Specifies the annotations for the Service Account.
annotations: {}
# -- `[Optional]` Specifies the name of the Service Account. Defaults to fully qualified application name.
name:
# -- `[Optional]` Specifies the Deployment annotations.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>
annotations: {}
# -- `[Deprecated]` Use `extraLabels` instead, which applies to all resources.
# Adds labels to the Deployment/StatefulSet metadata only.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/>
labels: {}
# -- `[Optional]` Specifies the Pod annotations.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>
podAnnotations: {}
# -- `[Optional]` Specifies the Pod labels.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/>
podLabels: {}
# -- `[Optional]` Set the Pod SecurityContext.
# @see: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/>
podSecurityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
# `[Optional]` Allowed profiles that can be set for pod.
# Applies to Red Hat Openshift installation only.
#
# Upwind Cluster Manager service account is shared with
# the Upwind Runtime Scan jobs which require privileged security context,
# hence, the SCC is set to the wildcard by default.
# @see: https://docs.redhat.com/en/documentation/openshift_container_platform/3.11/html-single/architecture/index#authorization-seccomp
openshift:
scc:
seccompProfiles:
- runtime/default
# -- `[Optional]` Set the SecurityContext for the cluster-manager container.
# @see: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/>
clusterManagerSecurityContext:
privileged: false
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 65532
runAsGroup: 65532
capabilities:
drop:
- ALL
# -- `[Optional]` Specifies the strategy used to replace old Pods by new ones.
# @see: <https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy>
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: "10%"
# PodDisruptionBudget configuration. Caps how many cluster-agent replicas can
# be voluntarily evicted at once (node drains, autoscaler consolidation, etc.).
# Does not protect against involuntary disruption (spot preemption, node failure).
#
# Disabled by default for backwards compatibility — installations managed by
# older versions of `upwind-operator` do not have RBAC to create
# PodDisruptionBudgets, and enabling this on those would block upgrades. Once
# the operator chart that grants `policy/poddisruptionbudgets` is released,
# customers can opt in by setting `podDisruptionBudget.enabled: true`.
#
# Note: when `replicas: 1` (the chart default), `maxUnavailable: 1` is
# effectively a no-op (the only pod is always disruptable). Configure
# `maxUnavailable` / `minAvailable` to suit the replica count you run with —
# at higher replica counts `maxUnavailable: 1` keeps proportionally more pods
# healthy, while `minAvailable: <N>` blocks node drains when fewer than N pods
# would remain healthy.
# @see: <https://kubernetes.io/docs/tasks/run-application/configure-pdb/>
podDisruptionBudget:
# -- `[Optional]` Specifies whether a PodDisruptionBudget should be created.
enabled: false
# -- `[Optional]` Specifies the maximum number of pods that can be unavailable.
# Mutually exclusive with `minAvailable` — to switch to `minAvailable`, set
# this to `null` in your override.
maxUnavailable: 1
# -- `[Optional]` Specifies the minimum number of pods that must be available.
# Mutually exclusive with `maxUnavailable` (set `maxUnavailable: null` if
# using this).
# minAvailable:
# Specifies the priority class to indicate the importance of controller pods.
# @see: <https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass>
priorityClass:
# -- `[Optional]` Specifies whether a Priority Class should be created.
create: false
# -- `[Optional]` Specifies the annotations for the Priority Class.
annotations: {}
# -- `[Optional]` Specifies the value of the Priority Class that should be created.
value: 1000000
# -- `[Optional]` Specifies the name of the priorityClass. Defaults to fully qualified application name.
# If create is set to false and name is set it will set a priorityClass with that name and assume it already exits.
name:
# -- `[Optional]` Specifies the resource requests and limits.
# See the README "Resource sizing" section for guidance on tuning these for
# larger clusters (high CRD count, high pod count).
# @see: <https://kubernetes.io/docs/user-guide/compute-resources/>
resources:
limits:
cpu: 3000m
memory: 2Gi
requests:
cpu: 1000m
memory: 2Gi
# Probe configuration. The HTTP target (`/healthz`, `/readyz` on port 8081) is
# fixed by the cluster-agent binary's `--health-probe-bind-address` and is not
# configurable here; only the timing knobs are exposed. To change the bind
# address, also pass `--health-probe-bind-address=:<port>` via `extraArgs`.
# @see: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/>
# -- `[Optional]` Liveness probe timings.
livenessProbe:
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
# -- `[Optional]` Readiness probe timings.
readinessProbe:
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
# -- `[Optional]` Startup probe timings. Gives the cluster-agent up to
# `periodSeconds * failureThreshold` seconds (5 minutes by default) to finish
# initial informer hydration before liveness/readiness start checking. On large
# clusters (high CRD/pod counts) cold-start CPU contention can otherwise trip
# liveness and put the pod into CrashLoopBackOff. Set to `null` to disable.
# @see: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-startup-probes>
startupProbe:
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 30
# -- `[Optional]` Specifies the node selector.
# @see: <https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/>
nodeSelector: {}
# -- `[Optional]` Specifies the tolerations for nodes that have taints on them.
# @see: <https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/>
tolerations: []
# -- `[Optional]` Specifies the DNS policy for the pod. Defaults to "ClusterFirst".
# Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'.
# @see: <https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy>
dnsPolicy: ""
# -- `[Optional]` Specifies custom DNS configuration for the pod.
# Useful for overriding ndots, search domains, etc.
# @see: <https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-dns-config>
dnsConfig: {}
# -- `[Optional]` Specifies the Pod scheduling preferences. The default below
# pins to linux on amd64/arm64. A soft pod anti-affinity that prefers
# spreading replicas across nodes is added at render time by the
# `upwind-cluster-agent.defaultPodAntiAffinity` helper (see _helpers.tpl) so
# its labelSelector tracks the chart's selectorLabels — including any
# release-name prefix added by tools like Argo CD. Set
# `affinity.podAntiAffinity` here to replace the default.
# @see: <https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity>
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
- windows
- key: kubernetes.io/arch
operator: In
values:
- amd64
- arm64
# -- `[Optional]` Topology spread constraints. When left empty, the chart
# renders a soft zone spread (`whenUnsatisfiable: ScheduleAnyway`) from the
# `upwind-cluster-agent.defaultTopologySpreadConstraints` helper (see
# _helpers.tpl) — its labelSelector tracks the chart's selectorLabels so it
# matches the deployed pod even when tools like Argo CD prefix release
# names. For production multi-zone deployments where you want to refuse
# scheduling unless replicas can be spread, set an entry here with
# `whenUnsatisfiable: DoNotSchedule`.
# @see: <https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/>
topologySpreadConstraints: []
# -- `[Optional]` Specifies any additional arguments.
# @see: <https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/>
extraArgs: []
metricsService:
# -- `[Optional]` Whether the cluster manager runs a Prometheus metrics service
enabled: true
# -- `[Optional]` Specifies the annotations for the Service.
annotations: {}
# -- `[Optional]` Specifies the metrics port.
port: 9090
# -- `[Optional]` Specifies the metrics port name.
portName: metrics
# -- `[Optional]` Specifies the metrics serving endpoint.
endpoint: /metrics
# Cluster agent HTTP service, e.g. flow aggregation, scan caching, etc..
service:
# -- `[Optional]` Specifies whether the service should be enabled.
enabled: true
# -- `[Optional]` Port the http service should run on
port: 8080
# -- `[Optional]` Name of the container port the http service targets.
portName: http
# -- `[Optional]` Port the grpc service should run on
grpcPort: 8082
# -- `[Optional]` Name of the container port the grpc service targets.
grpcPortName: grpc
# -- `[Optional]` Port the https service should run on
httpsPort: 8443
# -- `[Optional]` Name of the container port the https service targets.
httpsPortName: https
# -- `[Optional]` Port the grpc service with TLS should run on
grpcsPort: 8444
# -- `[Optional]` Name of the container port the grpc service with TLS targets.
grpcsPortName: grpcs
# Leader Election.
# @see: <https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/leaderelection/>
leaderElection:
# -- `[Optional]` Specifies whether leader election should be enabled.
enabled: true
# -- `[Optional]` Specifies the leader election lock name.
lockName:
# -- `[Optional]` Custom environment variables to add to the cluster agent pod.
env: {}
# -- `[Optional]` Specifies the region of the Upwind Endpoints. Defaults to `us`
region:
# Upwind Credentials.
# @see: [TODO]
credentials:
# -- `[Optional]` Specifies whether a Secret should be created. If true, clientId and
# clientSecret must be provided.
create: false
# -- `[Optional]` Specifies the name of the Secret that holds the OAuth 2.0 Access Token.
secretName: upwind-secrets-cluster-agent-credentials
# -- `[Optional]` Specifies the application's Client ID.
clientId:
# -- `[Optional]` Specifies the application's Client Secret.
clientSecret:
# -- `[Optional]` Specifies annotations for the Credentials Secret
annotations: {}
# -- `[Optional]` Specifies the application's Authentication endpoint.
endpoint:
tls:
# Cert manager
certManager:
# -- `[Optional]` Whether to enable cert manager.
enabled: false
issuerRef:
# -- `[Required if certManager.enabled = true]` Specifies the name of the certificate issuer.
name: ""
# -- `[Optional]` Specifies the kind of the issuer. Can be either Issuer or ClusterIssuer.
kind: ClusterIssuer
# -- `[Optional]` Specifies the group of the issuer.
group: cert-manager.io
# SSL certificates
certificates:
# -- `[Optional]` Whether to mount SSL certificates in the cluster agent.
enabled: false
# -- `[Optional]` Specifies the name of the Secret that holds the SSL certificate and private key
# of the cluster manager used for setting up TLS with the sensor.
secretName: upwind-secrets-cluster-agent-certs
ca:
# -- `[Optional]` Whether to mount CA certificates in the cluster agent.
enabled: false
# -- `[Optional]` Specifies the name of the Secret that holds the peer CA certificate.
configMapName: upwind-config-cluster-agent-peer-ca-certs
# -- `[Optional]` Specifies the application's Authentication endpoint.
agentEndpoint:
# -- The GRPC endpoint for Cluster Agents to send data. Must be in a
# HOST:PORT format.
grpcEndpoint:
# Analysis ConfigMap.
analysisConfig:
# -- `[Optional]` Name of the ConfigMap used for analysis configuration.
name:
# Response ConfigMap.
responseConfig:
# -- `[Optional]` Name of the ConfigMap used for response configuration.
name:
# Secrets ConfigMap.
secretsConfig:
# -- `[Optional]` Name of the ConfigMap used for secrets configuration.
name:
# Process Events ConfigMap.
eventsConfig:
# -- `[Optional]` Name of the ConfigMap used for process events configuration.
name:
byoc:
# -- The Account ID to use for clusters in on-premise data centers. ("bring-your-own-cloud")
accountID:
zone:
serviceMonitor:
# -- Enables a Prometheus ServiceMonitor.
enabled: false
# -- Sets interval for the ServiceMonitor.
interval:
# -- Set scrapeTimeout for the ServiceMonitor
scrapeTimeout:
# -- Relabelings for the ServiceMonitor
relabelings: []
headlessService:
# -- Annotations for the headless service
annotations: {}
statefulSet:
# -- Deploy the Cluster Agent in a StatefulSet instead of a Deployment.
# If this chart is installed with the operator, requires operator chart version
# >= 0.2.1.
enabled: false
# -- Enable the RBAC permissions required for the identities features.
# get/list/watch on Roles, ClusterRoles, RoleBindings, ClusterRoleBindings,
# ServiceAccounts, and a specific list of ConfigMaps.
identities:
enabled: true
configMaps:
- aws-auth
extraVolumes:
volumes: []
mounts: []
# Scan job configuration.
scanJob:
enabled: false
# Scan job config map
config:
# -- `[Optional]` Name of the ConfigMap used for scan job configuration.
name:
# Configuration of Scanner run as job.
scanner:
name:
# Specifies the `upwind-agent` app version to use.
appVersion: 0.131.1
# -- `[Optional]` Specifies the scanner job annotations.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>
annotations: {}
# -- `[Optional]` Specifies the scanner Job annotations.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/>
labels: {}
# -- `[Optional]` Specifies the Pod annotations.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>
podAnnotations: {}
# -- `[Optional]` Specifies the Pod labels.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/>
podLabels: {}
# -- `[Optional]` Specifies the resource requests and limits.
# @see: <http://kubernetes.io/docs/user-guide/compute-resources/>
# -- `[Optional]` Specifies any additional arguments for the container.
# @see: <https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/>
extraArgs: []
# -- `[Optional]` Additional environment variables added to the container.
env: []
resources:
limits:
cpu: 500m
memory: 500Mi
requests:
cpu: 50m
memory: 50Mi
image:
# -- Specifies the image name and path for the scanner image (which is agent image).
repository: images/agent
# -- Specifies the image tag for the scanner image. Defaults to
# .scanner.appVersion.
tag: ""
# -- Specifies the image pull policy.
imagePullPolicy: IfNotPresent
# -- `[Optional]` Specifies the job duration deadline in seconds.
# @see: <https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup>
activeDeadlineSeconds:
# -- `[Optional]` Specifies the TTL for finished jobs in seconds.
# @see: <https://kubernetes.io/docs/concepts/workloads/controllers/ttlafterfinished/#cleanup-for-finished-jobs>
ttlSecondsAfterFinished:
# -- Log level for the scanner container. Default is INFO.
logLevel:
# Container runtimes mounted into the scan job pod. Only the sockets' parent
# directories are mounted, with the hostPath type left unset, so containerd
# and CRI-O can be mounted together on heterogeneous clusters (nodes with
# different runtimes) without wedging scan pods on nodes that do not run
# them. The scanner detects the node's live runtime at runtime.
containerRuntime:
# -- `[Deprecated]` Primary container runtime [docker|containerd|crio].
# Kept for backwards compatibility: `name: docker` still mounts docker.
# containerd and CRI-O ignore this field — use their `enabled` flags.
name: containerd
containerd:
# -- Whether to mount containerd into the scan job pod.
enabled: true
# -- `[Optiona]` Specifies the path on the host to the containerd socket.
# Only the socket's parent directory is mounted; the filename is
# resolved inside the container.
address: /run/containerd/containerd.sock
# -- `[Optional]` Specifies the root directory for containerd metadata
root: /var/lib/containerd
# docker integration. Required for image scanning on k8s 1.22
docker:
# -- Whether to mount docker into the scan job pod.
enabled: false
# -- `[Optional]` Specifies the root directory for docker metadata
root: /var/lib/docker
crio:
# -- Whether to mount CRI-O into the scan job pod.
enabled: true
# -- Path to CRI-O socket. Only the socket's parent directory is
# mounted; the filename is resolved inside the container.
address: /run/crio/crio.sock
# -- Path to CRI-O containers directory
root: /var/lib/containers
# -- `[Optional]` Specifies the tolerations for nodes that have taints on them.
# @see: <https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/>
tolerations: []
# Secrets ConfigMap. Required for scanning secrets.
secretsConfig:
# -- `[Optional]` Name of the ConfigMap used for secrets configuration.
name:
# Additional volumes to attach to scanner container.
extraVolumes:
volumes: []
mounts: []
securityContext:
# -- `[Optional]` Security Context for the scan job. Required to be
# privileged for compatibility with some version of k8s. A slightly more
# restrictive configuration that will work on most k8s versions would be:
# capabilities:
# add:
# - SYS_ADMIN
# runAsUser: 0
# appArmorProfile:
# type: Unconfined
privileged: true
# -- `[Optional]` Specifies the pod scheduling preference.
#
# Note: The Image Scan Jobs are applied additional node affinities
# to facilitate assignment to the nodes having target image locally.
#
# @see: <https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity>
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
- key: kubernetes.io/arch
operator: In
values:
- amd64
- arm64
serviceAccount:
create: false
openshift:
scc:
seccompProfiles:
- '*'
# Configure the horizontal pod autoscaler HPA
autoscaling:
# -- Set to true to enable the Horizontal Pod Autoscaler (HPA).
enabled: false
# -- Minimum number of pod replicas to always keep running.
minReplicas: 1
# -- Maximum number of pod replicas HPA can scale up to.
maxReplicas: 5
# -- Average CPU utilization across pods (as % of requests) before scaling.
targetCPUUtilizationPercentage: 80
# -- `[Optional]` Average memory utilization across pods (as % of requests) before scaling.
targetMemoryUtilizationPercentage:
# -- `[Optional]` Scaling policy to scale up Cluster Manager.
scaleUp: {}
# -- `[Optional]` Scaling policy to scale down Cluster Manager.
scaleDown:
# -- `[Optional]` The number of seconds for which past recommendations should be considered.
stabilizationWindowSeconds: 300
# Enable the following when it graduates from alpha.
# -- `[Optional]` Tolerance on the ratio between the current and desired metric value under which no updates are made.
# tolerance: 0.15
# -- `[Optional]` Specifies which policy should be used.
selectPolicy: Max
# -- `[Optional]` List of potential scaling polices which can be used during scaling.
policies:
# -- Specifies the scaling policy type.
- type: Percent
# -- The amount of change which is permitted by the policy.
value: 50
# -- Specifies the window of time for which the policy should hold true.
periodSeconds: 60
clusterRole:
# -- Enables permissions to read all resources.
enableCustomResources: true
# -- `[Optional]` Configuration settings for Kubernetes providers.
providers:
# -- `[Optional]` Configuration for Google Kubernetes Engine (GKE).
gke:
autopilot:
# -- `[Required]` Specifies whether to enable GKE Autopilot mode: shapes
# the image scan job to match the published GKE Autopilot allowlist.
# Requires a Cluster Manager and agent with UPWIND_SCAN_MODE support.
enabled: false
# -- `[Optional]` Specifies the name of the GKE Autopilot allowlist the
# scan job pod is matched against.
allowlist: upwind-agent-allowlist-v0.3.0
# -- `[Optional]` Overrides application name.
nameOverride: ""
# -- `[Optional]` Overrides the full qualified application name.
fullnameOverride: ""
# -- `[Optional]` Custom labels to add to all resources created by this chart.
extraLabels: {}
# -- Specifies the image registry.
registry: registry.upwind.io
# -- `[Optional]` Specifies the image pull policy.
imagePullPolicy: IfNotPresent
# -- `[Optional]` Specifies the image pull secrets.
imagePullSecrets:
- name: upwind-secrets-registry-credentials
image:
# -- Specifies the image name and path for the core agent image.
repository: images/agent
# -- Specifies the image tag for the core agent image. Defaults to
# .Chart.appVersion.
tag:
# -- `[Optional]` Specifies the region of the Upwind Endpoints. Defaults to `us`
region:
agent:
bcc:
# -- Whether to enable the agent BCC version
enabled: false
# -- Run in Host's PID Namespace.
# Access to procfs is required, if set to false `/proc` will be mounted as readOnly at `/mnt/proc`
hostPID: true
# -- `[Optional]` Specifies any additional arguments for the container.
# @see: <https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/>
extraArgs: []
# -- `[Optional]` Additional environment variables added to the container.
env: []
# -- `[Optional]` Specifies the resource requests and limits.
# @see: <https://kubernetes.io/docs/user-guide/compute-resources/>
resources:
limits:
cpu: 500m
memory: 1000Mi
requests:
cpu: 50m
memory: 100Mi
# -- `[Optional]` Specifies configuration for prometheus
metrics:
enabled: false
port: "59090"
config:
connCache:
# -- Connection cache size. Default is 30000. Should be set to roughly the
# number of connections that a node will have open over the course of a reporting
# interval (1 minute).
size:
# -- Connection cache expiration. Defaults to 300s (5 minutes). Should be set to the maximum
# expected idle time of a connection.
expiry:
connTrackCache:
# -- Conntrack cache size. Default is 30000. Should be set to roughly the
# number of connections that a node will have open over the course of a reporting
# interval (1 minute).
size:
# -- Conntrack cache expiration. Defaults to 300s (5 minutes). Should be set to the maximum
# expected idle time of a connection.
expiry:
# -- Log level for the agent container. Default is INFO.
logLevel:
scanAgent:
# -- Whether to enable the scanning agent container.
enabled: true
# -- Whether the scanning agent should as a sidecar in the Sensor/Agent DaemonSet (true) or
# as it's own DaemonSet (false).
sidecar: true
# -- Run in Host's Network Namespace.
# When not running as a sidecar we default to running in the Hosts's network namespace, same as the Agent.
# This is for not using an IP address per node from the cluster's Pod CIDR and also
# for easier IMDS access in case of hop-limits.
hostNetwork: true
# -- `[Optional]` Specifies any additional arguments for the container.
# @see: <https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/>
extraArgs: []
# -- `[Optional]` Additional environment variables added to the container.
env: []
# -- `[Optional]` Specifies the resource requests and limits.
# @see: <http://kubernetes.io/docs/user-guide/compute-resources/>
resources:
limits:
cpu: 500m
memory: 800Mi
requests:
cpu: 50m
memory: 50Mi
# -- `[Optional]` Specifies configuration for prometheus
metrics:
enabled: false
port: "59091"
config:
# -- Log level for the scan agent container. Default is INFO.
logLevel:
# -- Maximum image size to scan in bytes. Default is "524288000" (500 MB).
# Setting this lower can reduce maximum memory usage, setting it higher
# allows the scan agent to scan larger images. Must be a quoted string to
# avoid templating issues.
maxImageSize:
# -- This adds proxy configuration for outbound http/https traffic from the sensor
proxy:
enabled: false
httpProxy: ""
httpsProxy: ""
noProxy: ""
# Service account.
# @see: <https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/>
serviceAccount:
# -- `[Optional]` Specifies whether a Service Account should be created.
# Even if create is set to false it will set up the DameonSet using a service account by name, which
# should then be provided. For provided Service Account their name can be set using `name:`
create: true
# -- `[Optional]` Specifies the annotations for the Service Account.
annotations: {}
# -- `[Optional]` Specifies the name of the Service Account. Defaults to fully qualified application name.
name:
# -- `[Optional]` Specifies the DaemonSet annotations.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>
annotations: {}
# -- `[Deprecated]` Use `extraLabels` instead, which applies to all resources.
# Adds labels to the DaemonSet metadata only.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/>
labels: {}
# -- `[Optional]` Specifies the Pod annotations.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>
podAnnotations: {}
# -- `[Optional]` Specifies the Pod labels.
# @see: <https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/>
podLabels: {}
# -- `[Optional]` Specifies the name of the DaemonSet. Defaults to fully
# qualified application name.
# @see: <https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy>
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: "10%"
# -- `[Optional]` Specifies the container security context.
# @see: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container>
containerSecurityContext:
privileged: true
# Specifies the priority class to indicate the importance of controller pods.
# @see: <https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass>
priorityClass:
# -- `[Optional]` Specifies whether a Priority Class should be created.
create: true
# -- `[Optional]` Specifies the annotations for the Priority Class.
annotations: {}
# -- `[Optional]` Specifies the value of the Priority Class that should be created.
value: 1000000
# -- `[Optional]` Specifies the name of the priorityClass. Defaults to fully qualified application name.
# If create is set to false and name is set it will set a priorityClass with that name and assume it already exists.
name:
# -- `[Optional]` Specifies the node selector.
# @see: <https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/>
nodeSelector: {}
# -- `[Optional]` Specifies the tolerations for nodes that have taints on them.
# @see: <https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/>
tolerations:
- operator: Exists
# -- `[Optional]` Specifies the DNS policy for the pod. Defaults to "ClusterFirstWithHostNet"
# since the agent runs with hostNetwork. Valid values are 'ClusterFirstWithHostNet',
# 'ClusterFirst', 'Default' or 'None'.
# @see: <https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy>
dnsPolicy: ""
# -- `[Optional]` Specifies custom DNS configuration for the pod.
# Useful for overriding ndots, search domains, etc.
# @see: <https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-dns-config>
dnsConfig: {}
# -- Specifies the Pod scheduling preferences.
# If unset, defaults to:
# nodeAffinity:
# requiredDuringSchedulingIgnoredDuringExecution:
# nodeSelectorTerms:
# - matchExpressions:
# - key: kubernetes.io/os
# operator: In
# values:
# - linux
# - key: kubernetes.io/arch
# operator: In
# values:
# - amd64
# - arm64
# - key: eks.amazonaws.com/compute-type
# operator: NotIn
# values:
# - "fargate"
# If set to a custom value, it is recommended to keep the kubernetes.io/os and kubernetes.io/arch
# matchExpressions.
# @see: <https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity>
affinity:
# -- `[Optional]` Specifies any common additional arguments for the containers.
# @see: <https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/>
extraArgs: []
# -- `[Optional]` Additional common environment variables added to the agent container.
env: []
# Upwind Credentials.
credentials:
# -- `[Optional]` Specifies whether a Secret should be created. If true, clientId and
# clientSecret must be provided.
create: false
# -- `[Optional]` Specifies the name of the Secret that holds the OAuth 2.0 Access Token OR
# the provided clientId and clientSecret.
secretName: upwind-secrets-agent-credentials
# -- `[Optional]` Specifies the application's Client ID.
clientId:
# -- `[Optional]` Specifies the application's Client Secret.
clientSecret:
# -- `[Optional]` Specifies annotations for the Credentials Secret
annotations: {}
# -- `[Optional]` Specifies the application's Authentication endpoint.
endpoint:
tls:
# Cert manager
certManager:
# -- `[Optional]` Whether to enable cert manager.
enabled: false
issuerRef:
# -- `[Required if certManager.enabled = true]` Specifies the name of the certificate issuer.
name: ""
# -- `[Optional]` Specifies the kind of the issuer. Can be either Issuer or ClusterIssuer.
kind: ClusterIssuer
# -- `[Optional]` Specifies the group of the issuer.
group: cert-manager.io
# SSL certificates
certificates:
# -- `[Optional]` Whether to mount SSL certificates in the sensor.
enabled: false
# -- `[Optional]` Specifies the name of the Secret that holds the SSL certificate and private key
# of the sensor used for setting up TLS with the cluster manager.
secretName: upwind-secrets-agent-certs
# CA
ca:
# -- `[Optional]` Whether to mount CA certificates in the sensor.
enabled: false
# -- `[Optional]` Specifies the name of the config map that holds the peer CA certificate.
configMapName: upwind-config-agent-peer-ca-certs
gvisor:
# -- Whether to enable gVisor integration.
enabled: false
# -- `[Optional]` Specifies the path on the host to the gVisor root.
root: /run/containerd/runsc/k8s.io/
# -- `[Optional]` Specifies the path on the host to the gVisor socket.
traceUdsPath: /var/lib/containerd/gvisor_events.sock
# -- `[Optional]` Specifies the path on the host to the gVisor trace config.
traceConfig: /etc/gvisor/gvisor_default_session.json
# -- `[Optional]` Specifies the port for the gVisor remote tracing.
remoteTracePort: -1
# containerd integration. Required to enable image scanning.
# Only the socket's parent directory is mounted (with the hostPath type left
# unset), so this can be enabled alongside `crio` on heterogeneous clusters
# (nodes with different runtimes) without wedging pods on nodes that do not run
# containerd. The agent detects the live runtime at runtime.
containerd:
# -- Whether to enable integration with containerd.
enabled: true
# -- `[Optiona]` Specifies the path on the host to the containerd socket. Only
# the socket's parent directory is mounted; the filename is resolved inside
# the container.
address: /var/run/containerd/containerd.sock
# -- `[Optional]` Specifies the root directory for containerd metadata
root: /var/lib/containerd
# docker integration. Required for image scanning on k8s 1.22
docker:
# -- Whether to enable integration with docker.
enabled: true
# -- `[Optional]` Specifies the root directory for docker metadata
root: /var/lib/docker
# Config Secret. Required for dynamic feature flagging.
configSecret:
# -- Whether to optionally mount a Secret for feature flagging.
enabled: true
# -- YAML agent configuration, if create is true this will be the value
# of the secret.
config: ""
# -- `[Optional]` Name of the secret used for feature flagging.
name:
# Analysis ConfigMap.
analysisConfig:
# -- `[Optional]` Name of the ConfigMap used for analysis configuration.
name:
# Response ConfigMap.
responseConfig:
# -- `[Optional]` Name of the ConfigMap used for response configuration.
name:
# Secrets ConfigMap.
secretsConfig:
# -- `[Optional]` Name of the ConfigMap used for secrets configuration.
name:
# Process Events ConfigMap.
eventsConfig:
# -- `[Optional]` Name of the ConfigMap used for process events configuration.
name:
debug:
enabled: false
agent:
port: 44444
scanner:
port: 44443
scanHost:
# -- Whether to enable the CronJob to scan the node filesystem.
enabled: false
# -- Schedule for running the CronJob.
schedule: 38 * * * *
# -- `[Optional]` Specifies any additional arguments for the container.
extraArgs: []
# -- `[Optional]` Specifies any additional labels for the host scan cron job.
extraLabels: {}
# -- `[Optional]` Additional environment variables added to the container.
env: []
# -- `[Optional]` Additional path exclusions for the host scan job. Must be
# comma-separated string. Some care is required when using this parameter,
# contact <support@upwind.io> for guidance.
additionalExcludes: ""
# -- `[Optional]` Enable scanning /mnt
disableMntScan: true
# Specifies the priority class to indicate the importance of controller pods.
# @see: <https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass>
priorityClass:
# -- `[Optional]` Specifies whether a Priority Class should be created.
# REQUIRES upwind-operator chart >= 0.6.6 to be enabled
create: false
# -- `[Optional]` Specifies the annotations for the Priority Class.
annotations: {}
# -- `[Optional]` Specifies the value of the Priority Class that should be created.
value: 1000000
# -- `[Optional]` Specifies the name of the priorityClass.
# If create is set to false and name is set it will set a priorityClass with that name and assume it already exists.
name:
# -- `[Optional]` Specifies the node selector.
# @see: <https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/>
nodeSelector: {}
# -- `[Optional]` Specifies the tolerations for nodes that have taints on them.
# @see: <https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/>
tolerations:
- operator: Exists
# -- Specifies the Pod scheduling preferences.
# @see: <https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity>
affinity: {}
# -- `[Optional]` Specifies the resource requests and limits.
resources:
limits:
cpu: 500m
memory: 1000Mi
requests:
cpu: 50m
memory: 250Mi
otelCollector:
enabled: false
port: 4317
networkAggregation:
enabled: true
# -- Define the Cluster Agent service name/port if it is not deployed using it's default name/port.
clusterAgentService:
# -- `[Optional]` Specifies the Cluster Agent service name. Defaults to "upwind-cluster-agent"
name:
# -- `[Optional]` Specifies the Cluster Agent service port. Defaults to 8080
port:
podSecurityPolicy:
# -- Whether to create a PodSecurityPolicy and Role/RoleBinding for the agent.
enabled: false
byoc:
# -- The Account ID to use for clusters in on-premise data centers. ("bring-your-own-cloud")
accountID:
zone:
podMonitor:
# -- Enables a Prometheus PodMonitor for the Agent pods.
enabled: false
# -- Configures the scrape interval for the PodMonitor
interval:
# -- Configures the scrape timeout for the PodMonitor
scrapeTimeout:
# -- Relabeling config for the PodMonitor
relabelings: []
# CRI-O integration. Enabled by default: only the socket's parent directory is
# mounted (with the hostPath type left unset), so this coexists with
# `containerd` on heterogeneous clusters without wedging pods on nodes that do
# not run CRI-O.
crio:
# -- Enables CRI-O integration.
enabled: true
# -- Path to CRI-O socket. Only the socket's parent directory is mounted; the
# filename is resolved inside the container.
address: /var/run/crio/crio.sock
# -- Path to CRI-O containers directory
root: /var/lib/containers
readinessProbe:
# -- Enables readiness probe
enabled: false
# -- Readiness probe type [cmd, http]
type: cmd
# -- Readiness probe HTTP port, applicable iff probeType is `http`. With
# `agent.hostNetwork: true` (the default) this binds on the node, so the port
# must be free on every node.
port: 44445
# -- `[Optional]` Seconds to wait after container start before probing.
initialDelaySeconds: 10
# -- `[Optional]` How often to probe.
periodSeconds: 5
# -- `[Optional]` Seconds after which a probe times out.
timeoutSeconds: 5
# -- `[Optional]` Consecutive successes required to be considered ready.
successThreshold: 1
# -- `[Optional]` Consecutive failures required to be considered not ready.
failureThreshold: 5
# -- `[Optional]` Liveness probe configuration. The liveness probe reuses
# `readinessProbe.type` and `readinessProbe.port` -- the sensor exposes a single
# health listener, so the transport cannot differ between the two probes. Only
# the thresholds below are independent. Note this means you must set
# `readinessProbe.type: http` (and a port) even when enabling *only* the
# liveness probe, otherwise the `cmd` (exec) probe is used.
livenessProbe:
# -- Enables liveness probe.
enabled: false
# -- `[Optional]` Seconds to wait after container start before probing.
initialDelaySeconds: 10
# -- `[Optional]` How often to probe.
periodSeconds: 5
# -- `[Optional]` Seconds after which a probe times out.
timeoutSeconds: 5
# -- `[Optional]` Consecutive failures required before the container is
# restarted.
failureThreshold: 5
# -- `[Optional]` Configuration settings for Kubernetes providers.
providers:
# -- `[Optional]` Configuration for Google Kubernetes Engine (GKE).
gke:
autopilot:
# -- `[Required]` Specifies whether to enable GKE Autopilot mode.
enabled: false
# -- `[Optional]` Specifies the name of the GKE Autopilot allowlist.
allowlist: upwind-agent-allowlist-v0.3.0
# -- `[Optional]` Configuration for Amazon Elastic Kubernetes Service (EKS).
eks: {} # Placeholder for EKS-specific configurations.
# -- `[Optional]` Configuration for Azure Kubernetes Service (AKS).
aks: {} # Placeholder for AKS-specific configurations.
# Additional volumes to attach.
extraVolumes:
volumes: []
sensorMounts: []
scannerMounts: []