쿠버네티스 클러스터에는 Memory, Cpu가 있고 클러스터 안에는 여러 Namespace를 만들 수 있고 Namespace안에는 여러 Pod들을 만들 수 있다.
각 Pod는 필요한 자원을 클러스터 자원을 공유해서 사용하는데 만약 한 Namespace안에 있는 Pod가 클러스터 안에 남아있는 자원을 모두 사용해버리면 다른 Pod입장에서는 더이상 쓸 자원이 없어서 자원이 필요할 때 문제가 발생하게 된다.
이런 문제를 해결하기 위해서 ResoureQuota라는것이 존재하는데 이것을 Namespace마다 달면 Namespace마다 최대 한계를 설정할 수 있다. 그래서 Pod자원이 최대 한계를 넘을 수 없고 Pod입장에서 자원이 부족해 문제가 생길지 언정 다른 Namespace에 있는 Pod들에는 영향을 끼치지 않게 해준다.
한 Pod가 자원사용량을 너무 크게해버리면 Namespace에 다른 Pod들이 들어오지 못하게 한다. 이러한 문제를 관리하기 위해서 LimitRange를 줘서 Namespace에 들어오는 Pod의 크기를 제한할 수 있다.
한 Pod의 자원 사용량이 LimitRange의 값보다 낮아야지 Namespace에 들어올 수 있다.
한 Namespace안에는 같은 타입의 Object들은 이름이 중복될 수 없다는 특징이 있다.
따라서 Pod의 이름이 중복될 수 없다.
Object들 마다 별도의 uuid가 존재하긴 하지만 한 Namespace안에서는 이름 또한 고유한 키 역할을 할 수 있다.
타 Namespace에 있는 자원과 분리되어 관리된다.
Namespace2에 Service가 있고 Namespace1에는 Pod가 있다고 가정해보자
Pod에는 labels을 달고 Service에는 Selector를 달아서 연결하는데 Namespace가 다르면 연결되지 않는다.
대부분의 자원들은 그 자원안에서 만든 Namespace안에서만 사용가능 하다.
물론 Node나 PV같이 모든 Namespace에서 공용으로 사용되는 Object들도 있긴 하다.
Namespace를 지우게 되면 그 안에 있는 모든 자원들도 같이 지워진다.
apiVersion: v1
kind: namespace
metadata:
name: namespace-1
apiVersion: v1
kind: Pod
metadata:
name: pod-1
namespace: namespace-1
labels:
nm : pod1
spec:
containers:
...
apiVersion: v1
kind: namespace
metadata:
name: namespace-2
apiVersion: v1
kind: Service
metadata:
name: service-1
namespace: namespace-2
spec:
selector:
nm: pod1
ports:
Namespace를 만들 때는 이름 말고는 특별히 들어가는 것이 없다.
Pod나 Service를 만들 때 내가 속할 Namespace를 지정할 수 있다.
위의 코드에서 Pod와 Service는 Namespace가 서로 다르기 때문에 Pod의 labels과 Service의 selector가 일치하더라도 연결되지 않는다.
ResourceQuota는 Namespace의 자원의 한계를 설정하는 Object이다.
ResourceQuota가 지정되어있는 Namespace에 Pod를 만들 때 Pod는 ResoureceQuota에서 지정한 requests와 limits 스펙을 명시해야 한다.
만약 스펙이 없으면 Pod는 해당 Namespace에 만들어지지 않는다.
또한 새로운 Pod를 생성할 때 ResourceQuota에 지정되어 있는 자원의 한계를 초과하면 만들어지지 않는다.
apiVersion: v1
kind: ResourceQuota
metadata:
name: rq-1
namespace: nm-1
spec:
hard:
requests.memory: 3Gi
limits.memory: 6Gi
apiVersion: v1
kind: Pod
metadata:
name: pod-2
spec:
containers:
- name: container
image: nginx:1.14
resources:
request:
memory: 2Gi
limits:
memory: 2Gi
LimitRange는 각각의 Pod마다 Namespace에 들어올 수 있는지 자원을 체크해준다.
체크되는 항목 : min, max, maxLimitRequestRatio
Pod1는 limit의 memory의 값이 5G이다.
하지만 LimitRange의 max의 값이 4G이기 때문에 생성되지 못한다.
Pod2는 request와 limit의 비율이 4이므로 maxLimitRequestRatio의 값인 3보다 크므로 생성되지 못한다.
LimitRange에 defaultRequest와 defaultLimit을 설정해놓으면
Pod에 아무런 설정을 하지 않더라도 생성될 때 Request와 Limit 값이 자동으로 할당된다.
apiVersion: v1
kind: LimitRange
metadata:
name: lr-1
namespace: nm-1
spec:
limits:
type: Container
min:
memory: 1Gi
max:
memory: 4Gi
defaultRequest:
memory: 1Gi
default:
memory: 2Gi
maxLimitReqeustRatio:
memory: 3