Service Mesh Architecture
PiVirt implements a lightweight, secure service mesh using ConnectRPC, embedded discovery, and PiTrust PKI for authenticated, zero-trust inter-service communication.
Architecture
Section titled “Architecture”flowchart TD
subgraph Mesh["Service Mesh Architecture"]
subgraph CP["Control Plane"]
pitrust["PiTrust CA (Identity & PKI)"]
etcd["etcd (Discovery)"]
config["Config Manager (Distribution)"]
end
subgraph DP["Data Plane"]
subgraph pivirtd_node["pivirtd"]
pproxy["Hypervisor Server (:9001)"]
end
subgraph agent_node["agent"]
aproxy["Agent ConnectRPC (:8443)"]
end
subgraph iscsiman_node["iscsiman"]
iproxy["Storage Manager (:9002)"]
end
end
CP -->|mTLS| DP
end
Components
Section titled “Components”PiTrust CA Server
Section titled “PiTrust CA Server”Manages service identities and issues X.509 certificates (Root CA -> X1 Intermediate CA).
# PiTrust CA Server configurationserver: addr: "0.0.0.0:8080" certs_dir: "/etc/pitrust/certs" db_path: "/var/lib/pitrust/certs.db"PiTrust Kubernetes Operator
Section titled “PiTrust Kubernetes Operator”Runs in cluster and automatically reconciles ManagedCertificate CRDs into TLS Secrets.
apiVersion: certz.pilab.hu/v1alpha1kind: ManagedCertificatemetadata: name: agent-tls namespace: pivirt-systemspec: commonName: agent.pivirt.svc.cluster.local type: mtls-server secretName: agent-tls-secret duration: "8760h"Direct mTLS Termination
Section titled “Direct mTLS Termination”Each service terminates ConnectRPC / gRPC TLS directly:
- mTLS termination: Encrypts and authenticates all traffic
- Service discovery: Routes to correct endpoints via etcd
- Load balancing: Distributes traffic across nodes
- Observability: Prometheus metrics, OpenTelemetry tracing, structured logging
Identity Model
Section titled “Identity Model”Service Identifiers (SANs)
Section titled “Service Identifiers (SANs)”PiTrust X.509 certificates encode daemon DNS and IP SANs:
pivirtd.pivirt.internal/node-01.pivirt.internalagent.pivirt.internal/director.pivirt.internaliscsiman.pivirt.internal
Certificate Issuance
Section titled “Certificate Issuance”# Issue mTLS server certificate for pivirtdpitrust issue-mtls-server \ --name "pivirtd.pivirt.internal" \ --dns "pivirtd.pivirt.internal" \ --dns "node-01" \ --days 365mTLS Configuration
Section titled “mTLS Configuration”Server Configuration
Section titled “Server Configuration”# pivirtd configserver: grpc_addr: "0.0.0.0:9001" tls: enabled: true cert_file: "/etc/pivirtd/tls/server.crt" key_file: "/etc/pivirtd/tls/server.key" ca_file: "/etc/pivirtd/tls/ca.crt" client_ca_file: "/etc/pivirtd/tls/ca.crt" # Require client certsClient Configuration
Section titled “Client Configuration”# agent configbackends: pivirtd: endpoint: "pivirtd:9001" tls: enabled: true cert_file: "/etc/pivirt-agent/tls/client.crt" key_file: "/etc/pivirt-agent/tls/client.key" ca_file: "/etc/pivirt-agent/tls/ca.crt" server_name: "pivirtd.pilab.hu"Traffic Management
Section titled “Traffic Management”Routing
Section titled “Routing”# agent configrouting: rules: - match: prefix: "/pivirt.vm.v1.VMService" route: cluster: "pivirtd" - match: prefix: "/pivirt.storage.v1.StorageService" route: cluster: "iscsiman"Load Balancing
Section titled “Load Balancing”# agent configload_balancing: policy: "round_robin" # round_robin, least_connections, random health_check: enabled: true interval: "10s" timeout: "5s"Circuit Breaking
Section titled “Circuit Breaking”# agent configcircuit_breaking: enabled: true thresholds: consecutive_5xx: 5 interval: "10s" base_ejection_time: "30s" max_ejection_percent: 50Observability
Section titled “Observability”Metrics
Section titled “Metrics”# View mesh metricscurl http://localhost:8444/metrics | grep mesh
# Key metrics:# pivirt_mesh_requests_total{service="pivirtd",status="200"} 1000# pivirt_mesh_request_duration_seconds{service="pivirtd",quantile="0.99"} 0.05# pivirt_mesh_active_connections{service="pivirtd"} 42Tracing
Section titled “Tracing”# agent configtracing: enabled: true exporter: "jaeger" endpoint: "http://jaeger.pilab.hu:14268/api/traces" sampling_rate: 0.1Logging
Section titled “Logging”# agent configlogging: level: "info" format: "json" output: "stdout" access_log: enabled: true format: "json"Security Policies
Section titled “Security Policies”Authorization
Section titled “Authorization”# RBAC policyapiVersion: rbac.pivirt.pilab.hu/v1kind: Policyrules: - roles: ["admin"] resources: ["*"] verbs: ["*"]
- roles: ["operator"] resources: ["virtualmachines", "volumes"] verbs: ["get", "list", "create", "update"]
- roles: ["viewer"] resources: ["*"] verbs: ["get", "list"]Network Policies
Section titled “Network Policies”# Network policyapiVersion: pivirt.pilab.hu/v1kind: NetworkPolicymetadata: name: allow-agent-to-pivirtdspec: ingress: - from: - service: "agent.pivirt.internal" to: - service: "pivirtd.pivirt.internal" ports: - protocol: TCP port: 9001Certificate Rotation
Section titled “Certificate Rotation”Automated Rotation via Operator
Section titled “Automated Rotation via Operator”PiTrust Operator watches ManagedCertificate resources and automatically regenerates and rotates Kubernetes TLS Secrets 30 days before expiration without downtime.
Manual Rotation
Section titled “Manual Rotation”# Force certificate reissue via CLIpitrust issue-mtls-server --name "node-01.pivirt.internal" --days 365
# Verify certificate detailsopenssl x509 -in /etc/pivirt/certs/node-01.crt -text -noout | grep -A1 "Subject Alternative Name"Troubleshooting
Section titled “Troubleshooting”mTLS Handshake Failed
Section titled “mTLS Handshake Failed”# Check certificate validityopenssl verify -CAfile /etc/pivirt/certs/ca-chain.pem /etc/pivirt/certs/agent-server.crt
# Verify OCSP statusopenssl ocsp \ -issuer /etc/pivirt/certs/PiCA.pem \ -cert /etc/pivirt/certs/agent-server.crt \ -url http://pitrust.pivirt.internal:8080/ocsp \ -CAfile /etc/pivirt/certs/PiRootR1.pemService Discovery Failed
Section titled “Service Discovery Failed”# Check etcdetcdctl endpoint health
# Check registered servicesetcdctl get /pivirt/services --prefix
# Check agent logsjournalctl -u pivirt-agent -f | grep -i discoveryConnection Refused
Section titled “Connection Refused”# Check service statussystemctl status pivirtd
# Check portss -tlnp | grep 9001
# Check firewallnft list ruleset | grep 9001