Kubernetes Deployments are a fundamental aspect of working with Kubernetes. While the process may seem straightforward, understanding the intricate steps behind the scenes is crucial for troubleshooting and gaining a deeper understanding.
Deployment Request Workflow:
There are three primary ways to initiate deployments:
- YAML/JSON file: Applying a file containing the deployment manifest using kubectl apply.
- kubectl run command: This simplifies deployment by providing image name and basic configuration in the command line.
- kubectl create command: Offers greater control by specifying detailed deployment parameters.
Internal Workflow:
Client-Side:
- Validation: Ensures resource type, group, and client credentials are valid.
- Context & Authentication: Extracts current context, cluster, and authentication information from
kubeconfig
. - HTTP Request: Forms and sends the deployment request to the API server.
Server-Side:
API Server:
- Authentication: Verifies client credentials using certificates, tokens, or basic authentication.
- Authorization: Evaluates user privileges using RBAC, ABAC, or webhooks.
- Admission Control: Validates the request against defined criteria, potentially modifying it before storing it in etcd.
- Persistence: Stores the deployment request in etcd.
Deployment Controller:
- ReplicaSet Creation: Watches for new deployments in etcd and creates corresponding ReplicaSet objects.
ReplicaSet Controller:
- Pod Creation: Creates Pod objects based on the ReplicaSet spec.
Pod Controller:
- Pod Scheduling: Waits for the scheduler to update node information and create a binding object.
Kubelet:
- Pod Management: Manages pods on its node by coordinating with the container runtime to:
- Create/update container based on pod specs.
- Mount volumes.
- Pull container images.
- Perform health checks.
Commands for Deployment Creation:
kubectl apply -f /path/to/file.json|yaml
: Applies a deployment manifest file.kubectl create deploy <deployment-name> --image=<image-name>
: Creates a deployment with specified image.kubectl run <deployment-name> --image=<image-name>
: Simplifies deployment creation with a single command.
Example Deployment File
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
Benefits of Understanding the Deployment Flow:
- Troubleshooting: Provides insight into potential bottlenecks and error points.
- Improved Configuration: Enables tailored configuration for specific deployment needs.
- Enhanced Automation: Facilitates automation of deployment workflows.