쿠버네티스 안내서와 패스트캠퍼스 강의를 보고 작성한 포스팅입니다.
Pod는 하나 또는 여러개의 컨테이너를 포함한 쿠버네티스에서 사용하는 가장 작은 단위다.
이번에는 Pod을 생성하는 실습을 진행한다.
# 도커를 실행시키고 터미널에 명령어 입력
minikube start
# 실습할 디렉토리로 이동
cd Desktop/kube
Pod 생성
저번에는 만들어진 yaml 파일을 실행시키는 방법을 사용했었는데 이번에는 파일을 직접 만들어서 실행시켜보려고 한다.
# pod.yaml 파일 생성
vi pod.yaml
# pod.yaml 파일에 내용 작성
apiVersion: v1
kind: Pod
metadata:
name: echo
labels:
app: echo
spec:
containers:
- name: app
image: k8s.gcr.io/echoserver:1.10
# image는 쿠바네티스에서 기본 제공하는 이미지 사용
# 작성 후 esc :wq 엔터 해야 저장하고 yaml파일을 빠져나옴
# 파일 실행
kubectl apply -f pod.yaml
# pod가 잘 만들어졌는지 확인
kubectl get pod
직접 작성한 파일을 실행하면 pod/echo created라는 문구가 나온다.
kubectl get pod 명령어를 통해 내가 만든 echo라는 pod가 잘 만들어졌는지 확인할 수 있다.
pod 이름과 함께 status가 running인 상태면 잘 만들어진 것이다. ContainerCreating이라고 나오면 조금 기다렸다가 다시 명령어를 입력해주면 running으로 변경된다.
Pod 관련 명령어
namespace는 pod를 저장하는 폴더 같은 개념이라고 생각하면 된다.
아까 pod를 만들 때 따로 namespace를 지정해주지 않았기 때문에 default namespace에 저장이 된다.
# default namespace에 있는 pod 조회
kubectl get pod -n default
# 모든 namespace에 있는 pod 조회
kubectl get pod -A
# pod 하나만 조회
kubectl get pod 포드이름
# pod 하나를 자세히 조회
kubectl describe pod 포드이름
# pod 목록 출력
kubectl get pod -o wide
# pod 하나를 yaml 형식으로 출력
kubectl get pod 포드이름 -o yaml
# pod 로그 확인
kubectl logs 포드이름
# pod 로그 실시간 확인
kubectl logs 포드이름 -f
# pod 안에 있는 특정 컨테이너 로그 확인
kubectl logs 포드이름 -c 컨테이너이름
# pod 안에 있는 특정 컨테이너 로그 실시간 확인
kubectl logs 포드이름 -c 컨테이너이름 -f
실습
1. 다음 조건을 만족하는 pod 만들어보기
pod name : mongodb
pod label : app:mongo
container name : mongodb
container image : mongo:4
vi mongodb.yaml
apiVersion: v1
kind: Pod
metadata:
name: mongodb
labels:
app: mongo
spec:
containers:
- name: mongodb
image: mongo:4
# esc :wq enter
kubectl apply -f mongodb.yaml
kbuectl get pod
2. 다음 조건을 만족하는 pod 만들어보기
pod name : mysql
pod label : app:mysql
container name : mysql
container image : mysql:5.7
container 환경변수 : MYSQL_ROOT_PASSWORD: 123456
vi mysql.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
# esc :wq enter
kubectl apply -f mysql.yaml
kubectl get pod
Pod 내부 접속
# sh는 pod에 접속하겠다는 명령어
# kubectl exec -it 포드이름 -- 명령어
Kubectl exec -it echo -- sh
# 포드 내부로 들어왔음
# 여기서 아래 명령어 사용해보기
# ls
# ps
# exit
컨테이너 상태 모니터링
컨테이너를 생성했다고 해서 바로 서비스를 할 수 있는것은 아니다.
서버를 실행하면 어느정도의 시간이 지난 이후에 실제로 접속이 가능할 때 서비스가 준비되었다고 할 수 있다.
쿠버네티스는 컨테이너가 생성되고 서비스가 준비되었다는 것을 체크하는 옵션을 제공한다.
1. livenessProbe
컨테이너가 정상적으로 작동하지 않으면 컨테이너를 재시작하여 문제를 해결하는 방법을 제공하는 옵션이다.
yaml파일에 spec을 작성할 때 livenessProbe: 를 작성하여 컨테이너를 여러번 재시작 해보고, 지정한 횟수 이상 재시작했는데도 정상작동이 되지 않으면 Pod의 상태가 CrashLoopBackOff 상태로 변경된다.
vi echo-lp.yml
apiVersion: v1
kind: Pod
metadata:
name: echo-lp
labels:
app: echo
spec:
containers:
- name: app
image: ghcr.io/subicura/echo:v1
livenessProbe: # livenessProbe 작성
httpGet:
path: /not/exist # 없는경로
port: 8080 # 없는 포트번호
initialDelaySeconds: 5
timeoutSeconds: 2 # Default 1
periodSeconds: 5 # Defaults 10
failureThreshold: 1 # Defaults 3
# esc :wq enter
kubectl apply -f echo-lp.yml
kubectl get pod
echo-lp 는 일부러 실행이 안되게끔 만들었는데, 실행이 안되니 작성된 내용에 따라 RESTARTS가 여러번 된 것을 확인할 수 있다.
2. readinessProbe
컨테이너가 정상적으로 작동하지 않으면 Pod로 들어오는 요청을 제외하는 방법을 사용한다.
livenessProbe와의 차이는 문제가 생기면 Pod를 재시작하는 것이 아니라 요청만 제외한다는 점이다.
vi echo-rp.yml
apiVersion: v1
kind: Pod
metadata:
name: echo-rp
labels:
app: echo
spec:
containers:
- name: app
image: ghcr.io/subicura/echo:v1
readinessProbe: # readinessProbe 작성
httpGet:
path: /not/exist # 없는경로
port: 8080 # 없는 포트번호
initialDelaySeconds: 5
timeoutSeconds: 2 # Default 1
periodSeconds: 5 # Defaults 10
failureThreshold: 1 # Defaults 3
# esc :wq enter
kubectl apply -f echo-rp.yml
kubectl get pod
echo-rp 역시 실행이 안되게 코드를 작성했는데 RESTARTS를 진행하지 않았고, STATUS도 Running으로 표시되어있으나 READY의 경우 0/1로 표시되면서 사용할 수 없는 상태라는 것을 확인할 수 있다.
어플리케이션의 상황에 따라 livenessProbe와 readinessProbe를 적절하게 조정하여 사용하면 된다.
마무리
실습이 끝난 이후에는 반드시 사용한 환경을 정리해줘야한다.
이번에 만든 pod가 많기 때문에 잊지말고 pod제거, minikube stop 및 delete를 진행한다.
delete yaml파일을 하게되면 파일을 실행하면서 생성된 pod 뿐만아니라 관련 replica set, deployment등이 한번에 삭제되어 자주 사용하는 코드다.
# 특정 Pod 하나만 삭제
kubectl delete pod 포드이름
# yaml파일로 생성된 모든 리소스 삭제
kubectl delete -f 파일이름.yaml
minikube stop
minikube delete
'MLOps' 카테고리의 다른 글
10. 쿠버네티스 미니큐브로 간단한 실습 - Deployment (MacOS) (0) | 2022.01.21 |
---|---|
9. 쿠버네티스 미니큐브로 간단한 실습 - ReplicaSet (MacOS) (0) | 2022.01.19 |
7. 쿠버네티스 미니큐브로 간단한 실습 (MacOS) (0) | 2022.01.14 |
6. 쿠버네티스 실습 환경 구축 (minikube, MacOS) (0) | 2022.01.12 |
5. 맥북에서 MLOps 환경 구축; 맥북에 도커 설치, 도커 실행 (0) | 2022.01.11 |