k8s/CKA

따배씨 / pod - multi & side-car & init containers / resource usage

부엉이사장 2024. 10. 28. 00:22
Introduction
pod는 거의다 아는데 문제유형 훝고 몰랐던 자잘한거 정리하는 용도로 포스팅함.
강의 여섯개인가 내용 싹다 걍 합쳐서 제목이 좀 괴랄하다.

Summary
  • 리소스만들때 먼저 dry-run해주고 문제랑 맞는지 확인하고 만드는듯?
  • vim 에디터 줄수표시 :set nu
  • kubectl top node, pod 사용량별 pod출력, --sort-by=cpu로 정렬도가능
export samp="--dry-run=client -o yaml"
export grep="grep --color=auto -iC 3"
export now="--force --grace-period 0"

 

$samp, $grep, $now붙은건 이 명령어로 약어만든거니까 주의

 

 

Kubectl Reference Docs

 

kubernetes.io

 

 


 

 

 

# 클러스터 선택

kubectl config use-context 클러스터이름

먼저 클러스터를 어디서 작업하느냐 선택하는거. 

kubectl config current-context

현재 컨텍스트 확인하는거.

kubectl config get-context

컨텍스트 목록 보여주는거

 

문제마다 작업하는 클러스터가 다를수 있으니 수시로 확인하샘

 

 

 

# pod에 env할당 command

kubectl run eshop --image=nginx:1.17 --env DB=mysql

exec 로 pod들어가면 환경변수 잘 설정된거 확인가능.

 

 

 

 # static pod path

/home/user/k8s# cat /var/lib/kubelet/config.yaml | grep static

static pod path 가 나옴. 

config.yaml에 여러 정보가 있는데 예를들어 dns서비스 아이피주소도 나오고 그럼.

근데 뭐 시험에선 manifest 경로야 다 똑같으니.. 공식문서에서 걍 복붙해서 쓰샴

 

 

# multi container pod

사실 얘 커맨드 라인 알아보려고 강의 들은건데 없음.

방법은 먼저 싱글컨테이너 일반파드 만든 후, containers 필드를 여러개 만들어주는거다

예를들어 nginx, redis이미지를 가진 두개의 컨테이너로 pod를 만들려면,

kubectl run multi --image nginx $samp > multi.yaml

이렇게 나오는데

필요없는거 다 지우고, 저기 containers필드를 만지면 된다. 

- image부터 name을 복붙

잘 만들어진다.

 

- 환경변수 컨테이너마다 추가하려면?

kubectl run multi --image nginx --env tier=a $samp > multi.yaml

먼저 한 컨테이너에 환경변수 추가하는 명령어 써주고 yaml확인

저기 컨테이너부분을 똑같이 복붙하고 필요한 정보 수정

ㅇㅋ

 

exec로 확인하면 잘 적용된걸 볼 수 있음.

참고로 -c옵션은 컨테이너 지정해주는거임

없이치면 걍 첫번째 container인 nginx로 들어가게 됨

 

 

 

 

# side car container

기존에 있는 pod에다가 새로운 container를 추가해주는거다.

 

Logging Architecture

Application logs can help you understand what is happening inside your application. The logs are particularly useful for debugging problems and monitoring cluster activity. Most modern applications have some kind of logging mechanism. Likewise, container e

kubernetes.io

검색어는 side car container logging agent임.

뭐 이런식임. 

문제에서 주어진 pod 의 yaml을 따서 거기에 조건에 맞는 side car container추가하고 기존 pod삭제후 수정한 yaml로 apply 해주는거다.

 

개념 설명을 위해 그림을 그리고싶지만 귀찮아서..

글로 써보면

기존에 있는 pod가 volume mount해서 로그를 기록하고 있다면, side car container는 이 볼륨에 마운트하고 tail명령어로(마지막줄 계속 출력, -F옵션으로 실시간 모니터링하듯 출력해줌) 

그래서 kubectl logs 명령어로 sice car container를 확인하면 해당 로그를 바로 확인가능하다.

굳이 mount path로 가서 로그파일 뜯어볼 필요가 없음

 

side car container환경을 구성하기가 귀찮아서 kode kloud에서 하려고했는데 side car 패턴이 없더라.

그래서 그냥 설명으로 대체.

 

나중에 exam에서 찾으면 해볼예정.

 

 

 

 

# log

log는 컨테이너 단위로, describe는 pod단에서 

 

