[쿠버네티스] 네임스페이스

최동혁·2023년 4월 28일
0

쿠버네티스

목록 보기
5/7

네임스페이스

  • 쿠버네티스에서, 네임스페이스 는 단일 클러스터 내에서의 리소스 그룹 격리 메커니즘을 제공
  • 리소스의 이름은 네임스페이스 내에서 유일해야 하며, 네임스페이스 간에서 유일할 필요는 없다.
  • 네임스페이스는 여러 개의 팀이나, 프로젝트에 걸쳐서 많은 사용자가 있는 환경에서 사용하도록 만들어졌다.
  • 사용자가 거의 없거나, 수 십명 정도가 되는 경우에는 네임스페이스를 전혀 고려할 필요가 없다.
    • 예를들면 실제 운용중인 서버를 관리하기 위한 네임스페이스와
    • 개발용 네임스페이스 테스트용 네임스페이스를 분리하여 운영할 수 있다.

네임스페이스 생성

apiVersion: v1
kind: Namespace
metadata:
  name: nm-1

파드 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  namespace: nm-1
  labels:
    app: pod
spec:
  containers:
  - name: container
    image: ubuntu:latest
    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]

ResourceQuota

  • 리소스 쿼터는 네임스페이스별 총 리소스 사용을 제한하는 제약 조건을 제공
  • 유형별로 네임스페이스에서 만들 수 있는 오브젝트 수와 해당 네임스페이스의 리소스가 사용할 수 있는 총 컴퓨트 리소스의 양을 제한
  • 여러 사용자나 팀별로 정해진 수의 노드로 클러스터를 공유할 때 한 팀이 리소스를 과도하게 사용할 수 있다는 우려가 있는데, 이를 해결하기 위한 도구

네임스페이스 생성

apiVersion: v1
kind: Namespace
metadata:
  name: nm-3

리소스쿼터 생성

apiVersion: v1
kind: ResourceQuota
metadata:
  name: rq-1
  namespace: nm-3
spec:
  hard:
    requests.memory: 1Gi
    limits.memory: 2Gi
  • 요청(request): 파드가 최소한으로 필요로 하는 CPU와 메모리의 양을 지정한다. 이 값을 지정하면 쿠버네티스는 파드가 실행될 때 해당 리소스를 할당해야 하는 노드를 선택한다. 파드가 사용할 수 있는 최소한의 자원을 보장한다.

  • 제한(limit): 파드가 사용할 수 있는 최대 CPU와 메모리의 양을 지정한다. 이 값을 지정하면 파드가 할당된 자원을 초과하여 사용할 수 없도록 제한된다. 파드가 사용할 수 있는 최대 자원을 제한한다.

  • 이렇게 해 놓으면, 하나의 네임스페이스에서 메모리를 제한 걸어줘서, 팀마다 자원 할당을 제한해줌.

  • 만약 예를 들어, requests 메모리나 limits 메모리를 넘기는 파드를 생성한다면?

apiVersion: v1
kind: Pod
metadata:
  name: my-pod3
spec:
  containers:
  - name: my-container
    image: nginx
    resources:
      limits:
        cpu: "1"
        memory: "1.8Gi"
      requests:
        cpu: "500m"
        memory: "1.5Gi"

  • 이런 에러가 나오면서 생성이 안됨.

LimitRange

  • 네임스페이스 안의 특정 파드가 자원을 전부 다 잡아먹는 경우가 생김.
  • 이런것도 제한을 걸기 위해 생긴 도구
apiVersion: v1
kind: LimitRange
metadata:
  name: lr-1
  namespace: nm-3
spec:
  limits:
  - type: Container
    min:
      memory: 0.1Gi
    max:
      memory: 0.4Gi
    maxLimitRequestRatio:
      memory: 3
    defaultRequest:
      memory: 0.1Gi
    default:
      memory: 0.2Gi
  • 생성된 네임스페이스 안에서 해당 네임스페이스의 이름을 입력해주고, 위처럼 제한을 걸어준다.

  • 이것도 제한을 넘어가거나 기준치에 도달하지 못하는 메모리를 주게 되면 위와 같은 에러가 난다.
apiVersion: v1
kind: Pod
metadata:
  name: my-pod3
spec:
  containers:
  - name: my-container
    image: nginx
    resources:
      limits:
        cpu: "1"
        memory: "0.4Gi"
      requests:
        cpu: "500m"
        memory: "0.1Gi"
  • 만약 최소 메모리도 딱 0.1에 맞추고, 최대 메모리도 딱 0.4에 맞춰도 안된다.
  • 왜냐면, 위에서 maxLimitRequestRatio를 3으로 해놨다.
  • 그건, 최소와 최대가 3배이상 차이나면 안되기 때문이다.
  • metadata: LimitRange 리소스의 메타데이터 정보입니다. name은 LimitRange의 이름을, namespace는 해당 LimitRange가 적용될 네임스페이스를 나타냅니다.
  • spec: LimitRange 리소스의 구체적인 설정 정보를 나타내는 항목입니다. 여기서는 limits 섹션을 설정하고 있습니다.
  • limits: 파드 내의 컨테이너에 대한 제한 정보를 설정하는 섹션입니다.
  • type: 설정하는 제한의 유형입니다. Container를 지정하면 컨테이너의 리소스 제한에 대한 설정을 하겠다는 것을 나타냅니다.
  • min: 컨테이너에서 사용할 수 있는 최소한의 리소스 값을 나타냅니다. 여기서는 메모리 최소값을 0.1Gi로 설정하고 있습니다.
  • max: 컨테이너에서 사용할 수 있는 최대 리소스 값을 나타냅니다. 여기서는 메모리 최대값을 0.4Gi로 설정하고 있습니다.
  • maxLimitRequestRatio: maxLimitRequestRatio는 limit과 request 사이에 허용되는 최대 비율을 지정하는 옵션입니다. 즉, 제한된 리소스 양과 요청된 리소스 양 사이의 최대 비율을 설정할 수 있습니다. request와 limit이 최대 3배차이가 나면 안된다는 얘기.
  • defaultRequest: 만약 컨테이너에서 요청한 메모리 값이 명시되어 있지 않을 때, 컨테이너에서 사용할 수 있는 기본값을 설정합니다. 여기서는 0.1Gi를 기본값으로 설정하였습니다.
  • default: 만약 컨테이너에서 요청한 메모리 값과 제한한 메모리 값이 명시되어 있지 않을 때, 컨테이너에서 사용할 수 있는 기본값을 설정합니다. 여기서는 limit을 0.2Gi를 기본값으로 설정하였습니다.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글