A Capacity Planning
Is used to determine the resources needed in order to meet the future workflow
demands. In Kubernetes resource management is very important. We learned that
scheduler is the component that identifies best nodes for creating pods.
The Scheduler has to
take into account many factors when it is scheduling pods on nodes. If there
are overlapping details or conflicting details the scheduler can find problem
when allocating pods in nodes.
Let’s say if we nave
a daemon set that is running on all nodes which
require 50% of memory, then scheduler can find it hard to allocate pods
that would require around same memory.
Problems of this type can easily mitigated by using namespace resource
quotas and correct management of the resource like Cpu, memory and storage
Kubernetes out of box
supports resource quotas. The Admission control element in the API server makes
sure to enforce resource quotas when one is defined. Kubernetes enforces one
resource quota per name space.
The Resource Quotas
in Kubernetes are 3 types
Compute
Storage
Object
Compute Resource Quota
This Quota talks
about compute resources which are memory and Cpu. In this we can either request
for a quota or limit a quota. This can be done by using limits.[cpu,memory] and
requests.[cpu,memory]
Limits.cpu &
limits.memory – This values talk about the sum of the CPU and Memory limits
across all pods that cannot be exceeded.
Requests.cpu &
requests.memory – This value talks about the sum of CPU and memory requests by
all pods that cannot be exceeded
Storage Resource Quota
This storage resource
quota talks about resource that can be restricted per namespace. The resource
includes the amount of storage and persistent volume claims.
Object Resource Quota
The Object resource
quota talks about the limitations on objects that can be created per namespace.
The goal of this resource quota is to make sure that Api server is not wasting
time performing things that are useless.
Compute Quota
Lets create a simple
compute quota and see how things go. In the below manifest file we are limiting
the number of pods to 2. When this quota is attached to a namespace, kubernetes
blocks creation of the 3 pods in the namespace.
Create a resource quota
config file as,
[root@manja17-I13330 kubenetes-config]# cat basic-resourcequota.yml
[root@manja17-I13330 kubenetes-config]# cat basic-resourcequota.yml
apiVersion: v1
kind: ResourceQuota
metadata:
name: pod-demo
spec:
hard:
pods: "2"
In our resource quota file we have limited our number of pod creation to 2.
Create the resource quota as,
kind: ResourceQuota
metadata:
name: pod-demo
spec:
hard:
pods: "2"
In our resource quota file we have limited our number of pod creation to 2.
Create the resource quota as,
[root@manja17-I13330 kubenetes-config]# kubectl create -f basic-resourcequota.yml --namespace=sample-testing
resourcequota "pod-demo" created
Once created , add the resource quota to a namespace as,
[root@manja17-I13330 kubenetes-config]# kubectl get resourcequota --namespace=sample-testing
NAME AGE
pod-demo 55s
When we get the pods, we see we already have 2 pods running in this namespace,
[root@manja17-I13330 kubenetes-config]# kubectl get pods --namespace=sample-testing
NAME
READY STATUS RESTARTS AGE
test-service-deploy-85c8787b6f-sfprn
1/1 Running 0
57s
test-service-deploy-85c8787b6f-wvnfc 1/1
Running 0 14s
Now lets try to create a new pod and see how it goes
[root@manja17-I13330 kubenetes-config]# cat
basic-single-container-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: testing-service
spec:
containers:
- name: test-ser
image:
docker.io/jagadesh1982/testing-service
ports:
- containerPort:
9876
resources:
limits:
memory:
"64Mi"
cpu:
"500m"
[root@manja17-I13330 kubenetes-config]# kubectl create -f basic-single-container-pod.yml
--namespace=sample-testing
Error from server (Forbidden): error when creating
"basic-single-container-pod.yml": pods "testing-service" is
forbidden: exceeded quota: pod-demo, requested: pods=1, used: pods=2, limited:
pods=2
Now when i run the pod creation it gives me an
error saying that the resource quota limit for pod is reached and cannot create
any more.
Let’s see another example of Compute Quota,
[root@manja17-I13330
kubenetes-config]# cat basic-computequota.yml
apiVersion: v1
kind: ResourceQuota
metadata:
name: computequota
spec:
hard:
pods: "2"
requests.cpu: "1"
requests.memory: 20Mi
limits.cpu: "2"
limits.memory: 2Gi
[root@manja17-I13330
kubenetes-config]# kubectl create -f basic-computequota.yml
–namespace=sample-testing
resourcequota "computequota" created
[root@manja17-I13330
kubenetes-config]# kubectl get quota –namespace=sample-testing
NAME AGE
computequota 14s
Describe the Quota using,
[root@manja17-I13330
kubenetes-config]# kubectl describe quota computequota
Name: computequota
Namespace:
default
Resource Used
Hard
-------- ----
----
limits.cpu 0
2
limits.memory 0
2Gi
pods 7
2
requests.cpu 0
1
requests.memory 0
20Mi
[root@manja17-I13330
kubenetes-config]# kubectl run nginx --image=nginx --replicas=1
--namespace=sample-testing
deployment.apps
"nginx" created
[root@manja17-I13330
kubenetes-config]# kubectl get pods --namespace=sample-testing
No resources
found.
[root@manja17-I13330
kubenetes-config]# kubectl get deploy --namespace=sample-testing
NAME DESIRED
CURRENT UP-TO-DATE AVAILABLE
AGE
nginx 1
0
0 0 40s
[root@manja17-I13330
kubenetes-config]# kubectl describe deploy nginx --namespace=sample-testing
Name: nginx
Namespace: sample-testing
CreationTimestamp: Tue, 14 Aug 2018 02:29:26 -0400
Labels: run=nginx
Annotations: deployment.kubernetes.io/revision=1
Selector: run=nginx
Replicas: 1 desired | 0 updated | 0 total | 0
available | 1 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Pod Template:
Labels:
run=nginx
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True
NewReplicaSetCreated
Available True
MinimumReplicasAvailable
ReplicaFailure True
FailedCreate
OldReplicaSets: <none>
NewReplicaSet: nginx-65899c769f (0/1 replicas created)
Events:
Type
Reason Age From Message
----
------ ---- ---- -------
Normal
ScalingReplicaSet 51s deployment-controller Scaled up replica set nginx-65899c769f to 1
Now if we
check the replica set in the namespace sample-testing, we can see
[root@manja17-I13330
kubenetes-config]# kubectl describe rs nginx --namespace=sample-testing
Name: nginx-65899c769f
Namespace: sample-testing
Selector: pod-template-hash=2145573259,run=nginx
Labels: pod-template-hash=2145573259
run=nginx
Annotations: deployment.kubernetes.io/desired-replicas=1
deployment.kubernetes.io/max-replicas=2
deployment.kubernetes.io/revision=1
Controlled
By: Deployment/nginx
Replicas: 0 current / 1 desired
Pods
Status: 0 Running / 0 Waiting / 0
Succeeded / 0 Failed
Pod Template:
Labels:
pod-template-hash=2145573259
run=nginx
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
ReplicaFailure True
FailedCreate
Events:
Type
Reason Age From Message
----
------ ---- ---- -------
Warning
FailedCreate 1m replicaset-controller Error creating: pods
"nginx-65899c769f-xgwrb" is forbidden: failed quota: computequota:
must specify limits.cpu,limits.memory,requests.cpu,requests.memory
Warning
FailedCreate 1m replicaset-controller Error creating: pods
"nginx-65899c769f-mr975" is forbidden: failed quota: computequota:
must specify limits.cpu,limits.memory,requests.cpu,requests.memory
Warning
FailedCreate 1m replicaset-controller Error creating: pods
"nginx-65899c769f-whtp9" is forbidden: failed quota: computequota:
must specify limits.cpu,limits.memory,requests.cpu,requests.memory
Warning
FailedCreate 1m replicaset-controller Error creating: pods
"nginx-65899c769f-g284h" is forbidden: failed quota: computequota:
must specify limits.cpu,limits.memory,requests.cpu,requests.memory
Warning
FailedCreate 32s (x6 over 1m) replicaset-controller (combined from similar events): Error
creating: pods "nginx-65899c769f-jzsv9" is forbidden: failed quota:
computequota: must specify limits.cpu,limits.memory,requests.cpu,requests.memory
The nginx
container failed to create with the warning
Warning
FailedCreate 32s (x6 over
1m) replicaset-controller (combined from similar events): Error
creating: pods "nginx-65899c769f-jzsv9" is forbidden: failed quota:
computequota: must specify limits.cpu,limits.memory,requests.cpu,requests.memory
This clearly
indicates the quota need to be defined for a pod to be created in
sample-testing. Since we haven’t defined that the pod creation failed.
We can
then define the quota and then create
the pod as,
[root@manja17-I13330
kubenetes-config]# kubectl run nginx --image=nginx --replicas=1
--requests=cpu=100m,memory=4Mi --limits=cpu=200m,memory=8Mi
--namespace=sample-testing
deployment.apps
"nginx" created
[root@manja17-I13330
kubenetes-config]# kubectl get pods --namespace=sample-testing
NAME READY STATUS
RESTARTS AGE
nginx-97fb87dfc-9lcxb 1/1
Running 0 8s
Limit Quota
Rather then defining
pods with quotas while creating, we can define out quota to allow default
values if missing. This is what we call as limit Ranges. Lets create a quota
with a limit range and see how things work,
[root@manja17-I13330
kubenetes-config]# cat basic-limitrangequota.yml
apiVersion: v1
kind: LimitRange
metadata:
name: limits
spec:
limits:
- default:
cpu: 200m
memory: 6Mi
defaultRequest:
cpu: 100m
memory: 5Mi
type: Container
[root@manja17-I13330
kubenetes-config]# kubectl create -f basic-limitrangequota.yml
--namespace=sample-testing
limitrange
"limits" created
[root@manja17-I13330
kubenetes-config]# kubectl get limits --namespace=sample-testing
NAME AGE
we can create pods
with out providing any values. The default values will be assigned to the pod
while creation,
[root@manja17-I13330 kubenetes-config]# kubectl run nginx --image=nginx
--replicas=1 --namespace=sample-testing
More to come, Happy Learning :-)
what is endoint in k8?
ReplyDeleteHello to all, how іs аll, I thіnk every one
ReplyDeleteis getting more from this website, and your vieᴡs are nice for new рeople.
great post to read : How To Lock Files In Less Than 3 Minutes Using These
Amаzing Tools