Names of resources need to be unique within a namespace, but not across namespaces.
Namespace-based scoping is applicable only for namespaced objects (e.g. Deployments, Services, etc) and not for cluster-wide objects (e.g. StorageClass, Nodes, PersistentVolumes, etc).
When to Use Multiple Namespaces
Namespaces are intended for use in environments with many users spread across multiple teams, or projects.
For clusters with a few to tens of users, you should not need to create or think about namespaces at all.
Start using namespaces when you need the features they provide.
Namespaces provide a scope for names. Names of resources need to be unique within a namespace, but not across namespaces.
Namespaces cannot be nested inside one another and each Kubernetes resource can only be in one namespace.
Namespaces are a way to divide cluster resources between multiple users (via resource quota).
It is not necessary to use multiple namespaces to separate slightly different resources, such as different versions of the same software: use labels to distinguish resources within the same namespace.
Task: Create Kubernetes cluster with 3 worker nodes.
Master: 1 node
Worker: 2 node
Create docker hub account. Docker Hub if you already have one skip this step
Open Play with Kubernetes login with your docker hub account.
Click on start
It will start a 4 hr session
create three instance
click on + ADD NEW INSTANCE three time to add three instances
kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16
enter below command on first node
kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
capture output of kubeadm join XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
you may also use kubeadm token list to find token
use this command on second and third node kubeadm join <IP address of master/first node>:6443 –token
enter captured command in second and third node
kubeadm join XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Task: List all namespaces in kubernetes cluster
kubectl get namespace
Task: Create New namespace test in Kubernetes cluster
Use Kubectl command
verify with below command
kubectl get namespace
this command will create namespace test
kubectl create namespace test
Task: Create a pod with below details
name: web
image: nginx
namespace: test
Use Kubectl command
verify with below command
kubectl get pods --namespace=test
this command will create pod with image nginx and name web in namespace test
kubectl run web --image=nginx --namespace=test
You may also use -n instead of –namespace
kubectl run web --image=nginx -n test
Task: Expose port on pod created in previous step using Kubectl, port should be accessible from outside Kubernetes cluster
name: web
image: nginx
port: 80
namespace: test
verify with below command
kubectl get all -n test
kubectl expose pod web --port 80 --name=nginx-svc --type=NodePort --target-port=80 -n test
Task: Find port used by nodeport service in Kubernetes to expose container
kubectl get all --namespace=test
Task: Access pod port exposed in previous step using browser
Task: Create New namespace test1 in Kubernetes cluster using YAML
verify with below command
kubectl get namespace
create a new file ns.yaml
vi ns.yaml
Press i to get in insert mode
apiVersion: v1
kind: Namespace
metadata:
name: test1
use escape to exit insert mode and :wq to save and exit vi
apiVersion, Kind, metadata.name and spec are required field
Below command will create namespace using yaml file
kubectl apply -f ns.yaml
Task: Create a pod with name demo and image nginx in namespace test1
name: demo
image: nginx
namespace: test1
Use Kubectl command
verify with below command
kubectl get pods -n test1
create a new file pod.yaml
vi pod.yaml
Press i to get in insert mode
apiVersion: v1
kind: Pod
metadata:
name: demo
labels:
app: demo
type: web
namespace: test1
spec:
containers:
- name: demo-nginx
image: nginx
ports:
- containerPort: 80
use escape to exit insert mode and :wq to save and exit vi
apiVersion, Kind, metadata.name and spec are required field
you may add labels
you can use any key: value pairs for labels
labels are used to select pods
provide name to container
provide image for container
kubectl apply -f pod.yaml
this command will create pod using yaml file
Task: Create a ClusterIP service using yaml
name: web1-svc
selector: app=demo
verify that a ClusterIP service has been created with below command
kubectl get svc web1-svc -n test1
kubectl get ep -n test1
kubectl get all -n test1
create a new file svc.yaml
vi svc.yaml
apiVersion: v1
kind: Service
metadata:
name: web1-svc
namespace: test1
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: demo
type: ClusterIP # this is optional as ClusterIP is default type
use escape key and :wq to save and exit vi.
apiVersion, Kind, metadata.name and spec are required field.
kubectl apply -f svc.yaml
this command will create service using yaml file
Task: Create a pod using Kubectl and access the service created in previous step
name: jumphost
image: busybox
Get IP address of service by running below command
kubectl get svc web
Create a new pod and connect to its shell
kubectl run jumphost --image=busybox -it -- sh
Use IP address to access the service in new pod
wget -O- web1-svc.test1
Task: Delete all open nodes/instances and close session