레이블이 hostpath인 게시물을 표시합니다. 모든 게시물 표시
레이블이 hostpath인 게시물을 표시합니다. 모든 게시물 표시

k8s pod ephemeral storage

# 운영중인 pod 다음과 에러로 evicted(pod 중지) 됐다.
# evicted pod event log describe
Type    Reason   .. From .... Message
Warngin evicted ... kubelet ... Pod ephemeral local storage usage exceeds the total limit of containers 5000Mi
Normal killing ... kubelet ... Stopping containers ysoftman_pod

# 원인은 서버가 pod 내 /tmp/xxx  업로드한 파일을 쓰고 있어 발생했다.

# 테스트를 위해 container 접속해서
# ysoftman_10GB 크기가 커지는것으로 모니터링 하고
watch -n 1 ls -ahl ysoftman_10GB

# container 접속 터미널을 하나 더 열고
# ysoftman_10GB 를 1GB 씩 늘려 본다.
rm -rf ysoftman_10GB
touch ysoftman_10GB
for ((i=1;i<=10;i++)); do
    echo $i
    sleep 1
    dd if=/dev/urandom bs=1000000 count=1000 >> ysoftman_10GB
done

# 참고로 한번에 쓸 경우
# dd if=/dev/urandom of=ysoftman_10GB bs=1000000 count=10000

# 이러면 1GB write 이후 pod 가 evicted 된다.
# ephemeral-storage 값을 늘리면 된다.
pod > spec > containers >  ... 
resources
  requests:
    ephemeral-storage: 10Gi
  limits:
    ephemeral-storage: 10Gi


##########


# 참고
# ephemeral-storage 리소스 종류에는
# [emptydir]
# pod 시작시 생서 pod 내 모든 container 들은 emptydir 볼륨에 동일한 파일을 읽고 쓴다.(컨테이너들간 공유)
# 로컬의 kubelet 베이스 디렉터리(보통 루트 디스크) 또는 램에서 제공
# 외 configmap 등이 있다.
# 다음과 같이 명시해 적용하면 /cache 를 emptyDir 로 사용할 수 있다.
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

# emptydir 는 pod 삭제되면 사라지는 휘발성이지만
# hostpath 를 이용하면 실제 호스트 노드에 마운트해서 pod 가 내려가도 노드에 데이터가 남는다.
# 하지만 pod 다른 호스트 노드에 뜰 수 있기 때문에 완벽한 데이터 보존 방법은 아니다.
# 그리고 hostpath 은 호스트 노드를 접근하는거라 보안 위험이 있어 되도록이면 사용하지 않는것이 좋다.
# 다음과 같이 명시해 적용하면 /test-pd 로 호스트의 /data 에 접근해 사용할 수 있다.
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory