Chapter 24. Network Observer Configuration Reference


The following configuration options are for the Skupper Network Observer which enables the network console.

24.1. External access

24.1.1. Ingress

Expand
PathTypeDefaultDescription

ingress.enabled

bool

false

Enable Kubernetes Ingress resource

ingress.className

string

""

IngressClass name (e.g., nginx, traefik)

ingress.annotations

map

{}

Annotations for Ingress resource

ingress.hosts

array

[]

Host configurations

ingress.hosts[].host

string

-

Hostname

ingress.hosts[].paths

array

-

Path configurations

ingress.hosts[].paths[].path

string

-

URL path

ingress.hosts[].paths[].pathType

string

-

Prefix, Exact, or ImplementationSpecific

ingress.tls

array

[]

TLS configurations

ingress.tls[].secretName

string

-

TLS certificate Secret name

ingress.tls[].hosts

array

-

Hostnames for this certificate

Notes:

  • Backend always uses HTTPS (re-encryption required)
  • Controller must support TLS backend

24.1.2. Route (OpenShift)

Expand
PathTypeDefaultDescription

route.enabled

bool

false

Enable OpenShift Route resource

route.host

string

""

Explicit hostname

route.subdomain

string

""

Subdomain for automatic FQDN

route.annotations

map

{}

Route annotations

route.labels

map

{}

Route labels

Notes:

  • Automatically uses reencrypt TLS termination
  • Use host OR subdomain, not both
  • OpenShift only

24.2. Authentication

Expand
PathTypeDefaultDescription

auth.strategy

string

"basic"

Authentication strategy: basic, openshift, none

24.2.1. Basic Authentication

Expand
PathTypeDefaultDescription

auth.basic.create

bool

true

Auto-generate htpasswd Secret with random password

auth.basic.secretName

string

""

Existing htpasswd Secret name (requires htpasswd key)

Generated credentials:

  • Username: skupper
  • Password: Random 16-character string (stored in Secret)

24.2.2. OpenShift OAuth

Expand
PathTypeDefaultDescription

auth.openshift.createCookieSecret

bool

true

Auto-generate session cookie secret

auth.openshift.cookieSecretName

string

""

Existing cookie Secret name

auth.openshift.serviceAccount.create

bool

true

Create ServiceAccount for OAuth

auth.openshift.serviceAccount.nameOverride

string

""

Custom ServiceAccount name

Requirements:

  • OpenShift cluster
  • RBAC permissions for delegated authentication

24.3. TLS Certificates

Expand
PathTypeDefaultDescription

tls.skupperIssued

bool

true

Use Skupper controller CA (default)

tls.openshiftIssued

bool

false

Use OpenShift Service CA

tls.secretName

string

""

Existing TLS Secret name

Priority: secretName > openshiftIssued > skupperIssued

Methods:

  • Skupper-issued: Auto-provisioned by controller, uses same CA as inter-site links
  • OpenShift Service CA: Platform-issued, automatic rotation
  • External: Manual management, Secret type kubernetes.io/tls

24.4. Router Connection

Expand
PathTypeDefaultDescription

router.endpoint

string

"amqps://skupper-router-local"

AMQP endpoint URL

router.certificate.create

bool

true

Auto-create client certificate

router.certificate.nameOverride

string

""

Custom certificate name

Notes:

  • Endpoint must use amqps:// scheme
  • Client certificate provisioned by Skupper controller
  • Certificate mounted at /etc/messaging/

24.5. Network Observer Tuning

Expand
PathTypeDefaultDescription

extraArgs

array

[]

Command-line flags for observer container

Available flags:

Expand
FlagTypeDefaultDescription

-enable-console

bool

true

Enable web console UI

-flow-record-ttl

duration

15m

Flow record retention time

-cors-allow-all

bool

false

Allow all CORS origins (dev only)

-vanflow-logging-profile

string

silent

Vanflow logging: silent, minimal, moderate, all

Example:

extraArgs:
  - -flow-record-ttl=1h
  - -vanflow-logging-profile=minimal

24.6. Prometheus Configuration

The Prometheus container supports custom configuration and tuning options.

24.6.1. Configuration File

Expand
PathTypeDefaultDescription

prometheus.config

string

embedded

Complete prometheus.yml content

Default scrape config:

scrape_configs:
  - job_name: 'network-observer'
    static_configs:
      - targets: ['localhost:8080']

24.6.2. Command-Line Flags

Expand
PathTypeDefaultDescription

prometheus.extraArgs

array

[]

Additional Prometheus flags

Common flags:

  • --storage.tsdb.retention.time=<duration>
  • --storage.tsdb.retention.size=<bytes>
  • --query.max-samples=<int>

Example:

prometheus:
  extraArgs:
    - --storage.tsdb.retention.time=15d
    - --storage.tsdb.retention.size=10GB

24.6.3. Extra Volumes and Mounts

Expand
PathTypeDefaultDescription

prometheus.extraVolumes

array

[]

Additional volumes (Kubernetes volume spec)

prometheus.extraVolumeMounts

array

[]

