반응형

Pod args - Exec Form

args 를 사용하면 docker container에 인수를 전달할 수 있다.

06-pod-args.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  restartPolicy: Never
  containers:
    - name: ubuntu
      image: ubuntu
#      이 방법도 가능하고 아래 방법도 가능하다
#      args: ["date"]
      args:
      - "date"

 

Pod container logs

kubectl logs [파드 이름]
ex) kubectl logs my-pod

 

Pod args - shell form

docker 내부에 bash로 진입해서 shell 명령어를 실행하는 방법을 pod 정의 yaml 파일에서 정의한다.

07-pod-shell-args.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  restartPolicy: Never
  containers:
    - name: ubuntu
      image: ubuntu
      args:
      - "/bin/sh"
      - "-c"
      - "echo This is my path: $PATH"

 

이후 파드를 실행하고 로그를 확인해보면 yaml에 정의한 쉘 명령어가 실행된것을 확인할 수 있다.

 

Termination Grace Period

Pod의 종료 과정에서 kubelet이 컨테이너에게 종료 명령을 보내서 안전한 종료를 유도한다.
하지만 때로는 pod가 실제로 반응하지 않는 절전 모드에 들어갈 수 있다.
그래서 k8s는 기본적으로 30초동안 기다린 후 pod 를 삭제한다.
이 값을 변경할 수 있다.

08-pod-termination-garce-period.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  restartPolicy: Never
  containers:
    - name: ubuntu
      image: ubuntu
      args:
      - "sleep"
      - "3600"



해당 pod를 정의하고 실행후 삭제해보면 Status가 Terminating으로 변경되고
30초 후에 해당 pod가 삭제되는걸 확인할 수 있다.
이 때 terminationGracePeriodSeconds 를 사용해서 종료되는 시간을 변경할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  restartPolicy: Never
  # 이 부분을 추가한다.
  terminationGracePeriodSeconds: 1
  containers:
    - name: ubuntu
      image: ubuntu
      args:
      - "sleep"
      - "3600"

이후 pod 를실행하고 삭제해보면
1초 후 바로 pod가 삭제되는걸 확인할 수 있다.

Pod command

docker의 entrypoint가 정의되어있으면 기존 args로 명령을 내려도 반응이 없다.

09-pod-command.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  restartPolicy: Never
  containers:
    - name: entrypoint
      image: vinsdocker/k8s-entrypoint
      args:
        - "date"

해당 pod를 정의하고 실행해서 로그를 확인해보자


date 명령어가 제대로 실행되지 않은것을 확인할 수 있다.
command를 사용해서 명령어를 재정의할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  restartPolicy: Never
  containers:
    - name: entrypoint
      image: vinsdocker/k8s-entrypoint
      command:
        - "date"

yaml 파일을 변경하고 다시 실행해서 로그를 확인해보면 재정의가 된 것을 확인할 수 있다.

 

Environment variable

pod yaml을 통해 생성하는 docker 컨테이너에 환경 변수를 전달하는 방법을 알아보자
몇가지 방법이 더 있지만 가장 기본적인 방법을 소개한다.
env를 통해서 전달할 수 있다.

10-pod-env.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  restartPolicy: Never
  containers:
    - name: ubuntu
      image: ubuntu
      env:
        - name: "request.timeout"
          value: "10ms"
        - name: "spring.profiles.active"
          value: "dev"
      args:
        - "env"

 

이제 pod를 실행하고 로그를 확인해보면
정상적으로 환경 변수들이 전달된 것을 확인할 수 있다.

 

Exploring Pod Container

원격 클러스터에서 실행중인 Pod에 접근하는 방법을 설명한다.

기존에 생성했던 01 pod 를 실행 시키고 내부로 접근해보자

# 파드 실행
 kubectl create -f 01-simple-pod.yaml
# 파드 내부 컨테이너에 bash 쉘로 접속
 kubectl exec -it my-pod -- bash

내부 쉘로 접근 후 아래 명령어를 통해 내부 컨테이너에 접속한 것을 확인할 수 있다.

# 폴더 구조 보기
ls
# nginx container 이므로 curl 명령어를 통해 확인
curl localhost

가가기 위해선 exit를 입력하면 된다.

 

Multi Container Pod - 1

지금까지는 yaml 파일을 생성해서 하나의 컨테이너만 생성을 했다.
이 부분에서는 여러개의 컨테이너를 생성해보자

11-multi-containers.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: nginx-1
      image: nginx
    - name: nginx-2
      image: nginx


이처럼 입력하고 실행 후 확인해보면 2개의 컨테이너중 하나만 실행되고 에러가 난다.



describe를 통해 확인 해보자
이미지를 가져오는건 성공을 했고, 컨테이너 옆에서 nginx-2를 실행하는데 실패해서 재시작을 하는 것을 확인할 수 있다.


이제 문제는 nginx-2에서 발생하는 점을 확인했고
logs를 확인해보면 컨테이너가 2개이기 때문에 기본으로 nginx-1의 로그만 주는것을 확인할 수 있다.


이제 nginx-2의 대해서 로그를 확인 해보자

 kubectl logs my-pod -c nginx-2


