워크로드는 K8S 클러스트 위에서 동작하는 애플리케이션이다.
파드는 워크로드를 생성하는 기본 구성 요소이다.
배포가능한 가장 작은 단위이다.
파드는 하나 이상의 컨테이너를 실행할수 있다.
오직 하나의 컨테이너만 어플리케이션 컨테이너이고
나머지 컨테이너는 도우미이다.
파드는 VM을 제공하고 컨테이너는 프로세스를 제공한다.
간단한 파드 생성
K8S 요소 yaml format은 아래와 같다.
apiVersion: [api Version]
kind: [K8S의 워크로드 타입]
metadata:
[리소스 이름, 추가 레이블]
spec:
[워크로드 타입에 따라서 달라진다. 공식문서를 참고하자]
참고할 공식문서
https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/
실습
실습전 cluster 생성을 해야한다.
터미널을 따로 하나 킨 후 아래 명령어를 입력하자.
아래 명령어는 2초마다 kubectl get pod 명령어의 결과를 보여준다.
watch -t -x kubectl get pod
pod 정의
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx
pod 생성
kubectl create -f 01-simple-pod.yaml
pod 삭제
kubectl delete -f 01-simple-pod.yaml
다시 pod를 생성한 후
kubectl describe pod 명령어를 통해 세부 사항을 볼 수 있다.
문제가 발생했을때 디버깅을 위해 필요하며 가장 중요한 파트는 아래 Events 섹션이다
Pod 업데이트 방법
pod가 정의된 yaml을 create 한 후 변경 사항이 생겼을때 다시 kubectl create 을 하면 이미 존재한다는 에러가 발생한다
이 때 변경사항 적용을 위한 명령어는 아래와 같다.
kubectl apply -f [yaml file]
ex) kubectl apply -f 01-simple-pod.yaml
Image Pull Backoff
만약 존재하지 않는 이미지를 가져오려고 하면 에러가 발생한다.
pod가 정의된 yaml파일을 아래와같이 변경해보자
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx:ftgsedzfcvzx
파드를 생성하고 상태를 확인하면 에러가 난것을 볼 수 있다.
kubectl describe pod 명령어를 통해 이벤트 섹션을 살펴보면 자세하게 알 수 있다.
존재하지 않는 이미지를 가져오려고 해서 에러가 난 것을 확인 할 수 있다.
로그를 살펴보면 이미지를 가져오지 못해서 바로 작업을 삭제하는것이 아니라 반복해서 이미지를 가져오려고 한다.
Crash loop Backoff
아래 파일을 정의한다.
아래 파일은 실패하는 docker 이미지 이다.
02-failing-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: failing-container
image: vinsdocker/k8s-failing-container
kubectl create -f 02-failing-pod.yaml 명령어를 통해 파일을 실행시키고
kubectl get pod 명령어를 통해 확인해보면 Restarts가 점점 증가하는것을 확인할 수 있다.
그 후 Status가 CrashLoopBackOff 으로 변경된다.
이제 kubectl describe pod 로 이벤트를 확인해보자.
노드를 성공적으로 할당하고,
이미지를 성공적으로 가져온 후,
컨테이너가 실패한 후의 로그들이 담겨있다.
기본적으로 컨테이너를 다시 실행시킨다.
Pod status
Ready에서 1/1 의 앞은 현재 실행되고 있는 컨테이너 수, 뒤는 실제로 실행되어야 하는 컨테이너의 수이다.
Pending | 노드가 아직 할당되지 않았음 |
ContainerCreating | kubelet이 컨테이너 생성중 |
Running | kubelet이 컨테이너를 시작함 |
ErrImagePull / ImagePullBackOff | 이미지 pull 실패. kubelet이 약간의 지연후 재시도함 |
Completed | 컨테이너가 성공적으로 종료됨 |
Error | 컨테이너가 오류와 함께 종료됨 |
CrashLoopBackOff | 컨테이너 실행에 문제가 있음. kubelet이 지연후 재시도 (이미지 pull에 문제가 없을 때) |
Terminating | pod 삭제중 |
Pod labels
한 파일로 여러개의 Pod를 정의하는 방법이다
label은 키와 값의 쌍이다. 원하는 값을 정의할 수 있다.
03-multiple-pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
dept: dept-1
team: team-a
spec:
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Pod
metadata:
name: pod-2
labels:
dept: dept-1
team: team-b
spec:
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Pod
metadata:
name: pod-3
labels:
dept: dept-2
team: team-a
spec:
containers:
- name: nginx
image: nginx
pod 생성
kubectl create -f 03-multiple-pods.yaml
pod 확인
kubectl describe pod 을 사용하면 모든 파드를 가져온다
아래 명령어를 사용하면 단일 pod에 대한 정보만 가져올 수 있다.
kubectl get pod [파드이름]
ex) kubectl get pod pod-1
kubectl describe pod [파드이름]
ex) kubectl describe pod pod-1
label확인
아래 명령어를 사용하면 모든 파드의 label을 가져올 수 있다.
kubectl get pod --show-labels
# 결과 예시
NAME READY STATUS RESTARTS AGE LABELS
pod-1 1/1 Running 0 3m16s dept=dept-1,team=team-a
pod-2 1/1 Running 0 3m16s dept=dept-1,team=team-b
pod-3 1/1 Running 0 3m16s dept=dept-2,team=team-a
파드의 레이블을 검색할 수 있다.
# label의 team이 team-a 인 pod만
kubectl get pod -l team=team-a
# 결과
NAME READY STATUS RESTARTS AGE
pod-1 1/1 Running 0 6m6s
pod-3 1/1 Running 0 6m6s
-------------------------------------------------------
# label의 team이 team-a 가 아닌 pod만
kubectl get pod -l team!=team-a
# 결과
NAME READY STATUS RESTARTS AGE
pod-2 1/1 Running 0 5m41s
-------------------------------------------------------
# label이 dept는 dept-1 이고 team은 team-a인 pod만
kubectl get pod -l dept=dept-1,team=team-a
# 결과
NAME READY STATUS RESTARTS AGE
pod-1 1/1 Running 0 7m22s
Formatting output
pod에 대한 정보를 좀 더 자세하게 제공한다.
kubectl get pod -o wide
# 결과
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-1 1/1 Running 0 20h 10.244.1.7 dev-cluster-worker <none> <none>
pod-2 1/1 Running 0 20h 10.244.2.5 dev-cluster-worker2 <none> <none>
pod-3 1/1 Running 0 20h 10.244.1.8 dev-cluster-worker <none> <none>
yaml 형식 출력으로 볼수 있는 명령어는 아래와 같다.
kubectl get pod [pod이름] -o yaml
ex) kubectl get pod pod-1 -o yaml
Deleteing a pod
여러개의 파드를 생성하고 특정 파드만 지우고 싶은 상황이 있을 수 있다.
# pod 생성
kubectl create -f 03-multiple-pods.yaml
# pod-2 삭제
kubectl delete pod pod-2
# pod-3 삭제
kubectl delete pod/pod-3
Port Forward
쿠버네티스 클러스터의 node들은 네트워크를 통해 서로 연결이 되어있다. (노드 네트워킹)
node 컨테이너들은 자체 IP 주소가 있다.
쿠버네티스 API 서버에서 받는 요청을 컨테이너로 넘기기 위해서는 컨테이너의 포트를 열어 주어야 한다.
아래와 같은 yaml 파일 정의를 통해 port를 노출할 수 있다.
04-pod-port.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx
ports:
- name: "web-port"
containerPort: 80
pod를 실행 시킨 이후 아래 명령어를 통해서 포트를 매핑한다.
kubectl port-forward [파드이름] [K8S 포트번호]:[docker port 번호]
ex) kubectl port-forward my-pod 8080:80
http://localhost:8080/ 으로 접속하면 nginx 화면을 확인할 수 있다.
이러한 방법은 디버깅에 유용하다
Restart policy
pod의 재시작 정책에 대해서 서술한다.
05-restart-policy.yaml 을 정의한다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: ubuntu
image: ubuntu
pod를 실행하면 실행해야 할 작업이 없기 때문에 성공적으로 작업이 종료되고 영원히 재시작을 반복한다.
kubectl get pod -o yaml 명령어를 통해 확인해보면 restartPolicy가 Always로 정의가 된것을 확인할 수있다.
pod spec에 정의가 되어있지 않으면 default이기 때문이다
yaml 파일을 아래와 같이 수정한다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
restartPolicy: Never # Always, Never(다시 시작하지 않음), OnFailure (실패했을 때만)
containers:
- name: ubuntu
image: ubuntu
이제 다시 Pod 를 실행해보면 Status가 Completed 상태로 종료되고 restart가 이루어지지 않는것을 확인할 수 있다.
'Kubernetes' 카테고리의 다른 글
[Kubernetes] Cluster 학습 (0) | 2024.11.19 |
---|---|
[K8S] 쿠버네티스 기본 개념 (1) - 파드(Pod) (0) | 2023.03.18 |