갬미의 성장일기

Day 50 - k8s DaemonSet, k8s Volume 본문

Cloud/Cloud 공부일기

Day 50 - k8s DaemonSet, k8s Volume

갬미 2022. 3. 22. 23:22

오늘 배운 내용

- 쿠버네티스 데몬셋

- 쿠버네티스 볼륨 (외부 스토리지 사용하기)

 


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

 

Volumes

On-disk files in a container are ephemeral, which presents some problems for non-trivial applications when running in containers. One problem is the loss of files when a container crashes. The kubelet restarts the container but with a clean state. A second

kubernetes.io

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에 접속하여 잘 마운트 되었나 확인한다

pod에서 data를 생성
마운트 되어 있어 VM에도 생김

log도 잘 표시된다!

 

현업에서도 많이 사용하는 nfs이지만 너무 비싼게 단점이다

따라서 nfs는 따로 서버를 만들어서 사용한다

 

미니 과제

k8s 3tier를 구성하되, nginx 서버에서 nfs를 마운트하여라

-> access.log와 was.conf를 마운트 한다

 

실행 순서

  1. nfs서버 설치
  2. 3tier yaml 작성
  3. was 서비스의 sessionAffinity Rule을 Node 에서 ClientIP로 변경한다

실행되고 있는 pod와 svc

DB 한글 설정을 아직 안해서 한글은 보이지 않는다

nfs에서 본 log

 

👇 더 많은 볼륨에 대한 내용은 다음을 참고하면 좋을 것 같다 

 

6. 볼륨 : 컨테이너에 디스크 스토리지 연결 · Issue #6 · sungsu9022/study-kubernetes-in-action

6. 볼륨 : 컨테이너에 디스크 스토리지 연결 파드는 내부에 프로세스가 실행되고 CPU, RAM, 네트워크 인터페이스 등의 리소스를 공유한다. 하지만 디스크는 공유되지 않는다. 파드 내부의 각 컨테

github.com

 

오늘의 회고

  • 스토리지 개념이 좀 헷갈려서 이해하느라 진을 뺐다 ..! 
  • 아직 머릿속에 개념이 섞여있기는하지만 조금씩 정리가 되어가는것 같다 
  • 벌써 순수업일이 50일이 되었다니,, 시간이 참 빠른것 같다 얼른 더 많이 배워서 현업에 나가고싶다
Comments