본문 바로가기

Study/도커씨와쿠버씨

[K8s] 컨테이너 특징 및 리소스 설정, 1 컨테이너 N 프로세스 가능?

파드 특징과 Cpu limit

파드

  • 하나이상의 컨테이너 그룹, 애플리케이션 배포 기본 단위

파드의 컨테이너(Container) 특징

  • Pod 당 컨테이너 하나가 일반적인 유스 케이스
  • 여러 컨테이너가 단일 Pod안에 존재 가능함, 완전한 서비스 컨테이너를 다중으로 가지는 것은 권장 X
    • ex) 완전한 웹서버 컨테이너 2개가 1개의 Pod안에 존재하는 것은 XX
    • 완전한 웹서버 컨테이너를 서포트(보조)할 수 있는 컨테이너가 같이 있는 것은 OO
    • 이때, 보조 컨테이너를 사이드카 컨테이너라고 부름
  • Container는 서비스가 연결될 수 있도록 port를 가짐
  • Container는 다중 port를 가질 수 있지만, Container 끼리 port 중복 XX

파드 컨테이너 정의

  • containers [] 밑에 각 정보 입력
apiVersion: batch/v1
kind: Pod
metadata:
  name: hello
spec:
  template:
   
    spec:
      containers:
      - name: 
        image: 
        command: ['']
      restartPolicy: OnFailure

파드 컨테이너 리소스 관리

  • 리소스 정의하는 법은 containers.resources에서 request와 limit
apiVersion: batch/v1
kind: Pod
metadata:
  name: hello
spec:
  template:
    spec:
      containers:
      - name: 
        image: 
        command: ['']
      restartPolicy: OnFailure
	resources:
		requests:
			memory : "64Mi"
			cpu : "300m"
		limits:
			memory : "128Mi"
			cpu "500m"
  • requests : 컨테이너 생성 시 사용하는 자원
  • limit : 컨테이너가 필요시 사용할 수 있는 최대 자원
Memory 단위
  • Mi = MIB, 64MI = 64MB
  • Ei, Pi, Ti, Gi, Mi, Ki 단위 사용, 줄여서 E, P, T, G, M, K
CPU 단위
  • 1000(milicore, 밀리 코어) = 1 CPU core, 
  • 500m = 0.5 core
us : 1/1000000초 , 마이크로초
ms = us * 1000 = 1/1000초 , 밀리초  

1 cpu = 1000 milicore = 100000 us , 밀리 코어 * 100 = us

" cpu : 3"으로 설정했으면 -> 밀리 코어 단위로 환산하면 , 3000m이라는 값이 나옴

여기서 100을 곱한 30000 값이 cpu.cfs_quota_us로 설정이 됨

 

이때, kubernetes는 cpu_cfs_period_us 값을 10000us로 고정해두는데, 100ms 시간 동안 사용할 수 있는 모든 cpu에서 사용된 cpu.time의 합이 300ms만큼의 퍼포먼스를 냄


단일 컨테이너에서 프로세스 여러 개 돌아감?

https://tansfil.tistory.com/69

 

도커 컨테이너에서 멀티 프로세싱을 하면?

데이터 엔지니어링을 하다 보면 실제로 컴퓨팅 리소스를 최대한으로 사용할 수 있도록 멀티스레딩 혹은 멀티프로세싱을 사용한다. 더불어 요새는 국 룰이 돼버린 컨테이너를 활용해서 프로세

tansfil.tistory.com

공식 문서

1. 컨테이너 n 프로세스 보단, 싱글 프로세스 n 컨테이너(컨테이너 여러개 만들어서 그냥 써라)

2. 하고 싶으면 프로세스 관리자를 entrypoint에서 실행시켜라


Entrypoint? 엔트리 포인트?

  • CMD 명령어와 비슷
  • 도커 컨테이너 생성 시 초기에 항상 실행되어야 하는 커맨드 특징
# api.py 실행
ENTRYPOINT ["python3", "api.py"]

도커 Entrypoint vs K8s Entrypoint

 

Difference between Docker ENTRYPOINT and Kubernetes container spec COMMAND?

Dockerfile has a parameter for ENTRYPOINT and while writing Kubernetes deployment YAML file, there is a parameter in Container spec for COMMAND. I am not able to figure out what's the difference a...

stackoverflow.com

 

# DockerFile
ENTRYPOINT ["/bin/echo", "Welcome"]
# K8s yaml
kind: Pod
spec:
  containers:
  - image: some/image
    command: ["/bin/echo"]
    args: ["arg1"]

 

  • kubernetes의 yaml 파일에 적힌 command는 도커 파일의 entrypoint를 덮어 씌움
    • k8s의 command로 실행, 즉 쿠버의 command = 도커의 Entrypoint와 동일
  • yaml파일에 command나 args를 입력하지 않으면 Dockerfile의 EntryPoint 실행