AEWS 3 WEEK

Hi yena·2023년 5월 9일

AEWS

목록 보기
3/8

EKS Storage & Node 관리

📌 스토리지 이해

  • 상태 저장 애플리케이션을 실행할 때, 영구 스토리지가 없으면 데이터는 POD 또는 컨테이너의 수명 주기에 연결됩니다. 포드가 충돌하거나 종료되면 데이터는 손실됩니다.(Stateless)
  • 데이터베이스(파드)처럼 데이터 보존이 필요 == 상태가 있는(Stateful) 애플리케이션
    : PV & PVC
    → 로컬 볼륨(hostPath) ⇒ 퍼시스턴트 볼륨(Persistent Volume, PV) - 어느 노드에서도 연결하여 사용 가능, 예시) NFS, AWS EBS, Ceph 등
  • POD 가 생성될 때 자동으로 볼륨을 마운트하여 파드에 연결하는 기능을 동적 프로비저닝(Dynamic Provisioning)이라고 함
  • 퍼시스턴트 볼륨의 사용이 끝났을 때 해당 볼륨은 어떻게 초기화할 것인지 별도로 설정할 수 있는데, 쿠버네티스는 이를 Reclaim Policy 라고 부릅니다.
  • Reclaim Policy 에는 크게 Retain(보존), Delete(삭제, 즉 EBS 볼륨도 삭제됨), Recycle 방식이 있습니다.
    출처 : https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/

📌 AWS EBS Controller

  • EKS CSI는 EBS, EFS, FSx등의 CSI를 제공합니다.
  • Amazon EBS CSI(Container Storage Interface) 드라이버에서는 EKS 클러스터가 영구 볼륨을 위해 Amazon EBS 볼륨의 수명 주기를 관리할 수 있게 합니다.
  • AWS CSI 드라이버는 크게 2개 구성요소가 있습니다.
    • AWS API를 호출하면서 AWS 스토리지를 관리하는 CSI-Controller
    • kubelet과 상호작용하면서 AWS스토리지를 pod에 마운트하는 CSI-Node

      출처 : https://malwareanalysis.tistory.com/598

📌 실습

EFS 확인(bastion ec2에서)

efs파일시스템을 통하여 pod가 efs를 저장소로 사용할 수 있을지 확인할 예정

LB controller와 externalDNS를 설치 , kube-ops-view 설치

LB controller

externalDNS


coreDNS pod가 생긴 것을 확인 가능

kube-ops-view


워커노드에 할당된 pod들을 kube-ops-view를 통하여 확인할 수 있다.
pod에 마우스를 가져다 대면 cpu, label등 정보를 확인 할 수 있다

IRSA 확인


irsa-lb.yaml파일의 내용을 eks클러스터 만들 때 iam아래에 추가하여 lb에 irsa가 들어왔다 편리!

Node-specific Volume Limits


aws ebs같은 경우, 한 워커 노드 당 붙일 수 있는 볼륨의 최대 max갯수

임시 file system 사용

POD 배포


pod의 정보를 확인 후 pod를 삭제해본다.
이전 기록이 보존 되어 있나?


남아있지 않다 ㅠ_ㅠ..
중요한 pod라고 가정했을 경우는 장애,,!
❗️pod의 lifecycle과 함께 임시 파일시스템은 삭제된다❗️

호스트 Path 를 사용하는 PV/PVC : local-path-provisioner 스트리지 클래스 배포

특징 : 빠름

pvc 배포 후 확인

POD 생성 후 pvc 상태 확인


bound 된 것을 확인 가능하다

3번 노드에 배포되어있는것을 확인 가능


pod에서 확인하지 않아도 워커노드 자체의 경로에서 같은 output을 확인 가능하다

POD 삭제 후 pv, pvc 확인


pod는 삭제되었지만 pv, pvc는 살아있다.

POD 재 생성 후 내용이 남아있는지 확인


데이터가 남아있다

AWS EBS Controller

IRSA 설정

Amazon EBS CSI driver addon 추가

pod에 container 6개임

CNI NODE 확인

GP3스토리지 생성


PVC/PV 파드 테스트


3개의 gp3 ebs가 있는 것을 확인 가능

PVC 생성

POD 생성


pod가 생성되었는데 ebs가 생성이 된다..!


노드에 배포된 pod가 저 volume을 사용하는것임

pv,pvc,pod 확인

# PV 상세 확인 : nodeAffinity 내용의 의미는?

kubectl get pv -o yaml | yh
...
    nodeAffinity:
      required:
        nodeSelectorTerms:
        - matchExpressions:
          - key: topology.ebs.csi.aws.com/zone
            operator: In
            values:
            - ap-northeast-2b
...

저 어피니티에 배포하세요 라고 지정해주는 것

kubectl df-pv 명령어

pod의 볼륨 정보 확인할 때 유용한 명령어 입니다 기억해둘것

볼륨 증가

온라인에서 pod 중지 없이 용량 증가시키기
늘릴수는 있어도 줄일수는 없다
현재 pv 의 이름을 기준하여 4G > 10G 로 증가


