Post

Kubernetes namespace, quota

namespace

  • namespace를 사용하면 같은 물리적 클러스터 안에서 가상 클러스터를 생성할 수 있다.

  • namespace는 논리적으로 클러스터에서 분리할 수 있다.

  • 표준 namespace를 기본값이라고 하고 리소스가 기본적으로 시작되는 곳이다.

따라서, 네임스페이스를 지정하지 않을 때마다 실제로 기본 네임스페이스 내에서 파드, 배포 등등 시작하는데 큐브시스템이라 불리는 쿠버네티스 특정 리소스의 네임스페이스도 존재한다.

  • 예를 들어, 대부분의 모니터링은 kube-system에서 시작하고 DNS 애드온 또한 kube-system에서 시작한다. 대시보드 또한 kube-system 네임스페이스에 있는 예시이다.

  • namespace는 kubernetest cluster를 사용하는 여러 팀/프로젝트가 있는 경우 사용된다.

​

kubernetes는 namespace로 물리적인 리소스를 할당시키는데, 이때 namespace에게 quota를 설정할 수 있다. quota라는 것은 고정된 kubernetes의 resource를 고르게 분배하기 위해서 resource의 할당량을 지정하는 것을 말한다.

​

위의 예제와 같이 resource quota와 objest quota들을 설정할 수 있다.

​

resource limit을 걸어두지 않고 아래와 같이 deployment를 생성하게 되면 resource 부족으

apiVersion: v1
kind: Namespace
metadata:
  name: myspace
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: myspace
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-quota
  namespace: myspace
spec:
  hard:
    configmaps: "10"
    persistentvolumeclaims: "4"
    replicationcontrollers: "20"
    secrets: "10"
    services: "10"
    services.loadbalancers: "2"

로 인하여 pod가 2개까지만 생성되는 것을 확인할 수 있다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-deployment
  namespace: myspace
spec:
  replicas: 3
  selector:
    matchLabels:
      app: helloworld
  template:
    metadata:
      labels:
        app: helloworld
    spec:
      containers:
      - name: k8s-demo
        image: wardviaene/k8s-demo
        ports:
        - name: nodejs-port
          containerPort: 3000

quota를 아래와 같이 cpu 2와 memory 2gb를 잡았는데, 위에 quota 설정이 없기 때문에 resource가 부족하여 실행시키지 못한 것이다.

spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi

​

따라서 아래와 같이 조절하게 되면, 원하는 개수의 pod를 생성할 수 있다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-deployment
  namespace: myspace
spec:
  replicas: 3
  selector:
    matchLabels:
      app: helloworld
  template:
    metadata:
      labels:
        app: helloworld
    spec:
      containers:
      - name: k8s-demo
        image: wardviaene/k8s-demo
        ports:
        - name: nodejs-port
          containerPort: 3000
        resources:
          requests:
            cpu: 200m
            memory: 0.5Gi
          limits:
            cpu: 400m
            memory: 1Gi

여기서 request와 limits가 있는데, request는 pod에 할당을 요청하는 단위 이고, limits는 총합을 넘을 수 없다는 제한이다. 즉 pod 3개를 cpu 200m, 500mi 로 생성한다고 가정하였을 때, 200 x 3 = 600m, 500mi x 3 = 1.5Gi 이기 떄문에 이 pod도 정상적으로 만들어질 수 없다.

​

따라서 각 resource 설정에 맞춰서 manifest를 작성해야 된다.

​

위와 같이 quota 설정을 하지 않는 경우 default resource 설정을 아래와 같이 할 수 있다.

apiVersion: v1
kind: LimitRange
metadata:
  name: limits
  namespace: myspace
spec:
  limits:
  - default:
      cpu: 200m
      memory: 512Mi
    defaultRequest:
      cpu: 100m
      memory: 256Mi
    type: Container

quota 조회 명령어

kubectl describe quota/compute-quota --namespace=myspace

​

This article is licensed under CC BY 4.0 by the author.