# cpu 사용량 

로컬환경에서 top명령어가 안되서 metric api다 설치했는데 안돼서 그냥 kode kloud환경에서 함.

근데 이게 되는 환경이있고 안되는 환경이 있음.. 못찾겠다.

그냥 코드만 쳐봄

kubectl top node

이걸치면 cpu와 memory컬럼과함께 사용량 node별로 나옴

 

kubectl top pods

이걸치면 pod 리소스 사용량 나옴

 

kubectl top pods --labels tier=frontend

해당 레이블 가진 pod들 리소스 사용량 나옴

 

kubectl top pods --sort-by=cpu

cpu 가장 많이쓰는 pod부터 쭈르륵 나옴

 

 

# init container

 

개념은 단순하다. pod에 init컨테이너를 만든다는게, pod의 일반 컨테이너가 생성되기전에 이 컨테이너를 먼저 생성해서 실행시켜달라는거다. 정상적으로 실행되면 메인컨테이너가 만들어지고 동작하게된다.

mock exam에서 이거관련해서 trouble shooting한듯?

 

Init Containers

This page provides an overview of init containers: specialized containers that run before app containers in a Pod. Init containers can contain utilities or setup scripts not present in an app image. You can specify init containers in the Pod specification

kubernetes.io

 

공식문서와 init container포함한 pod yaml양식

 

 

 

따배씨 예제를 직접 만들어서 테스트 해보겠다.

apiVersion: v1
kind: Pod
metadata:
  name: q-init
spec:
  containers:
  - image: busybox:1.28
    name: q-init
    command: ["sh", "-c", "if [ ! -f /workdir/data.txt ]; then exit 1; else sleep 300; fi"]
    volumeMounts:
    - name: workdir
      mountPath: "/workdir"
  volumes:
  - name: workdir
    emptyDir: {}

이게 문제에서 주어진 pod양식이다. pod 이름은 q-init이다.

해당 pod는 컨테이너에서 /workdir/에 data.txt파일이 없으면 exit해서 종료해주고, 만약 있으면 sleep 300해달라는거다.

busybox이미지는 sleep있어야 정상적으로 표기되는건 많이 만나서 알듯?

만약 exit이면 오류가 떠서 pod의 container가 0/1이런식으로 뜰거고 sleep 300이면 pod의 container가 1/1이런식으로 뜰거임.

참고로 이 /workdir은 볼륨마운트가 되어있다.

암튼 이런 pod인데 init container를 만들어서 해당 디렉토리에 마운트해주고, 여기에 data.txt파일을 만들어주면 이 pod는 정상적으로 실행될거다.

apiVersion: v1
kind: Pod
metadata:
  name: add-init
spec:
  containers:
  - image: busybox:1.28
    name: q-init
    command: ["sh", "-c", "if [ ! -f /workdir/data.txt ]; then exit 1; else sleep 300; fi"]
    volumeMounts:
    - name: workdir
      mountPath: "/workdir"
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'touch /workdir/data.txt']
    volumeMounts:
    - name: workdir
      mountPath: "/workdir"
  volumes:
  - name: workdir
    emptyDir: {}

 

init container를 추가한 yaml이다. pod이름은 add-init으로 고쳤다.

같은 busybox이미지로 만들었고 이름은 대충 지으샘.

커맨드에 touch /workdir/data.txt명령어를 치게해서 마운트된 /workdir에 data.txt파일을 만들어주게 커맨드설정을 했다.

 

먼저 첫번쨰 init container

 

둘다 만들어보면, add-init container는 정상적으로 만들어졌는데

q-init pod는 에러떠버렸음. crash머시기 뜰떄도 있고.

 

add container의 workdir에 정상적으로 data.txt파일이 만들어진것도 확인할 수 있다.

그래서 제대로 컨테이너가 만들어지고 실행된거임.

q-init pod의 describe인데, 얘는 이닛컨테이너가 data.txt파일을 안만들어줘서 exit 1명령으로 종료시켜버린거임.

'k8s > CKA' 카테고리의 다른 글

Mock Exam - 3  (0) 2024.11.02
따배씨&kode kloud / trouble shooting (Worker Node Failure)  (0) 2024.10.29
따배씨 / network policy  (0) 2024.10.24
따배씨 / dns  (0) 2024.10.22
따배씨 / persistent volume  (0) 2024.10.20