Volume mount points (Kubernetes volumeMount spec)

Example:

prometheus:
  extraVolumes:
    - name: extra-config
      configMap:
        name: prometheus-rules
  extraVolumeMounts:
    - name: extra-config
      mountPath: /etc/prometheus/rules

24.7. Data Persistence

By default, Prometheus uses ephemeral storage (emptyDir). For persistent time-series data, enable a PersistentVolumeClaim.

24.7.1. Persistence Options

Expand
PathTypeDefaultDescription

prometheus.persistence.enabled

bool

false

Enable persistent storage

prometheus.persistence.storageClass

string

""

StorageClass name (empty = default)

prometheus.persistence.size

string

8Gi

PVC size

prometheus.persistence.accessModes

array

["ReadWriteOnce"]

PVC access modes

Behavior:

  • Disabled: Uses emptyDir (ephemeral)
  • Enabled: Creates PVC, uses Recreate deployment strategy

Prerequisites

  • A StorageClass that can provision PersistentVolumes, or a default StorageClass configured in your cluster

Procedure

  1. Configure persistence in your values file:

    prometheus:
      persistence:
        enabled: true
        storageClass: ""   # Use default StorageClass
        size: 8Gi
        accessModes:
          - ReadWriteOnce
  2. Install or upgrade the chart with your values:

    helm upgrade --install skupper-network-observer oci://quay.io/skupper/helm/network-observer --version {{skupper_cli_version}} -f values.yaml
  3. Verify the PersistentVolumeClaim is bound:

    kubectl get pvc

    Example output:

    NAME                                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    skupper-network-observer-prometheus-0   Bound    pvc-a1b2c3d4-e5f6-7890-abcd-ef1234567890   8Gi        RWO            standard       2m
Important

When persistence is enabled, the Deployment uses a Recreate update strategy to ensure the single read-write volume can attach cleanly during pod updates.

24.8. Container Resources

Resource requests and limits can be configured for each container in the Pod.

24.8.1. Network Observer Container

Expand
PathTypeDefaultDescription

containerResources.networkObserver.requests.cpu

string

-

CPU request

containerResources.networkObserver.requests.memory

string

-

Memory request

containerResources.networkObserver.limits.cpu

string

-

CPU limit

containerResources.networkObserver.limits.memory

string

-

Memory limit

24.8.2. Prometheus Container

Expand
PathTypeDefaultDescription

containerResources.prometheus.requests.cpu

string

-

CPU request

containerResources.prometheus.requests.memory

string

-

Memory request

containerResources.prometheus.limits.cpu

string

-

CPU limit

containerResources.prometheus.limits.memory

string

-

Memory limit

24.8.3. Proxy Container

Expand
PathTypeDefaultDescription

containerResources.proxy.requests.cpu

string

-

CPU request

containerResources.proxy.requests.memory

string

-

Memory request

containerResources.proxy.limits.cpu

string

-

CPU limit

containerResources.proxy.limits.memory

string

-

Memory limit

Example:

containerResources:
  networkObserver:
    requests:
      cpu: 200m
      memory: 512Mi
    limits:
      cpu: 1000m
      memory: 1Gi
  prometheus:
    requests:
      cpu: 500m
      memory: 1Gi
    limits:
      cpu: 2000m
      memory: 4Gi
  proxy:
    requests:
      cpu: 50m
      memory: 64Mi
    limits:
      cpu: 200m
      memory: 256Mi

24.9. Container Images

24.9.1. Network Observer Image

Expand
PathTypeDefaultDescription

image.repository

string

quay.io/skupper/network-observer

Image repository

image.tag

string

chart appVersion

Image tag

image.pullPolicy

string

Always

Pull policy

24.9.2. Prometheus Image

Expand
PathTypeDefaultDescription

prometheus.repository

string

quay.io/prometheus/prometheus

Image repository

prometheus.tag

string

v3.11.3

Image tag

prometheus.pullPolicy

string

IfNotPresent

Pull policy

24.9.3. NGINX Proxy Image

Used when auth.strategy is basic or none:

Expand
PathTypeDefaultDescription

nginx.repository

string

mirror.gcr.io/nginxinc/nginx-unprivileged

Image repository

nginx.tag

string

1.31.0-alpine

Image tag

nginx.pullPolicy

string

IfNotPresent

Pull policy

nginx.command

array

[]

Override default command

24.9.4. OpenShift OAuth Proxy Image

Used when auth.strategy is openshift:

Expand
PathTypeDefaultDescription

openshiftOauthProxy.repository

string

quay.io/openshift/origin-oauth-proxy

Image repository

openshiftOauthProxy.tag

string

4.22.0

Image tag

openshiftOauthProxy.pullPolicy

string

IfNotPresent

Pull policy

24.10. Labels and Annotations

Expand
PathTypeDefaultDescription

commonLabels

map

{}

Labels on all resources

commonAnnotations

map

{}

Annotations on all resources

podLabels

map

{}

Labels on Pod resources only

podAnnotations

map

{}

Annotations on Pod resources only

