티스토리 뷰

● PV ( Persistant Volume )

PVC >> 누구든 요청할 수 있고 쉽게 만들 수 있다

 

 

 

HostPath

 

- HostPath 볼륨은 호스트 노드의 파일시스템에 있는 파일이나 디렉터리를 직접 마운트

- 기존의 파드가 삭제되고 새롭게 파드가 스케줄링 될 때 만약 기존의 노드에 파드가 스케줄링 되지 않으면,

기존의 노드 데이터는 사용 할 수 없으므로 주의

- 쿠버네티스 사이트에서는 보안상 hostPath 를 사용하지 않는 것을 권장한다

- hostPath 볼륨을 사용해야 하는 경우, 필요한 파일 또는 디렉터리로만 범위를 지정하고 ReadOnly 로 마운트하는게 좋다

요약 : Node 1 에 파드 1의 스토리지를 만들어서 참조한다 / 다른 노드의 스토리지는 참조 못한다

 

 

○ pvc 를 위한 apache.yml >> 컨테이너를 지우더라도 데이터를 영구적으로 쓰기 위해 사용한다

docker run -d --name xxxx -v /var/tmp/web_docs:/usr/local/apache2/htdocs

 

# volumeMounts 의 name ==  volumes 의 name

# volumes 하위에 hostPath 라는 타입을 지정한다

# /usr/loca/apache2/htdocs 를 /var/tmp/web_docs 에 마운트한다 ( 자동으로 생성된다 )

---
apiVersion: v1
kind: Pod
metadata:
  name: apache-pod
  labels:
    myapp: myweb
spec:
  containers:
  - name: myweb-container
    image: httpd:2.4
    ports:
      - containerPort: 80
    volumeMounts:
    - name: hostpath-volume
      mountPath: /usr/local/apache2/htdocs
  volumes:
  - name: hostpath-volume
    hostPath:
      path: /var/tmp/web-docs

 

 

 

○ 접근

kubectl exec -it apache-pod -- /bin/bash
root@apache-pod:/usr/local/apache2/htdocs# df -ha

/dev/mapper/cl_centos8-root  125G  4.8G  121G   4% /usr/local/apache2/htdocs

 

 

>> host 의 /var/tmp/web-docs 에 생성된다

root@apache-pod:/usr/local/apache2/htdocs# echo heelleleleleleelelel container > index.html

 

 

 

○ wk2 에 파드가 생성되었고 wk2 접속하여 index.html이 확인됐다

[vagrant@ms work]$ kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP             NODE              NOMINATED NODE   READINESS GATES
apache-pod   1/1     Running   0          8m44s   10.244.2.97    wk2.example.com   <none>           <none>
test         2/2     Running   0          53m     10.244.1.107   wk1.example.com   <none>           <none>

[vagrant@ms work]$ ssh wk2
Last login: Mon Mar 11 10:06:18 2024 from 192.168.98.10

[vagrant@wk2 ~]$ ls /var/tmp/web-docs/
index.html

 

 

 

 

● pod 삭제

kubectl delete pods --all

 

 

 

 

● 파드 삭제후 다시 파드 올려도 index.html 이 그대로 적용된다

[vagrant@ms work]$ kubectl apply -f apache.yml
pod/apache-pod created
[vagrant@ms work]$ kubectl get pod -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
apache-pod   1/1     Running   0          4s    10.244.2.98   wk2.example.com   <none>           <none>

[vagrant@ms work]$ curl 10.244.2.98
heelleleleleleelelel container

 

 

 

 

 

추가로 한번에 10 개의 컨테이너를 올린다면,
>> wk 1 가 아닌 wk 2 에 올라간 컨테이너들은 스토리지가 만들어져 있지 않기 때문에, 초기화면이 없다

 

 

○ wk1 에 사전작업

# sudo -s 를 쓰면 바로 현재 위치에서 root 변환

[vagrant@wk1 ~]$ sudo mkdir /tmp/webpage
[vagrant@wk1 ~]$ cd /tmp/webpage
[vagrant@wk1 webpage]$ ll
total 0
[vagrant@wk1 webpage]$ sudo "whwywhwywhwywhwy" > index.html
-bash: index.html: Permission denied
[vagrant@wk1 webpage]$ sudo^Cwhwywhwywhwywhwy" > index.html
[vagrant@wk1 webpage]$ sudo -i
[root@wk1 ~]# exit
logout
[vagrant@wk1 webpage]$ sudo -s
[root@wk1 webpage]# echo whywhywhwywhwy > index.html
[root@wk1 webpage]# ll
total 4
-rw-r--r--. 1 root root 15 Mar 11 17:43 index.html
[root@wk1 webpage]# cat index.html
whywhywhwywhwy

 

 

 

