티스토리 뷰
● 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
● 노드를 직접 지정해준다
>> 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/
https://kubernetes.io/ko/docs/concepts/storage/volumes/
'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 |