[k8s] Pod란 (2)

pipi·2023년 6월 27일
0

인프라

목록 보기
7/12

1. 📌 Pod YAML 속성

1.1 실행 명령 및 파라미터 지정

apiVersion: v1
kind: Pod
metadata:
  name: cmd
spec:
  restartPolicy: OnFailure #echo 명령어는 실행 후 종료되기에, 실패시에만 재시작하도록
  containers: 
  - name: nginx
    image: nginx
    command: ["/bin/echo"] #실행명령 지정
    args: ["hello"] #실행명령에 넘겨줄 파라미터 지정

즉, echo hello를 하겠다는 뜻이다.

1.2 환경변수 설정

apiVersion: v1
kind: Pod
metadata:
  name: env
spec:
  containers: 
  - name: nginx
    image: nginx
    env: # env 속성으로 넘겨준다.
    - name: hello  # 환경변수 key 지정,
      value: "world!" # 환경변수 value 지정,

kubectl apply -f env.yaml : pod 생성
kubectl exec env -- printenv | grep hello : hello=world! 확인

1.3 볼륨 연결

pod가 사라지면 데이터도 날라간다. 이를 지속적으로 저장하기 위해, 볼륨을 사용한다.
여러가지 볼륨타입이 존재하나, 기본인 host Volume을 사용한다. (호스트 서버에 저장)

# volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: volume
spec:
  containers: 
  - name: nginx
    image: nginx

    # 컨테이너 내부의 연결 위치 지정
    volumeMounts:
    - mountPath: /container-volume # 컨테이너 내부 연결 위치
      name: my-volume # 동일하게(연결하는 식별자로 사용됨)
  
  # host 서버의 연결 위치 지정
  volumes:
  - name: my-volume #동일하게
    hostPath:
      path: /home # 호스트 서버 연결 위치

추가로, 호스트 서버 연결말고, 컨테이너끼리 파일 데이터를 주고 받을 때 사용되는 volumn도 존재한다.

apiVersion: v1
kind: Pod
metadata:
  name: volume-empty
spec:
  containers: 
  - name: nginx
    image: nginx
    volumeMounts:
    - mountPath: /container-volume
      name: my-volume
  volumes:
  - name: my-volume
    emptyDir: {} # 해당 부분이 차이점이다.

pod의 생명주기를 따라가며, 기존과 다르지 않으나, 2개 이상의 컨테이너끼리 디렉터리 공간을 공유할 때 사용된다.

2. 📌 리소스 관리

2.1 최소, 최대 리소스 사용량 - requests, limits

# requests.yaml
apiVersion: v1
kind: Pod
metadata:
  name: requests
spec:
  containers: 
  - name: nginx
    image: nginx
    resources:
      requests: # 최소 사용량
        cpu: "250m" # 0.25core. 1000m = 1core
        memory: "500Mi" # Mi = 1MiB = 2^20 Bytes
      limits:   # 최대 사용량
        cpu: "500m"
        memory: "1Gi"

최대 메모리 사용량을 넘을 경우, 프로세스가 중단 됨 => 전체 서버에 영향을 주지 않음.

3. 📌 상태 확인(Health Check)

컨테이너의 상태를 주기적으로 체크해서, 문제가 있는 컨테이너를 자동으로 재시작하거나 삭제.

3.1 livenessProbe

pod가 정상적으로 동작하는지 확인, 자가치유를 위한 판단기준으로 활용됨.

# live.yaml
apiVersion: v1
kind: Pod
metadata:
  name: liveness
spec:
  containers: 
  - name: nginx
    image: nginx
    livenessProbe: # 정상적으로 작동하는지
      httpGet: # 뭘 기준으로? HTTP Get method를 사용해, 상태 확인!
        path: /live # http 주소
        port: 80 # http 포트 번호

기본적으로,nginx에서는 /live 라는 API가 없다. 그렇기에 계속 404에러를 받으며,
쿠버네티스는 Pod를 강제로 재시작(자가치유)한다.

실습해보자.
kubectl apply -f live.yaml : pod 생성
kubectl logs -f liveness : 로그 확인 ->사진과 같이 에러가 뜬다.

kubectl exec liveness -- touch /usr/share/nginx/html/live : 에러를 해결해보자
kubectl logs -f liveness : 로그 확인 ->사진과 같이 해결되었다!

kubectl get pod liveness : restart를 3번한 것을 알 수 있다. 알아서 자가치유한 것이다

3.2 readinessProbe

livenessProbe와 달리, pod가 살아있는지 확인하는게 아니라 트래픽을 받을 준비가 되었는지 확인한다.
웹서비스의 경우 구동이 다 된 후에, 트래픽을 받아야 한다.
준비가 되지 않았다면, kubectl get pod 에서 Ready가 1/1이 아닌, 0/1이 찍힌다.
즉, livenessProbe와 달리, 컨테이너를 재시작하는게 아닌, 해당 Pod를 사용할 수 없음으로 표시하고, 서비스에서 제외한다

# readiness.yaml
apiVersion: v1
kind: Pod
metadata:
  name: readiness
spec:
  containers: 
  - name: nginx
    image: nginx
    readinessProbe:
      httpGet:
        path: /ready
        port: 80

다음과 같이 0/1이 뜰 것이다.

kubectl get pod
# NAME        READY   STATUS      RESTARTS   AGE
# readiness   0/1     Running     0          2m

이 뒷내용은 추후에 실제로 쓰이게 될때 정리하겠다.

0개의 댓글

관련 채용 정보