로그를 확인 해보면 이미 포트가 사용 중이기 때문에 에러가 나는것을 확인할 수 있다.

 

Multi Container Pod - 2

아래와 같이 변경한다

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: nginx-1
      image: nginx
    - name: util
      image: vinsdocker/util


log를 확인해보면 util은 ubuntu 기반의 이미지 이기 때문에 실행이 완료되고 죽기 때문에 무한히 반복되는것을 확인할 수있다.

아래처럼 파일을 변경해보자

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  terminationGracePeriodSeconds: 1
  containers:
    - name: nginx-1
      image: nginx
    - name: util
      image: vinsdocker/util
      args:
        - "sleep"
        - "3600"


다시 확인을 해보면 정상적으로 2개의 컨테이너가 잘 실행되고 있는것을 확인할 수 있다.


pod로 접속해보면 기본적으로 nginx-1 로 접근되는것을 확인할 수 있다.

kubectl exec -it my-pod -- bash

# 접근 후 뜨는 log
Defaulted container "nginx-1" out of: nginx-1, util

 

아래 명령어를 통해 특정 컨테이너로 접근할 수 있다.

 

kubectl exec -it [pod name] -c [container name] -- bash
ex) kubectl exec -it my-pod -c util -- bash


이제 util 컨테이너로 접근 후 curl localhost를 입력하면 nginx에 접근하는것을 볼 수 있다.
실제로 한 pod 에서 2개의 컨테이너가 떠있지만 같은 pod 안에서는 네트워크를 공유하기 때문에 요청이 가능하다.

그래서 서로 다른 컨테이너에 접속해서 hostname 을 확인해보면 같은 호스트 name을 응답하는것을 확인할 수 있다.

 

요약

pod

  • K8S에서 배포 가능한 가장 작은 단위이다.
  • pod는 하나이상의 컨테이너로 실행할 수 있다.
    • 오직 하나의 컨테이너만 어플리케이션 컨테이너여야 한다.
    • 나머지 컨테이너는 도우미여야 한다. (sidecar container)
  • 파드의 모든 컨테이너는 하나의 노드에서 실행된다. (파드 하나에서 여러개의 컨테이너를 실행한 경우 노드 하나에서 모두 실행된다.)
  • 실제로는 직접 yaml 파일을 생성하지 않는다.
  • 파드는 VM과 비슷하고 컨테이너들은 프로세스와 비슷하다.

Pod status

Pending: 노드가 아직 할당되지 않았음
ContainerCreating: kubelet이 컨테이너 생성중
Running: kubelet이 컨테이너를 시작함
ErrImagePull / ImagePullBackOff : 이미지 pull 실패. kubelet이 약간의 지연후 재시도함
Completed: 컨테이너가 성공적으로 종료됨
Error: 컨테이너가 오류와 함께 종료됨
CrashLoopBackOff: 컨테이너를 실행하는데 문제가 있음. kubelet이 지연후 재시도함 (이미지 풀링에 문제가 없을 때)
Terminating: pod 삭제중

 

Pod Container Restart policy

Never: Completed / Error 어떤 상황도 다시 시작하지 않음
Always: Completed / Error 어떤 상황에서도 다시 시작함
OnFailure: Error 인 경우에만 다시 시작함.

Kubectl Commands

kubectl get nodes: 클러스터의 모든 노드 확인
kubectl create -f [파일이름]: yaml파일을 기준으로 리소스 생성
kubectl delete -f [파일 이름]: yaml파일을 기준으로 리소스 삭제
kubectl get pod: 모든 파드 목록을 보여줌
kubectl get pod --show-lables: 파드의 레이블들을 보여줌
kubectl get pod -l [레이블 이름]=[레이블 값]: label을 기준으로 쿼리해서 파드를 보여줌
kubectl get pod -l [레이블 이름]!=[레이블 값]: label을 기준으로 쿼리해서 파드를 보여줌
kubectl get pod [파드 이름] -o yaml: 파드 정보를 yaml 형식으로 보여줌
kubectl describe pod [파드 이름]: 파드의 세부 정보를 보여줌
kubectl delete pod [파드 이름]: 파드 이름을 기준으로 파드 삭제
kubectl delete pod --all: 모든 파드 삭제
kubectl logs [파드 이름]: 파드의 log 확인
kubectl logs [파드 이름] -c [컨테이너 이름]: 파드의 여러개의 컨테이너중 특정 컨테이너 로그 확인
kubectl exec -it [파드이름] -c [컨테이너 이름] --bash: 파드의 컨테이너안에 쉘로 접속
kubectl port-forward [파드 이름] [호스트 포트]:[컨테이너 포트]: 디버깅을 위해 API 접속을 위해 사용

반응형

'Kubernetes' 카테고리의 다른 글

[Kubernetes] Deployment  (0) 2024.12.16
[Kubernetes] ReplicaSet  (0) 2024.12.12
[Kubernetes] Pod 기초 - 1  (0) 2024.11.27
[Kubernetes] Cluster 학습  (0) 2024.11.19
[K8S] 쿠버네티스 기본 개념 (1) - 파드(Pod)  (0) 2023.03.18
얼은펭귄