[kubernetes-실습] deployment 의 CPU, Memory 제약

deployment 의 리소스 제약 실습해보기

stress tool을 사용하여  실습해 보자.
먼저 stress container yaml 파일을 만들어 제약 조건을 yaml 파일에 추가하면서 테스트 해본다.

기본으로 stress app 배포

ps0107@k8smaster1:~$ kubectl create deployment stress --image vish/stress
deployment.apps/stress created

 

deployment 리소스 확인

ps0107@k8smaster1:~$ kubectl get deployment                                                                                               
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
stress   1/1     1            1           9s

 

stress 객체 자세히 보기

ps0107@k8smaster1:~$ kubectl describe deployment stress                                                                                   
Name:                   stress
Namespace:              default
CreationTimestamp:      Wed, 29 Jan 2020 06:49:09 +0000
Labels:                 app=stress
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=stress
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=stress
  Containers:
   stress:
    Image:        vish/stress
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   stress-6678575566 (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  30s   deployment-controller  Scaled up replica set stress-6678575566 to 1

 

stress 리소스에서 yaml 형태 정보 보기

ps0107@k8smaster1:~$ kubectl get deployment stress -o yaml                                                                                
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2020-01-29T06:49:09Z"
  generation: 1
  labels:
    app: stress
  name: stress
  namespace: default
  resourceVersion: "108105"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/stress
  uid: 9336e33d-f185-4184-bcc1-e10c01e6cce0
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: stress
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: stress
    spec:
      containers:
      - image: vish/stress
        imagePullPolicy: Always
        name: stress
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2020-01-29T06:49:13Z"
    lastUpdateTime: "2020-01-29T06:49:13Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2020-01-29T06:49:09Z"
    lastUpdateTime: "2020-01-29T06:49:13Z"
    message: ReplicaSet "stress-6678575566" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

 

stress 리소스로 부터 yaml 템플릿 생성하기

ps0107@k8smaster1:~$ kubectl get deployment stress --export -o yaml > stress.yaml                                                         
Flag --export has been deprecated, This flag is deprecated and will be removed in future.

# stress yaml 파일 설정에 resource 의 memory 설정 추가하기
ps0107@k8smaster1:~$ vi stress.yaml    
....    
      resources:
          limits:
            memory: 4Gi
          requests:
            memory: 2500Mi
....

 

현재 설정되어 있는 stress 리소스 업데이트

ps0107@k8smaster1:~$ kubectl replace -f stress.yaml 
deployment.extensions/stress replaced

 

업데이트 된 stress 리소스에 수정 사항 반영 되었는지 확인해보기

ps0107@k8smaster1:~$ kubectl get deployment stress -o yaml                                                                               
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "2"
  creationTimestamp: "2020-01-29T06:49:09Z"
  generation: 2
  labels:
    app: stress
  name: stress
  namespace: default
  resourceVersion: "108620"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/stress
  uid: 9336e33d-f185-4184-bcc1-e10c01e6cce0
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: stress
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: stress
    spec:
      containers:
      - image: vish/stress
        imagePullPolicy: Always
        name: stress
        resources:
          limits:
            memory: 4Gi
          requests:
            memory: 2500Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2020-01-29T06:49:13Z"
    lastUpdateTime: "2020-01-29T06:49:13Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2020-01-29T06:49:09Z"
    lastUpdateTime: "2020-01-29T06:55:17Z"
    message: ReplicaSet "stress-5454644b8d" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 2
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

 

현재 pod 리스트 확인

ps0107@k8smaster1:~$ kubectl get po
NAME                      READY   STATUS    RESTARTS   AGE
stress-5454644b8d-vlpwf   1/1     Running   0          51s

 

특정 파드에 대한 로그 확인하기

ps0107@k8smaster1:~$ kubectl logs stress-5454644b8d-vlpwf 
I0129 06:55:16.672508       1 main.go:26] Allocating "0" memory, in "4Ki" chunks, with a 1ms sleep between allocations
I0129 06:55:16.672581       1 main.go:29] Allocated "0" memory

 

stress.yaml 파일 resource 설정에 cpu 추가하기

stress를 주기위해 args를 추가한다.

ps0107@k8smaster1:~$ vi stress.yaml 
....
        resources: 
          limits:
            cpu: "1"
            memory: "4Gi"
          requests:
            cpu: "0.5"
            memory: "500Mi"
        args:
        - -cpus
        - "2"
        - -mem-total
        - "950Mi"
        - -mem-alloc-size
        - "100Mi"
        - -mem-alloc-sleep
        - "1s"
....

 

수정된 내용 적용하기 위해 지우고 다시 배포

ps0107@k8smaster1:~$ kubectl delete deployment stress                                                                                    
deployment.extensions "stress" deleted

ps0107@k8smaster1:~$ kubectl create -f stress.yaml 
deployment.extensions/stress created

 

생성된 pod 정보를 보고 worker 노드에 생성이 된걸 알수 있다. 

실제 worker node에 TOP 명령으로 리소스를 확인해 본다.


master, second node에 접속하여 top 명령 수행하여 확인하면, 즉시 memory가 100M chunk로 할당되고 cpu 사용률이 증가 됨을 확인 할 수 있다.

ps0107@k8smaster1:~$ kubectl get pod -o wide                                                                                              
NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
stress-56444c5d8b-h4qtf   1/1     Running   0          23s   192.168.1.9   k8sworker1   <none>           <none>

 

 

 

 


참조) CKA 대비 간단 실습

01. kubeadm 을 이용한 설치 및 세팅
02. kubernetes 클러스터 노드 확장 및 셋팅
03. 간단한 application 배포, yaml템플릿, 서비스 expose 해보기
04. deployment 의 CPU, Memory 제약
05. namespace 를 위한 resource limit 설정
06. 좀더 복잡한 deployment 배포해보기
07. 기본 Node 의 maintenance (유지보수)
08. API AND ACCESS
09. API 객체
10. Managing State with Deployments
11. Service Resource
12. Volumes and Data : ConfigMap 간단 테스트
13. PV 와 PVC 생성
14. ResourceQuota 사용 (PVC Count 와 Usage를 제한)
15. ingress 간단 실습
16. Scheduling - label 사용한 pod 할당
17. Scheduling - Taint를 이용한 pod 배포 관리
18. 로깅과 트러블슈팅 : 로그위치와 로그 출력 보기
19. 로깅과 트러블슈팅 : Metrics와 DashBoard
20. CRD (Custom Resource Definition)
21. helm
22. Security - TLS
23. Security - Authentication, Authorization, Admission
24. HA(High Availability) 구성 - master node