증가완료

AWS Volume SnapShots Controller

pod가 쓰는 pv가 너무 중요해..!? -> 스냅샷 뜨자

설치 및 확인

# Install Snapshot CRDs
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl apply -f snapshot.storage.k8s.io_volumesnapshots.yaml,snapshot.storage.k8s.io_volumesnapshotclasses.yaml,snapshot.storage.k8s.io_volumesnapshotcontents.yaml


# Install Common Snapshot Controller
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
kubectl apply -f rbac-snapshot-controller.yaml,setup-snapshot-controller.yaml

확인

# Install Snapshotclass
curl -s -O https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/classes/snapshotclass.yaml
kubectl apply -f snapshotclass.yaml
kubectl get vsclass # 혹은 volumesnapshotclasses

테스트 pod, pv, pvc 생성

curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/ebs-volume-snapshot.yaml
cat ebs-volume-snapshot.yaml | yh
kubectl apply -f ebs-volume-snapshot.yaml

볼륨 스냅샷 생성



강제로 app & pvc 삭제 (장애)

kubectl delete pod app && kubectl delete pvc ebs-claim


없음..

pvc 생성

cat <<EOT > ebs-snapshot-restored-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-snapshot-restored-claim
spec:
  storageClassName: gp3
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
  dataSource:
    name: ebs-volume-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
EOT
cat ebs-snapshot-restored-claim.yaml | yh
kubectl apply -f ebs-snapshot-restored-claim.yaml

확인

pod 생성

curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/ebs-snapshot-restored-pod.yaml
cat ebs-snapshot-restored-pod.yaml | yh
kubectl apply -f ebs-snapshot-restored-pod.yaml

내용이 남아있나? -> 남아있다! 장애복구완료!

AWS EFS Controller

IRSA 설정


efs는 고객관리형 IRSA를 쓴다. EBS는 aws 제공 정책을 쓰는데 이 점이 다름

EFS Controller 설치

helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
helm repo update
helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \
    --namespace kube-system \
    --set image.repository=602401143452.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/eks/aws-efs-csi-driver \
    --set controller.serviceAccount.create=false \
    --set controller.serviceAccount.name=efs-csi-controller-sa

확인

AWS → EFS → 파일 시스템 : 네트워크 → 탑재 대상 ID 확인

EFS 파일시스템을 다수의 파드가 사용하게 설정 : Add empty StorageClasses from static example

실습코드 clone

EFS 스토리지클래스 생성 및 확인

PV 생성 및 확인 : volumeHandle을 자신의 EFS 파일시스템ID로 변경



PVC 생성 및 확인


여기에서 accessModes 가 ReadWriteMany인 이유는 여러곳에서 사용이 가능해서이다.

파드 생성 및 연동 : 파드 내에 /data 데이터는 EFS를 사용


kubectl df-pv

파드 정보 확인

📎 GiB(기비바이트) 단위 기준으로 볼륨을 입력했는데 단위 8.0E(엑사바이트)가 뜨는 이유?

  • AWS EFS는 전체 용량 제한이 없음(볼륨 크기 프로비저닝 불필요)
  • 자동으로 확장되는 ‘페타바이트급’ 데이터를 저장할 수 있다고 하기 때문에 자신감으로 표현한 것으로 보임

공유 저장소 저장 동작 확인


작업용 EC2에서도 동일 내용 확인 가능

EKS Persistent Volumes for Instance Store & Add NodeGroup

신규 노드 그룹 ng2 생성

  • 데이터 손실 : 기본 디스크 드라이브 오류, 인스턴스가 중지됨, 인스턴스가 최대 절전 모드로 전환됨, 인스턴스가 종료됨
  • 인스턴스 스토어는 EC2 스토리지(EBS) 정보에 출력되지는 않는다

인스턴스 스토어 볼륨이 있는 c5 모든 타입의 스토리지 크기


노드그룹에 인스턴스스토어 볼륨을 가지고 있다
인스턴스 스토어는 ec2 에 있는 임시 스토리지를 인스턴스가 붙여서 쓸 수 있다.

신규 노드 그룹 생성

노드 보안그룹 ID 확인

워커 노드 SSH 접속


저 왜 이거 안되죠,,,

max-pod 확인

kubelet 데몬 파라미터 확인 : --max-pods=29 --max-pods=100


배포가 잘 되지 않은 듯 합니다 ..ㅠㅠ max-pod가 17개로 뜹니다..


요거 때문인가..다시 배포해서 진행해보고 업데이트 하도록 해보겠습니다!

📌 끝마치며

cka 시험 볼 때 pv, pvc가 항상 잘 이해가 안되어서 고생했던 기억이 납니다😥
재시험을 봐야하지만.. 필수 출제 문제이니만큼
이번 기회에 완벽하게 이해하고 가면 좋을것 같다는 생각이 들었습니다
시간내서 강의를 진행해주시고 자료 정리하여 제공해주셔서 항상 감사하다고 생각하고 있습니다
스터디 기회를 주신 분들께 항상 감사합니다!

0개의 댓글