Configure webhook token authentication
This guide shows how to configure the vCluster API server to use webhook token authentication, enabling integration with external identity providers and custom authentication systems.
Overview
Webhook token authentication allows the Kubernetes API server to delegate token validation to an external service. When the API server receives a request with a bearer token it does not recognize, it sends a TokenReview request to the configured webhook service, which validates the token and returns user identity information.
Use cases for webhook token authentication include:
- Integrating with enterprise identity providers (LDAP, SAML, OAuth2/OIDC) that issue custom tokens
- Implementing centralized authentication across multiple clusters
- Supporting custom token formats with specific expiration or validation requirements
- Enabling authentication through external systems like the Cluster API Provider for vCluster (CAPIVC)
Prerequisites
Before you begin, ensure you have:
- A running vCluster using the K8s distribution (
controlPlane.distro.k8s.enabled: true) - An external webhook authentication service accessible from the vCluster
- TLS certificates for secure communication between the API server and webhook service
Webhook token authentication requires the K8s distribution because it uses kube-apiserver, which supports the --authentication-token-webhook-config-file flag. This configuration is not available with the K3s or K0s distributions.
Configure webhook token authentication
Create a kubeconfig-style file that describes how to connect to your webhook authentication service:
webhook-config.yamlapiVersion: v1
kind: Config
clusters:
- name: authn-webhook
cluster:
# CA certificate for verifying the webhook service
certificate-authority: /etc/kubernetes/pki/webhook-ca.crt
# URL of your webhook authentication service
server: https://auth-service.example.com/authenticate
users:
- name: authn-webhook-client
user:
# Client certificate for mutual TLS (optional)
client-certificate: /etc/kubernetes/pki/webhook-client.crt
client-key: /etc/kubernetes/pki/webhook-client.key
contexts:
- context:
cluster: authn-webhook
user: authn-webhook-client
name: authn-webhook
current-context: authn-webhookCreate a ConfigMap in the vCluster namespace containing the webhook configuration:
kubectl create configmap webhook-token-auth-config \
--from-file=webhook-config.yaml \
-n vcluster-my-vclusterIf your webhook requires TLS certificates, create a Secret:
kubectl create secret generic webhook-auth-certs \
--from-file=webhook-ca.crt=/path/to/ca.crt \
--from-file=webhook-client.crt=/path/to/client.crt \
--from-file=webhook-client.key=/path/to/client.key \
-n vcluster-my-vclusterConfigure vCluster to pass the webhook configuration to the API server:
vcluster.yamlcontrolPlane:
distro:
k8s:
enabled: true
apiServer:
extraArgs:
# Point to the webhook configuration file
- --authentication-token-webhook-config-file=/etc/kubernetes/webhook/webhook-config.yaml
# Cache successful authentications for 2 minutes (default)
- --authentication-token-webhook-cache-ttl=2m
statefulSet:
persistence:
addVolumes:
# Mount the webhook config ConfigMap
- name: webhook-config
configMap:
name: webhook-token-auth-config
# Mount TLS certificates if needed
- name: webhook-certs
secret:
secretName: webhook-auth-certs
addVolumeMounts:
- name: webhook-config
mountPath: /etc/kubernetes/webhook
- name: webhook-certs
mountPath: /etc/kubernetes/pkiCreate or update your vCluster with the configuration:
vcluster create my-vcluster -f vcluster.yaml --connect=falseVerify the API server is using the webhook configuration:
kubectl exec -n vcluster-my-vcluster my-vcluster-0 -c syncer -- \
ps -ef | grep authentication-token-webhookYou should see
--authentication-token-webhook-config-filein the kube-apiserver arguments.
Configuration options
Cache time-to-live
The --authentication-token-webhook-cache-ttl flag controls how long successful authentication responses are cached. The default is 2 minutes. Adjust this based on your security requirements:
controlPlane:
distro:
k8s:
apiServer:
extraArgs:
- --authentication-token-webhook-config-file=/etc/kubernetes/webhook/webhook-config.yaml
# Shorter cache for stricter security
- --authentication-token-webhook-cache-ttl=30s
Webhook service implementation
Your webhook service must implement the Kubernetes TokenReview API. When the API server receives an unrecognized token, it sends a POST request with a TokenReview object:
{
"apiVersion": "authentication.k8s.io/v1",
"kind": "TokenReview",
"spec": {
"token": "<bearer-token>"
}
}
The webhook must respond with the authentication result:
{
"apiVersion": "authentication.k8s.io/v1",
"kind": "TokenReview",
"status": {
"authenticated": true,
"user": {
"username": "user@example.com",
"uid": "12345",
"groups": ["developers", "team-a"]
}
}
}
Use with CAPIVC
When using vCluster with Cluster API Provider for vCluster (CAPIVC), you can configure webhook token authentication through the VCLUSTER_YAML environment variable:
cat > /tmp/values.yaml <<EOF
controlPlane:
distro:
k8s:
enabled: true
apiServer:
extraArgs:
- --authentication-token-webhook-config-file=/etc/kubernetes/webhook/webhook-config.yaml
statefulSet:
persistence:
addVolumes:
- name: webhook-config
configMap:
name: webhook-token-auth-config
addVolumeMounts:
- name: webhook-config
mountPath: /etc/kubernetes/webhook
EOF
export VCLUSTER_YAML=$(cat /tmp/values.yaml | awk '{printf "%s\\n", $0}')
The ConfigMap containing the webhook configuration must exist in the namespace where CAPIVC creates the vCluster.
Troubleshoot
Authentication failures
If authentication fails:
-
Check the API server logs for webhook errors:
kubectl logs -n vcluster-my-vcluster my-vcluster-0 -c syncer | grep -i auth -
Verify the webhook service is accessible from the vCluster pod:
kubectl exec -n vcluster-my-vcluster my-vcluster-0 -c syncer -- \
curl -k https://auth-service.example.com/health -
Ensure the webhook configuration file is correctly mounted:
kubectl exec -n vcluster-my-vcluster my-vcluster-0 -c syncer -- \
cat /etc/kubernetes/webhook/webhook-config.yaml
Certificate issues
If you encounter TLS certificate errors:
- Verify the CA certificate is correct and trusted
- Check that certificate paths in the webhook config match the mount paths
- Ensure certificates have not expired
Network connectivity
The webhook service must be reachable from the vCluster pod. If your service is in a different namespace or cluster:
- Use the fully qualified domain name (FQDN) for the service
- Ensure network policies allow traffic from the vCluster namespace
- Consider using a service mesh or ingress for external services