Kubernetes Core Concepts Guide 🚀
ETCD 📚
ETCDCTL Command Interaction
ETCDCTL can interact with the ETCD Server using two API versions: Version 2 and Version 3. By default, it is set to use Version 2. Each version has different sets of commands.
ETCDCTL Version 2 Commands:
- etcdctl backup
- etcdctl cluster-health
- etcdctl mk
- etcdctl mkdir
- etcdctl set
ETCDCTL Version 3 Commands:
- etcdctl snapshot save
- etcdctl endpoint health
- etcdctl get
- etcdctl put
To set the right version of the API, set the environment variable ETCDCTL_API:
export ETCDCTL_API=3Replication Controller (RC) 💾
Replica Set 📊
Deployments.yml 📄
Imperative CLI Commands 🛠️
Create an NGINX Pod
kubectl run nginx --image=nginxGenerate POD Manifest YAML file (-o yaml). Don't create it (--dry-run)
kubectl run nginx --image=nginx --dry-run=client -o yamlCreate a Deployment
kubectl create deployment --image=nginx nginxGenerate Deployment YAML file (-o yaml). Don't create it (--dry-run)
kubectl create deployment --image=nginx nginx --dry-run=client -o yamlGenerate Deployment YAML file (-o yaml). Don’t create it (--dry-run) and save it to a file
kubectl create deployment --image=nginx nginx --dry-run=client -o yaml > nginx-deployment.yamlMake necessary changes to the file (e.g., adding more replicas) and then create the deployment:
kubectl create -f nginx-deployment.yamlIn Kubernetes version 1.19+, we can specify the --replicas option to create a deployment with 4 replicas:
kubectl create deployment --image=nginx nginx --replicas=4 --dry-run=client -o yaml > nginx-deployment.yamlServices 🛠️
Service Types
Cluster IP
Load Balancer
Namespaces 🏷️
Create a Namespace
A namespace is a logical grouping of resources.
Connecting to Servers in Different Nodes & Namespaces
To connect to the same namespace, we can use a service name of that resource to connect (e.g., mysql.connect("db-service")).
Pod Definition File
A pod definition file that will auto-create a pod in a specific namespace defined in the YAML label section (e.g., namespace: dev).
Switch to Another Namespace Permanently (from Default)
Resource Quota for Namespace
Limit the usage of resources in a specific namespace.
Imperative Commands for Services 🛠️
Create a Service Named redis-service of Type ClusterIP to Expose Pod redis on Port 6379
kubectl expose pod redis --port=6379 --name redis-service --dry-run=client -o yaml(This will automatically use the pod's labels as selectors.)
Or
kubectl create service clusterip redis --tcp=6379:6379 --dry-run=client -o yaml(This will not use the pod's labels as selectors, instead it will assume selectors as app=redis. You cannot pass in selectors as an option. Generate the file and modify the selectors before creating the service.)
Create a Service Named nginx of Type NodePort to Expose Pod nginx's Port 80 on Port 30080 on the Nodes
kubectl expose pod nginx --type=NodePort --port=80 --name=nginx-service --dry-run=client -o yaml(This will automatically use the pod's labels as selectors, but you cannot specify the node port. Generate a definition file and then add the node port manually before creating the service with the pod.)
Or
kubectl create service nodeport nginx --tcp=80:80 --node-port=30080 --dry-run=client -o yaml(This will not use the pod's labels as selectors.)
Both the above commands have their own challenges. While one cannot accept a selector, the other cannot accept a node port. I recommend going with the kubectl expose command. If you need to specify a node port, generate a definition file using the same command and manually input the node port before creating the service.