k8s/concept

pod/ static pod & resource & 환경변수

부엉이사장 2023. 11. 27. 19:53

## static pod 만들기

보통 마스터노드에서 컨테이너를 만들면 저렇게 api서버를 거쳐서 pod가 생성된다.

하지만 static pod는 워커 노드 자체에서 kubelet이 직접 pod를 만든다는 것이다.

즉 이 pod는 kublet데몬에 의해 관리되는 파드이다.

 

 

 

 

마스터노드에서 확인가능

 

# 직접 만들어보자. 

일단 워커 노드중 아무거나 하나 가서 해당 파일 내용을 보자.

cat /var/lib/kubelet/config.yaml

요기에 static pod path가 있음

static pod path는 /etc/kubernetes/manifests 라고 한다.

 

직접 이 경로에 가보자.

cd /etc/kubernetes/manifests

 

https://kubernetes.io/docs/concepts/workloads/pods/

 

Pods

Production-Grade Container Orchestration

kubernetes.io

pod 기본 yaml 형식을 가져와서 이 path에 yaml파일을 만들어주면..

짠~ 요렇게 master node에서 watch로 보고 있었는데 자동으로 pod가 생성이 되어버렸다.

참고로 난 master node에서 기본 namespace를 따로 바꿔놨었는데, 이렇게 static pod를 생성해준건

기본 namespace가 적용안되서 default namespace에 생기더라.

그래서 난 yaml파일 자체에 namespace를 설정해주고 만들어줬음.

 

 

 


# static pod 경로를 바꿀 수 없을까?

위에서 기본으로 정해진 static pod 기본경로는 

cd /etc/kubernetes/manifests

요렇다. 이걸 바꿔주려면 아까

cat /var/lib/kubelet/config.yaml

요 내용을 vim 에디터로 바꿔주면 된다.

 

난 home 디렉토리를 static path 로 설정해봤다.

systemctl restart kubelet

 

스태틱파드 경로 바꾸면 kubelet 데몬 반드시 리스타트 해야한다.

 

 

암튼 바꾼 경로에 아까만든 yaml 파일을 넣으면 또 다시 적용된다.

 

 

 

# static pod 삭제하기

마스터 노드에서 일상적으로 pod를 삭제하듯 삭제해봤다.

그러니 아까 만든 pod가 삭제되었다고 메세지가 뜬다.

근데 watch 로 pod를 보고있었는데 pod가 pending이었다가,

또살아난다!!

 

이걸 삭제하려면 직접 워커노드에 가서  해당 yaml파일을 삭제해주면 된다.

 

 

 

 

## 리소스

# 개념

cpu와 메모리를 pod별로 할당, 제한하는 기능이다.

예를들어 ddos같이 리소스 잡아먹는 공격이 들어올경우 컨테이너를 노드별로 재배치를 해주고 뭐 이런거임.

cs지식이 좀 있어야 활용가능할것같은데 아직은 잘몰라서 ㅠ

 

# yaml양식

해당 yaml파일 형식은 이렇게 생겼다.

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

requests는 해당 파드가 할당되는 resource고,  이만큼 리소스 여유가 있는곳에 파드를 배치해달라는 거다. 최소 리소스 양을 요청한다고 보면 될듯.

limits는 최대 리소스 양을 제한하는 한계치다. 리소스 초과하는경우는 pod가 종료되고 다시 스케줄링된다.

 

 

# 단위

cpu는 코어수로 표현하고, 1코어 하나만 쓰면 된다.

메모리는 미비바이트? 이런거인데 1Gi는 1000Mi, 1Mi는 1000Ki 이런식으로 생각하면 된다.

 

 

# 만약 리소스를 초과하는 request resource를 적용한 pod를 띄우게 된다면?

현재 워커노드들의 리소스다. VM웨어에서 이렇게 만들었었다.

만약 메모리를 2Gi, 혹은 CPU를 2코어 이상으로 request용량을 적용한 pod를 띄우게 된다면?

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        memory: "64Mi"
        cpu: 2
      limits:
        memory: "128Mi"
        cpu: 3

뭐 이런식으로 pod yaml에 cpu를 초과하게 설정해놨고

이 pod를 create 해보면

pod가 생성되긴 헀지만 pending상태로 멈춰버렸다.

describe로 event를 체크해보면

kubectl describe pod test-pod

요래 cpu가 충분치않다고 뜨고 영원히 pending상태로 유지되게된다.

만약 이 상태에서 이 리소스 제한을 수용할 수 있는 node가 추가된다면 바로 이 노드에 실행이 되게 된단다.

 

++ request 만 적으면 request만 적용되서 pod가 띄워진다.

++ limit만 적으면 request도 동일하게 적용된다.

 

 

 

 

## 환경변수

pod에 환경변수를 집어넣어보자~

 

 

# yaml 양식

apiVersion: v1
kind: Pod
metadata:
  name: envar-demo
  labels:
    purpose: demonstrate-envars
spec:
  containers:
  - name: envar-demo-container
    image: gcr.io/google-samples/node-hello:1.0
    env:
    - name: DEMO_GREETING
      value: "Hello from the environment"
    - name: DEMO_FAREWELL
      value: "Such a sweet sorrow"

역시 공식문서에서 가져온 기본 env양식이다..

name과 value값으로 환경변수를 지정해줄 수 있다.

 

 

# 직접 해보자~

난 이렇게 환경변수 dog을 지정해봤다

해당 yaml파일로 pod를 만들어주면,

kubectl create -f test-env.yaml
kubectl exec envar-demo -it -- /bin/bash

 

환경변수가 잘 적용된걸 볼 수 있다.

 

++ 추가해서 env치면 환경변수 다나ㅇ