Deep Dive: Kubernetes API Server
The Kubernetes API Server is the central hub for all cluster operations. This deep dive explores its architecture, request flow, authentication mechanisms, and internal workings.
Architecture Overview
Component Architecture
Client Request -> Authentication -> Authorization -> Admission Control -> Validation -> etcd
Key Components
Request Handlers
- REST API endpoints
- Watch endpoints
- WebSocket handlers
Authentication Modules
- X.509 certificates
- Bearer tokens
- Service account tokens
- OpenID Connect
Authorization Modules
- RBAC
- Node authorization
- Webhook authorization
Request Flow Deep Dive
1. Request Processing
// Example request flow in Go
func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
// 1. Authentication
user, ok := authenticator.AuthenticateRequest(req)
// 2. Authorization
authorized := authorizer.Authorize(user, req)
// 3. Admission Control
mutated := admissionControl.Admit(req)
// 4. Validation
if err := validator.Validate(req); err != nil {
return err
}
// 5. etcd Storage
return storage.Store(req)
}
2. Watch Mechanisms
apiVersion: v1
kind: Pod
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod",...}
Authentication Deep Dive
1. Certificate Authentication
# Generate client certificate
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
2. Token Authentication
apiVersion: v1
kind: Secret
metadata:
name: api-token
namespace: kube-system
type: bootstrap.kubernetes.io/token
data:
token-id: "base64-encoded-token-id"
token-secret: "base64-encoded-token-secret"
3. Service Account Authentication
apiVersion: v1
kind: ServiceAccount
metadata:
name: api-service-account
namespace: default
secrets:
- name: api-service-account-token
Authorization Configuration
1. RBAC Setup
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
2. Webhook Configuration
apiVersion: v1
kind: Config
clusters:
- name: webhook-server
cluster:
certificate-authority: /path/to/ca.pem
server: https://webhook.example.com/authorize
Admission Controllers
1. Built-in Controllers
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: ResourceQuota
configuration:
apiVersion: apiserver.config.k8s.io/v1
kind: ResourceQuotaConfiguration
limitedResources:
- resource: pods
2. Custom Webhook Configuration
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: pod-policy
webhooks:
- name: pod-policy.example.com
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["pods"]
API Extensions
1. Custom Resource Definitions
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: widgets.custom.example.com
spec:
group: custom.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: widgets
singular: widget
kind: Widget
2. Aggregation Layer
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1.custom.example.com
spec:
version: v1
group: custom.example.com
groupPriorityMinimum: 1000
versionPriority: 100
service:
name: api-service
namespace: default
Performance Tuning
1. API Server Configuration
apiVersion: v1
kind: Pod
metadata:
name: kube-apiserver
spec:
containers:
- command:
- kube-apiserver
- --max-requests-inflight=400
- --max-mutating-requests-inflight=200
- --request-timeout=3m
- --watch-cache=true
2. etcd Optimization
# API Server etcd flags
--etcd-compaction-interval=5m
--etcd-count-metric-poll-period=1m
--etcd-servers=https://etcd1:2379,https://etcd2:2379
Monitoring and Debugging
1. Metrics Collection
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: apiserver
spec:
endpoints:
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
interval: 30s
port: https
scheme: https
tlsConfig:
caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
selector:
matchLabels:
component: apiserver
2. Audit Logging
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["pods"]
High Availability
1. Load Balancer Configuration
apiVersion: v1
kind: Service
metadata:
name: kubernetes
namespace: default
spec:
ports:
- port: 6443
targetPort: 6443
selector:
component: kube-apiserver
2. Leader Election
// Leader election configuration
type LeaderElectionConfiguration struct {
LeaderElect bool
LeaseDuration metav1.Duration
RenewDeadline metav1.Duration
RetryPeriod metav1.Duration
}
Troubleshooting
Common Issues
- Authentication Failures
# Check API server logs
kubectl logs -n kube-system kube-apiserver-master
# Verify certificates
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text
- Performance Issues
# Check API server metrics
curl -k https://localhost:6443/metrics
# Monitor etcd latency
etcdctl endpoint status --write-out=table
- Authorization Problems
# Debug RBAC
kubectl auth can-i --as=system:serviceaccount:default:default get pods
Best Practices
Security
- Enable audit logging
- Use RBAC
- Regular certificate rotation
- Enable admission controllers
Performance
- Configure proper resource limits
- Enable watch cache
- Optimize etcd access
High Availability
- Deploy multiple API servers
- Use load balancer
- Configure proper leader election
For more information, check out: