본문 바로가기

클라우드/쿠버네티스(Kubernetes)

쿠버네티스 Kubernetes Pod

# Pod의 특징

파드안에는 하나의 독립적인 서비스를 구동할 수 있는 컨테이너들이 있다. 그 컨테이너들은 서비스가 연결될 수 있도록 포트를 가지고 있는데 한 컨테이너가 포트를 하나 이상 가질 수 있지만 한 파드내에서 컨테이너들끼리 포트가 중복될 수 없다. 이 두 컨테이너는 한 호스트로 묶여있다. Container1 에서 Container2로 접근할 때 localhost:8080으로 접근 가능하다.

파드가 생성될 때 고유의 IP 주소가 할당이 되는데, 쿠버네티스 클러스터내에서만 이 IP를 통해 파드에 접근할 수 있고, 외부에서는 이 IP로 접근할 수 없다. Pod에 문제가 생기면 System이 감지를 해서 파드를 삭제시키고 재생성하게 되고 IP는 변경이 된다.

 

더보기

apiVersion: v1
kind: Pod
metadata: pod-1
  name: pod-1
spec:
  containers:
  - name: container1
    image: ldhkube/p8000
    ports:
    - containerPort: 8000
  - name: container2
    image: ldhkube/p8080
    ports:
    - containerPort:8080

→  한 파드에 여러 컨테이너를 담을 수 있다.

 

# Label의 속성

라벨은 Pod 뿐만 아니라 모든 오브젝트에 달수있는데 파드에서 가장 많이 사용된다. 목적에 따라 오브젝트들을 분류하고 그 분류된 오브젝트들만 따로 골라서 연결을 하기 위해 사용된다. Label은 Key와 Value가 한쌍이다. 한 파드에는 여러개의 라벨을 달 수 있다.

 

key가 type이고 value가 web인 파드가 두개 있다 (pod1,pod4) web이라고 붙어있는 라벨의 위치가 하나는 dev(개발환경)에 있고 다른 하나는 production(상용)에있다. web,db,server가 있는데 한쌍으로 (pod1,pod2,pod3) 개발서버에 하나가 있고 다른 한쌍은 상용에서 돌아가는 파드들이다. 이상황에서 웹 개발자가 웹 화면만 보고싶다고 하면 type이 web인 라벨이 달린 파드들을 서비스에 연결해서 이 서비스의 정보를 웹 개발자에게 알려주면 된다. 상용환경을 담당하는 운영자라고 하면 lo에 production이라고 붙은 라벨이 달린 pod들을 서비스에 연결해서 이 서비스 정보를 운영자에게 알려주면 각각의 담장자는 자신이 원하는 파드들만 골라서 접속을 할수있게 된다. 이렇게 사용 목적에 따라 라벨을 등록해놓으면 해시태그를 붙여서 검색용도로 사용하듯 원하는 파드를 선택해서 사용할수있다.

 

더보기

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  labels:           # key와 value형식으로 내용을 넣을 수 있다.
    type: web
    lo: dev
spec:
  containers:
  - name: container
    image: ldhkube/init
    
 
apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:        # 추후 서비스를 만들 때 selector에 key와 value를 넣으면 해당 내용과 매칭되는
    type: web        라벨이 붙어있는 파드에 연결이 된다.
  ports:
    - port: 8080

 

# Node Schedule

파드는 여러 노드들 중 한 노드에 올라간다. 직접 노드를 선택하는 방법과 쿠버네티스가 자동으로 지정해주는 방법이 있다.

직접선택하는 방법은 파드에 라벨을 단 것처럼 노드에 라벨을 달고 파드를 만들 때 노드를 지정할 수 있다.

파드를 만들 때 nodeSelector 항목에 Node의 라벨과 매칭되는 key, value를 넣어주면 된다.

더보기

apiVersion: v1
kind: Pod
metadata:
  name: pod-3
spec:
  nodeSelector:        
    hostname: node1
  containers:
  - name: container
    images: ldhkube/init

 

쿠버네티스의 스케줄러가 판단해서 지정해주는 경우, 노드에는 전체 사용가능한 자원량이 있다. 파드를 생성할 때 파드에서 요구 될 리소스의 사용량을 명시할 수 있는데, 스케줄러가 판단하여 남은 메모리가 있는 노드에 파드를 스케줄링 해준다. 사용량을 설정하지 않으면 파드 안에있는 앱에서 부하가 생길 때 무한정 노드에 있는 자원을 사용하려 할 것이고 그 노드에 있는 다른 파드들은 자원이 없어지게 된다.

memory의 경우 limits를 넘어버리면 바로 파드를 종료시킨다. 반면 cpu의경우 limits를 넘으면 request 수치까지 낮추고 파드는 종료시키지는 않는다. memory와 cpu가 다르게 동작하는 이유는 각 자원에 대한 특성 때문이다. 예를 들어 파일을 복사할때 하나를 복사하고있는데 또다를 하나를 복사하면 첫번째 파일이 느려지면서 두번째 파일이 복사된다. 프로세스들이 cpu자원을 사용하는데에 있어 서로 문제를 일으키지 않는다. 파일을 복사하는데 두번째 파일이 첫번쨰 파일이 쓰는 메모리를 침범했을때는 프로세스간에 치명적인 문제를 일으킨다.

더보기

apiVersion: v1
kind: Pod
metadata:
  name: pod-4
spec:
  containers:
  - name: container
    images: ldhkube/init
    resources:
      requests:
        memory: 2Gi       # memory 2G 요구
      limits:             # 최대 허용 메모리
        memory: 3Gi

 

 

 

출처:

https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B8%B0%EC%B4%88 인프런 강의를 보고 정리 하였습니다.