○ ng.dep.yml 에서 볼륨 설정 추가

# volumeMounts 는 템플릿 스펙의 컨테이너 하위에 위치

# 볼륨은 템플릿 스펙의 컨테이너와 동일한 위치

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache
  labels:
    app: apache
spec:
  replicas: 10
  selector:
    matchLabels:
      app: apache
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 10
  template:
    metadata:
      labels:
        app: apache
    spec:
      containers:
      - image: httpd
        name: apache
        ports:
        - containerPort: 80
        volumeMounts:
        - name: hostpath-myvolume
          mountPath: /usr/local/apache2/htdocs
      volumes:
      - name: hostpath-myvolume
        hostPath:
          path: /tmp/webpage

wk1 과 wk2 의 차이점이 극명히 나타난다

 

 

 

 

● 노드를 직접 지정해준다

>> nodeName 항목 추가

# kubectl get nodes 에 나오는 NAME 으로 입력해야한다

[vagrant@ms work]$ cat ng.dep.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache
  labels:
    app: apache
spec:
  replicas: 10
  selector:
    matchLabels:
      app: apache
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 10
  template:
    metadata:
      labels:
        app: apache
    spec:
      containers:
      - image: httpd
        name: apache
        ports:
        - containerPort: 80
        volumeMounts:
        - name: hostpath-myvolume
          mountPath: /usr/local/apache2/htdocs
      volumes:
      - name: hostpath-myvolume
        hostPath:
          path: /tmp/webpage
      nodeName: wk1.example.com

 

 

 

● 모두 wk1 로 마운트되어 똑같은 index.html 이 출력된다

 

 

 

 

 

nodeSelector



○ 예시

>> wk3 에 파드를 배치한다 

>>> 특정 노드에 파드를 배치한다 [ 속도가 빠른 노드에 지정 ]

Node wk1 wk2 wk3 wk4 wk5
RAM 8 4 16 4 4
CPU 2 1 1 1 1
Disk sata ssd nvme ssd sata

 

 

 

● 각 노드에 라벨을 붙일 수 있다

[vagrant@ms work]$ kubectl label node wk1.example.com disktype=nvme
node/wk1.example.com labeled

[vagrant@ms work]$ kubectl label node wk2.example.com disktype=sata
node/wk2.example.com labeled

 

 

● 라벨을 볼 수 있다

[vagrant@ms work]$ kubectl get nodes --show-labels

 

 

 

 

● nodeSelector 설정 >> disktype 은 라벨로 지정해둔 nvme 로 지정

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache
  labels:
    app: apache
spec:
  replicas: 10
  selector:
    matchLabels:
      app: apache
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 10
  template:
    metadata:
      labels:
        app: apache
    spec:
      containers:
      - image: httpd
        name: apache
        ports:
        - containerPort: 80
        volumeMounts:
        - name: hostpath-myvolume
          mountPath: /usr/local/apache2/htdocs
      volumes:
      - name: hostpath-myvolume
        hostPath:
          path: /tmp/webpage
      #nodeName: wk1.example.com
      nodeSelector:
        disktype: nvme

 

 

 

● wk1 에 모두 할당된다

 

 

 

 

https://kubernetes.io/ko/docs/tasks/configure-pod-container/assign-pods-nodes/

 

노드에 파드 할당

이 문서는 쿠버네티스 클러스터의 특정 노드에 쿠버네티스 파드를 할당하는 방법을 설명한다. 시작하기 전에 쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수

kubernetes.io

https://kubernetes.io/ko/docs/concepts/storage/volumes/

 

볼륨

컨테이너 내의 디스크에 있는 파일은 임시적이며, 컨테이너에서 실행될 때 애플리케이션에 적지 않은 몇 가지 문제가 발생한다. 한 가지 문제는 컨테이너가 크래시될 때 파일이 손실된다는 것

kubernetes.io

 

'Kubernetes [ 쿠버네티스 ]' 카테고리의 다른 글

Kubernetes emptyDir  (0) 2024.03.12
Kubernetes 커맨드 입력  (0) 2024.03.12
Kubernetes 멀티 컨테이너 사용  (0) 2024.03.11
Kubernetes 복습 / 정리  (0) 2024.03.11
Kubernetes 시작 전 점검 사항  (0) 2024.03.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함