매직코드
article thumbnail

쿠버네티스 안내서와 패스트캠퍼스 강의를 보고 작성한 포스팅입니다.

 

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

 

 

 

profile

매직코드

@개발법사

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!