본문 바로가기
네트워크/k8s

[k8s] 11. Namespace, ResourceQuota, LimitRange - 실습

by Lauren X Ming 2021. 2. 11.

Namespace, ResourceQuota, LimitRange 실습

image

1. Namespace

image

Namespace

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

Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  namespace: nm-1
  labels:
    app: pod
spec:
  containers:
  - name: container
    image: kubetm/app
    ports:
    - containerPort: 8080

Service

apiVersion: v1
kind: Service
metadata:
  name: svc-1
  namespace: nm-1
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080

Another Namespace

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

Another Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  namespace: nm-2
  labels:
    app: pod
spec:
  containers:
  - name: container
    image: kubetm/init
    ports:
    - containerPort: 8080

NodePort

apiVersion: v1
kind: Service
metadata:
  name: svc-2
  namespace: nm-1
spec:
  ports:
  - port: 9000
    targetPort: 8080
    nodePort: 30000
  type: NodePort

Pod mount host-path

apiVersion: v1
kind: Pod
metadata:
 name: pod-2
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    - name: host-path
      mountPath: /mount1
  volumes:
  - name : host-path
    hostPath:
      path: /node-v
      type: DirectoryOrCreate

실습 과정

  1. Namespace 생성 --> nm-1

  2. 만든 nm-1을 대시보드에서 선택하고, 생성을 눌러서 생성

  3. 서비스 생성 --> 서비스 셀렉터와 이전에 만든 파드의 라벨이 연결됨

  4. 서비스를 클릭하고, 클러스터 ip 복사 --> 10.110.193.89

  5. 파드를 클릭하고, ip 복사 --> 20.111.156.86

  6. 똑같은 파드를 만드려고 시도 --> 에러남

  7. Another Namespace 생성 --> nm-2

  8. 만든 nm-2를 선택하고 서비스 생성 --> 이렇게 선택하고 서비스를 생성하면 네임스페이스를 지정 안 해도됨, 2단계도 마찬가지
    nm-2 선택이 되지 않으면 모든 네임스페이스 클릭 후 yaml metadata에 namesapce를 명시하면 됨

  9. nm-2를 클릭하면 연결된 파드가 없는걸 확인, 다른 네임스페이스니 연결이 안 된 것

  10. nm-2에 Another Pod 생성하면 nm-2에서 파드가 연결된 것을 확인

  11. nm-2 네임스페이스에 있는 pod에서 nm-1 네임스페이스의 파드에 연결이 되는지 확인

    Pod 연결

    curl 20.111.156.86:8080/hostname

    Service 연결

    curl 10.110.193.89:9000/hostname

    image

  12. NodePort를 nm-2에서 생성 후 nm-1에서도 생성되는지 확인 --> nm-1에서 생성 실패

  13. host-path를 마운트 한 pod-2를 nm-1에 생성

  14. nm-1의 pod-2의 shell에서 파일 생성

    echo "hello" >> hello.txt
  15. nm-2에 똑같은 내용의 pod-2를 생성하고 pod-2 shell의 mount1에 nm-1의 파드에서 생성한 파일이 있는지 확인

    pod-2 shell in nm-1
    image

    pod-2 shell in nm-2
    image

2. ResourceQuota

image

Namespace

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

ResourceQuota

apiVersion: v1
kind: ResourceQuota
metadata:
  name: rq-1
  namespace: nm-3
spec:
  hard:
    requests.memory: 1Gi
    limits.memory: 1Gi

Error Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  namespace: nm-3
spec:
  containers:
  - name: container
    image: kubetm/app

Pod1

apiVersion: v1
kind: Pod
metadata:
  name: pod-3
  namespace: nm-3
spec:
  containers:
  - name: container
    image: kubetm/app
    resources:
      requests:
        memory: 0.5Gi
      limits:
        memory: 0.5Gi

Error Pod2

apiVersion: v1
kind: Pod
metadata:
  name: pod-4
  namespace: nm-3
spec:
  containers:
  - name: container
    image: kubetm/app
    resources:
      requests:
        memory: 0.8Gi
      limits:
        memory: 0.8Gi

ResourceQuota2

apiVersion: v1
kind: ResourceQuota
metadata:
  name: rq-2
  namespace: nm-3
spec:
  hard:
    pods: 2

Pod2

apiVersion: v1
kind: Pod
metadata:
  name: pod-4
  namespace: nm-3
spec:
  containers:
  - name: container
    image: kubetm/app
    resources:
      requests:
        memory: 0.1Gi
      limits:
        memory: 0.1Gi

Error Pod3

apiVersion: v1
kind: Pod
metadata:
  name: pod-5
  namespace: nm-3
spec:
  containers:
  - name: container
    image: kubetm/app
    resources:
      requests:
        memory: 0.1Gi
      limits:
        memory: 0.1Gi

실습 과정

  1. Namespace 생성

  2. ResuorceQuota 생성 후 잘 만들어 졌는지 마스터에서 확인

    ResourceQuota 생성 확인

    kubectl describe resourcequotas --namespace=nm-3

    image

  3. Error Pod 생성하고 오류 확인 --> ResourceQuota가 있는데 resources를 명시하지 않아 오류가 생김

    image

  4. Error Pod2 생성하고 오류 확인 --> 현재 0.5Gi가 생성됐는데 0.8Gi를 요구해서 오류 발생

    image

  5. ResourceQuota2 생성 --> 파드 개수 2개 제한

  6. Pod2 생성

  7. Error Pod3 생성 --> 파드 생성 개수 초과 오류

    image

주의

Pod 생성 후 ResourceQuota를 생성하면 기존 Pod에 대해서 제한이 적용되지 않음
ResourceQuota를 만들기 전에 해당 NameSpace에 Pod가 존재하면 안 됨

3. LimitRange

image

Namespace

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

LimitRange

apiVersion: v1
kind: LimitRange
metadata:
  name: lr-1
  namespace: nm-5
spec:
  limits:
  - type: Container
    min:
      memory: 0.1Gi
    max:
      memory: 0.4Gi
    maxLimitRequestRatio:
      memory: 3
    defaultRequest:
      memory: 0.1Gi
    default:
      memory: 0.2Gi

Error Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  namespace: nm-5
spec:
  containers:
  - name: container
    image: kubetm/app
    resources:
      requests:
        memory: 0.1Gi
      limits:
        memory: 0.5Gi

실습 과정

  1. Namespace 생성

  2. LimitRange 생성

  3. 마스터노드에서 LimitRange 생성 확인

    kubectl describe limitranges --namespace=nm-5

    image

  4. Error Pod 생성 --> MaxLimit과 maxLimitRequestRatio 오류 발생(MaxLimit이 0.4인데 0.5를 요구했고, ratio는 3인데 5임)

    image

  5. Request와 Limit 설정 없이 생성 --> defaultRequest에 설정한대로 만들어짐

    image

주의해야할 점

  • 한 네임스페이스에는 여러 개의 LimitRange가 들어갈 수 있음
  • 만약 둘의 MaxLimit과 default가 다르면, 알 수 없는 오류가 발생하니 잘 맞춰야 함

출처

인프런 - 대세는 쿠버네티스