Standard labels (always present):

  • app.kubernetes.io/name: network-observer
  • app.kubernetes.io/instance: <name>
  • app.kubernetes.io/version: <version>
  • app.kubernetes.io/managed-by: Helm or network-observer-operator

Example:

commonLabels:
  environment: production
  team: platform-engineering
  cost-center: "12345"

commonAnnotations:
  owner: "platform-team@company.com"
  docs: "https://wiki.company.com/network-observer"

podLabels:
  app.kubernetes.io/tier: monitoring

podAnnotations:
  prometheus.io/scrape: "false"

24.11. Service

Expand
PathTypeDefaultDescription

service.type

string

ClusterIP

Service type: ClusterIP, LoadBalancer, NodePort

service.port

int

443

External port

Notes:

  • targetPort always https (8443)
  • Metrics service always ClusterIP on port 9000

24.12. Security

24.12.1. Pod Security Context

Expand
PathTypeDefaultDescription

podSecurityContext.seccompProfile.type

string

RuntimeDefault

Seccomp profile

24.12.2. Container Security Contexts

Available for: securityContext, prometheus.securityContext, nginx.securityContext, openshiftOauthProxy.securityContext

Expand
PathTypeDefaultDescription

.allowPrivilegeEscalation

bool

false

Allow privilege escalation

.capabilities.drop

array

["ALL"]

Capabilities to drop

24.13. Advanced Options

24.13.1. Name Overrides

Expand
PathTypeDefaultDescription

nameOverride

string

""

Override chart name

fullnameOverride

string

""

Override full resource name

24.13.2. Skip Management Labels

Expand
PathTypeDefaultDescription

skipManagementLabels

bool

false

Skip Skupper management labels

24.14. Metrics Endpoint

The Network Observer serves Prometheus metrics on a dedicated HTTP listener, separate from the main API endpoint.

Listener Configuration:

  • Address: :9000 (container-wide)
  • Path: /metrics
  • Protocol: HTTP (no TLS/auth)

Service:

  • Name: <name>-metrics
  • Type: ClusterIP
  • Port: 9000 9000

Security: Cluster-internal only. Do not expose publicly.

24.14.1. Metrics Service

The chart creates a second ClusterIP Service named <release-name>-metrics that targets the metrics listener on port 9000.

Expand
PropertyValue

Listener address

:9000

Service name

<release-name>-metrics

Service port

9000

Metrics path

/metrics

24.14.2. Scraping Metrics

Configure your Prometheus instance or monitoring operator to scrape the metrics endpoint.

ServiceMonitor example (Prometheus Operator):

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: skupper-network-observer
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: network-observer
  endpoints:
    - port: metrics
      path: /metrics

Static scrape configuration:

scrape_configs:
  - job_name: 'network-observer'
    static_configs:
      - targets: ['skupper-network-observer-metrics.default.svc:9000']

Security note: The metrics Service is ClusterIP by default and does not include the TLS proxy or authentication that protects the main console endpoint. Do not expose this Service publicly without additional access controls if your metrics contain sensitive data.

24.15. Validation and Troubleshooting

24.15.1. Verify Services

Check that both Services are created:

kubectl get svc -l app.kubernetes.io/name=network-observer

Example output:

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
skupper-network-observer          ClusterIP   10.96.123.45    <none>        443/TCP    5m
skupper-network-observer-metrics  ClusterIP   10.96.123.46    <none>        9000/TCP   5m

24.15.2. Test Metrics Endpoint

From a pod in the same namespace:

kubectl run -it --rm curl --image=curlimages/curl --restart=Never -- curl -sS http://skupper-network-observer-metrics:9000/metrics

Example output:

# HELP skupper_network_observer_info Network Observer build information
# TYPE skupper_network_observer_info gauge
skupper_network_observer_info{version="2.2.0"} 1
...

24.15.3. Check Observer Logs

Look for the metrics listener startup message:

kubectl logs deployment/skupper-network-observer -c network-observer

Example output:

2025/03/15 10:23:45 Starting metrics server on :9000
2025/03/15 10:23:45 Starting API server on 127.0.0.1:8080

24.15.4. Verify Prometheus Configuration

If the embedded Prometheus shows no data, check the ConfigMap:

kubectl get configmap skupper-network-observer-prometheus-config -o yaml

Ensure the prometheus.yml content is valid and the scrape target matches the observer’s API listener (localhost:8080).

24.15.5. PersistentVolumeClaim Issues

If the pod remains in Pending state with persistence enabled:

kubectl describe pvc skupper-network-observer-prometheus-0

Look for events indicating StorageClass issues, volume provisioning failures, or capacity constraints.

Red Hat logoGithubredditYoutubeTwitter

Learn

Try, buy, & sell

Communities

About Red Hat

We deliver hardened solutions that make it easier for enterprises to work across platforms and environments, from the core datacenter to the network edge.

Making open source more inclusive

Red Hat is committed to replacing problematic language in our code, documentation, and web properties. For more details, see the Red Hat Blog.

About Red Hat Documentation

Legal Notice

Theme

© 2026 Red Hat
Back to top