일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- action
- 북딜
- IP
- 쿠버네티스 컨트롤러
- SRE
- Redux
- #Swagger-editor
- ecs
- Reducer
- 프로세스 통신
- Kubernetes
- javascript
- 카카오게임즈
- server
- fluentd
- React
- 쿠버네티스
- 프로세스
- Site Reliability engineering
- #Swagger-ui
- AWS
- docker
- 기술PM
- 모캠
- #스웨거
- #Swagger-codegen
- #Swagger
- 모두의캠퍼스
- #api 문서화
- React.js
- Today
- Total
탕구리's 블로그
[Kubernetes] #3 파드(pod) 설정 및 사용하기 본문
** 해당 도서를 구매하며 학습해보며 내용을 정리하는 목적으로 글을 작성하였습니다.
** 문제가 되는 경우 말씀해주시면 조치를 취하도록 하겠습니다. 감사합니다 :)
파드(Pod)란 무엇인가..?
파드란 실제로 마스터와 연결된 노드에서 작업을 수행하는 최소 단위입니다.
"엥?! 무슨 소리? 컨테이너가 최소 단위 아니야?"라고 생각할 수 있지만 파트의 경우 여러 개의 컨테이너를 묶어서 관리하게 되고 쿠버네티스에서는 파드를 작업 수행의 최소 단위로 구분합니다. 파드를 구성하는 컨테이너가 단일인 경우에는 물리적으론 단일 컨테이너가 작업을 수행하는 최소 단위가 될 수 있을 것 같네요.
마스터 노드, 워커 노드에 대한 기본적인 작업(join)이 되어 있는 경우 워커노드에 파드를 구동할 수 있는 기본 예제입니다.
파드를 구성하기 위해 사용하는 기본 템플릿 구조와 하위 명령어들에 대해서 알아봅시다.
# 기본적으로 파드를 구동하기 위해 생성하는 템플릿 샘플
apiVersion: v1
kind: Pod
metadata:
name: simple-pod
labels:
app: simple-pod
spec:
containers:
- name: simple-pod
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 8080
- apiVersion은 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전이 어떤 것인지에 대한 명세를 진행합니다. 사용하는 apiVersion에 따라 어떤 명령어 수행이 가능한지 판별이 되는 것 같네요.
- kind는 어떤 종류의 Object를 생성할지 명세합니다. 현재 저희는 파드를 구성하기 위한 yaml 템플릿을 제작하고 있으므로 Pod를 작성해 줍니다.
- metadata: 흔히 데이터에 대한 정보라고 하죠? 해당 오브젝트의 이름이나 레이블 등을 설정할 수 있습니다. 어디에 사용하는지 아직까지는 정확히 모르겠지만. 뒷부분에 대한 공부를 진행하다 보면 알 수 있을 것 같습니다.
- spec: 실제 파드가 어떤 컨테이너를 실행하고 어떤 행동을 할지에 대한 명세가 들어갑니다.
$ kubectl describe pods simple-pod
해당 명령을 통해 파드가 어떤 설정을 통해 설정을 확인해볼 수 있습니다.
파드의 생명주기
[Conatainers.simple-pod.Status]
1. Pending - 파드가 컨테이너를 생성하는 중
2. Running - 말 그대로 구동 중인 상태
3. Succeeded - 정상적으로 실행 종료가 된 상태
4. Failed - 파드 안 컨테이너 중 정상 종료되지 않은 컨테이너가 존재
5. Unkown - 파드 상태 파악 불가
[Conditions.Type]
1. Initialized - 초기화 컨테이너가 성공적으로 시작 완료
2. Ready - 파드가 요청을 실행할 수 있고 모든 서비스의 로드밸런싱 풀에 추가되어야 한다는 의미
3. Container Ready - 파드의 모든 컨테이너가 준비 완료된 상태
4. PodScheduled - 파드가 하나의 노드로 스케줄을 완료
5. Unschedulable - 스케쥴러가 자원의 부족이나 다른 제약으로 지금 당장 파드를 스케줄 할 수가 없는 상태
kubelet을 통한 컨테이너 진단
컨테이너가 실행되고 난 후에는 kubelet이 컨테이너의 상태를 지속적으로 체크합니다.
상태를 나타내는 두 가지의 지표(Probe)가 있습니다.
1. livenessProbe
- 컨테이너가 실행됐는지에 대한 여부를 확인합니다. 진단이 실패하면 kubelet에 의해 지정해둔 정책을 기반으로 명령을 실행합니다. 컨테이너에 livenessProbe에 대해 명시하지 않았다면 default는 Success입니다.
2. readnessProbe
- 요청에 대한 응답이 가능한지 체크한다. 응답이 불가능하다고 판단되는 경우 endpoint-controller는 더 이상 해당 파드에 요청이 들어갈 수 없도록 파드에 연결된 모든 서비스를 대상으로 엔드포인트 정보를 제거합니다.
위와 같은 두 가지의 probe를 진단하기 위해서 kubelet은 핸들러를 호출합니다.
[Handler]
1. ExecAction
- 컨테이너 안에 지정된 명령을 실행하여 상태 판단.
2. TCPSocketAction
- TCP상태를 확인하고 포트가 열려있는지 확인 후 판단.
3. HTTPGetAction
- HTTP Get 요청에 대한 응답이 가능(status code 200-400)하면 성공으로 진단
파드에 CPU와 메모리 자원 할당하기
하나의 워커 노드에 여러 개의 파드를 실행하게 된다면 파드마다 사용하는 시스템 리소스에 대한 양이 다르고 특정 파드에 노드의 리소스가 몰리는 현상이 발생할 수 있습니다. 자원 부족으로 인해 특정 파드가 리소스 부족으로 인해 성능이 나빠질 수도 있고 자원이 남는 노드에는 리소스가 낭비될 수도 있습니다. 이를 방지하기 위해 파드에서 사용하는 리소스에 대한 최소사양(requests)과 최대 사양(limit)을 설정할 수 있습니다.
다음 필드를 통해 설정할 수 있습니다.
- .spec.containers[].resources.requests.cpu
- .spec.containers[].resources.requests.memory
- .spec.containers[].resources.limits.cpu
- .spec.containers[].resources.limits.memory
# 파드에 cpu와 메모리 자원 할당에 대한 테스트를 진행
apiVersion: v1
kind: Pod
metadata:
name: simple-pod
labels:
app: simple-pod
spec:
containers:
- name: simple-pod
image: arisu1000/simple-container-app:latest
resources:
requests:
cpu: 0.1
memory: 200M
limits:
cpu: 0.5
memory: 1G
ports:
- containerPort: 8080
cpu 항목에 대해서 살펴보면 할당량이 실수 형태로 설정되어 있습니다. 쿠버네티스에서는 정수 형태(1,2,3)를 통해 해당 파드에서 가용할 수 있는 cpu 코어의 개수를 설정할 수 있지만, 실수 형태(ex 0.1, 0.5)를 통해 하나의 코어에서 몇 퍼센트의 성능을 가용할지도 설정할 수 있습니다.
파드에 환경 변수 설정
컨테이너에서 환경변수를 사용하기 위한 방법입니다.
# 파드 환경설정에 대한 템플릿 샘플
apiVersion: v1
kind: Pod
metadata:
name: simple-pod
labels:
app: simple-pod
spec:
containers:
- name: simple-pod
image: arisu1000/simple-container-app:latest
resources:
requests:
cpu: 0.1
memory: 200M
limits:
cpu: 0.5
memory: 1G
ports:
- containerPort: 8080
env:
- name: ENV_TEST
value: "test_env"
- name: HOSTNAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: HOSTNAME
valueFrom:
resourceFieldRef:
containerName: simple-pod
resource: requests.cpu
환경 변수를 지정하기 위한 필드 구조는. spec.containers[].env []입니다.
1. name: 사용할 환경 변수의 이름을 설정
2. value: 문자열이나 숫자 형식의 값을 설정합니다.
3. valueFrom: 값을 직접 할당하는 것이 아니라 어딘가 다른 곳에서 참조하는 값을 설정합니다.
4. fieldRef: 파드의 현재 설정 내용을 값으로 설정한다.
5. fieldPath: fieldRef에서 어디서 값을 가져올 것인지 지정합니다. 즉, 값을 참조하려는 항목의 위치를 지정합니다.
6. resourceFieldRef: 컨테이너에 CPU, 메모리 사용량을 어마나 할당했는지에 관한 정보를 가져옵니다.
7. containerName: 환경 변수 설정을 가져올 컨테이너 이름을 설정합니다.
8. resource: 어떤 자원의 정보를 가져올지 설정합니다.
파드를 재실행하고 env가 제대로 설정되었는지 확인해보자~!
$ kubectl exec -it simple-pod sh
환경변수가 제대로 설정된 것을 확인할 수 있다!
이번 포스팅에서는 파드에 대한 기본적인 이론과 간단한 실습을 통해 내용을 정리해 보았다.
일단, 신기하다. 그리고 재미있다. 얼른 뒷부분 계속해서 공부해야겠다 :)
'devOps' 카테고리의 다른 글
[Kubernetes] #5 NodePort, port, targetPort (feat.쉬어가기) (0) | 2020.06.14 |
---|---|
[Kubernetes] #4 컨트롤러(Controller) 개념정리 (0) | 2020.06.07 |
nginx 인증 모듈 연동하기(with LDAP) (0) | 2020.05.01 |
Docker network는 어떻게 구성되어 있을까? (0) | 2020.04.15 |
Docker Daemon Log (0) | 2020.04.09 |