갬미의 성장일기
Day 50 - k8s DaemonSet, k8s Volume 본문
오늘 배운 내용
- 쿠버네티스 데몬셋
- 쿠버네티스 볼륨 (외부 스토리지 사용하기)
pod를 만드는 방법
1. pod.yml
2. rs
3. deployment
4. Daemonset
4. Daemonset
daemon set은 클러스터 전체에 pod를 띄울때 사용하는 컨트롤러이다
deployment의 replicas가 노드의 수만큼 정해져있는 형태라고 할 수 있으며, 하나의 노드에 하나의 파드가 배정된다
데몬셋은 노드를 관리하는 파드를 만들때 많이 사용한다.
예를 들어 모니터링 시스템 구축을 위해 모든 노드에 특정 파드(로그 수집용)를 관리해야 할 때 사용할 수 있다.
노드가 클러스터에서 제거되면 해당 파드는 가비지(garbage)로 수집된다. 데몬셋을 삭제하면 데몬셋이 생성한 파드들이 정리된다.
DaemonSet.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx1
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: sysinfo
image: gymin97/msa2:nginx_v1
imagePullPolicy: Always
pod에 label을 줄수있듯이 노드에도 label을 줄 수 있으며 원하는 node에 pod를 배치할 수도있다
= node selector
node에 label주기
kubectl label node node-name label:label
rs, deamonset, deployment등 pod를 만들수있는 리소스라면 node selector를 사용할 수 있다
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 5
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeSelector:
node: node1 # node1이라는 label이 있는 node에만 배치
containers:
- name: nginx
image: gymin97/msa2:nginx_v1
ports:
- containerPort: 80
쿠버네티스 볼륨 (외부 스토리지 사용하기)
파드는 내부에 프로세스가 실행되고 CPU, RAM, 네트워크 인터페이스 등의 리소스를 공유한다.
하지만 디스크는 공유되지 않는다. 파드 내부의 각 컨테이너는 컨테이너 이미지로부터 제공되는 고유하게 분리된 파일 시스템을 가지기 때문이다. 새로 시작한 컨테이너는 이전에 실행했던 컨테이너에 쓰여진 파일 시스템의 어떤 것도 볼수 없다. 쿠버네티스는 스토리지 볼륨으로 마운트 기능을 제공한다.
쿠버네티스의 볼륨은 여러가지 종류가 있는데 이 볼륨 타입을 구별해보면 크게 임시 디스크, 로컬 디스크 그리고 네트워크 디스크 등으로 분류할 수 있다.
Temp | Local | Network |
emptyDir | hostPath | GlusterFS gitRepo NFS iSCSI gcePersistentDisk AWS EBS azureDisk Fiber Channel Secret VshereVolume |
자세한 내용은 https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes 참고
오늘은 hostPath, gcePersistentDisk, AWS EBS, NFS를 사용했다
nginx web 서버를 만들때 접속 log를 외부 스토리지에 저장하려는 상황이라고 가정한다
hostPath
hostPath : 워커 노드의 파일시스템을 파드의 디렉터리로 마운트 같은 hostPath에 있는 볼륨은 여러 Pod 사이에서 공유되어 사용된다.
hostPath 볼륨은 노드 파일 시스템의 특정 파일이나 디렉터리를 가리키며, 볼륨의 컨텐츠는 파드가 삭제되더라도 사라지지 않는다
주의할점은 파드가 재생성될때 다른 노드에 배정된다면, 이전노드에서 사용한 path에는 접근할 수 없다는것이다
-- node selector를 이용하지 않고는 컨테이너가 어느 node에 뜰지 모른다
실습 - 하나의 노드에 마운트 경로를 만들고 해당노드에 label을 지정한다 (node=node1)
deployment.yml 구성하기
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 5
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeSelector:
node: node1
containers:
- name: nginx
image: gymin97/msa2:nginx_v3
ports:
- containerPort: 80
# 파드 마운트 경로
volumeMounts:
- mountPath: /var/log/nginx
name: log
# 노드 마운트 경로
volumes:
- name: log
hostPath:
path: /home/gymin97/log
type: Directory
퍼시스턴트 스토리지 사용
스토리지 종류는 3가지가 있다
1. 블록 스토리지
2. 파일 스토리지
3. 오브젝트 스토리지
블록 스토리지는 AWS EBS , GCP Persistance Disk로 구현이 가능하다
GCP Persistance Disk 스토리지 사용하기
gce PD가 미리 있어야한다
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: gymin97/msa2:nginx_v1
name: nginx
volumeMounts:
- mountPath: /var/log/nginx
name: log
volumes:
- name: log
# This GCE PD must already exist.
gcePersistentDisk:
pdName: gymin
fsType: ext4 # file type : windows - fat32 ... linux = ext
AWS EBS 사용하기
https://kubernetes.io/docs/concepts/storage/volumes/#awselasticblockstore
apiVersion: v1
kind: Pod
metadata:
name: tnginx
spec:
containers:
- image: gymin97/msa2:nginx_v1
name: nginx
volumeMounts:
- mountPath: /var/log/nginx
name: log
volumes:
- name: log
# This AWS EBS volume must already exist.
awsElasticBlockStore:
volumeID: vol-090c7259e2f5c0d32
fsType: ext4
블럭스토리지는 한 노드가 그 스토리지를 사용하면 다른 스토리지는 사용할 수없다
deployment로 10개의 pod를 만들고 ebs를 사용하도록했을때 EBS가 붙은 노드에 배정된 pod만 running 된다
= 여러개의 노드에서 마운트해서 쓸 수없다 (GCP, AWS 모두)
파일 스토리지 (NFS)
GCP에서 filestore를 생성하고 VM에 마운트하기
이때 filestore가 사설 ip로 통신하기때문에 VPC network를 VM과 동일한 곳으로 설정해야한다!
마운트 할 새로운 vm(VPC network 주의)을 만들어 디렉터리를 생성하고 다음 명령어를 실행한다
mount -t nfs 10.27.227.186:/log /log
filestore에 log를 쌓을 nginx pod를 만들어보자
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeSelector:
node: node1
containers:
- name: nginx
image: gymin97/msa2:nginx_v3
volumeMounts:
- mountPath: /var/log/nginx
name: log
ports:
- containerPort: 80
volumes:
- name: log
# GCP nfs
nfs:
server: 10.50.164.178
path: /log
svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
만들어진 pod에 접속하여 잘 마운트 되었나 확인한다
log도 잘 표시된다!
현업에서도 많이 사용하는 nfs이지만 너무 비싼게 단점이다
따라서 nfs는 따로 서버를 만들어서 사용한다
미니 과제
k8s 3tier를 구성하되, nginx 서버에서 nfs를 마운트하여라
-> access.log와 was.conf를 마운트 한다
실행 순서
- nfs서버 설치
- 3tier yaml 작성
- was 서비스의 sessionAffinity Rule을 Node 에서 ClientIP로 변경한다
실행되고 있는 pod와 svc
DB 한글 설정을 아직 안해서 한글은 보이지 않는다
nfs에서 본 log
👇 더 많은 볼륨에 대한 내용은 다음을 참고하면 좋을 것 같다
오늘의 회고
- 스토리지 개념이 좀 헷갈려서 이해하느라 진을 뺐다 ..!
- 아직 머릿속에 개념이 섞여있기는하지만 조금씩 정리가 되어가는것 같다
- 벌써 순수업일이 50일이 되었다니,, 시간이 참 빠른것 같다 얼른 더 많이 배워서 현업에 나가고싶다
'Cloud > Cloud 공부일기' 카테고리의 다른 글
Day 52 - k8s secret, k8s PV, PVC (0) | 2022.03.24 |
---|---|
Day 51 - k8s Volume, job, cron job, configmap (0) | 2022.03.23 |
Day 49 - k8s 인그레스 구글 인증서 사용하기, k8s LB 알고리즘, k8s deployment (0) | 2022.03.21 |
Day 48 - 쿠버네티스 인그레스 TLS , 쿠버네티스 3tier 구성하기 (0) | 2022.03.18 |
Day 47 - 쿠버네티스 인그레스 (0) | 2022.03.17 |