AWS는 다 생각이 있구나 : AEWS - EKS Study 3주차 [ EKS Storage & Node 관리 ]

Heihei·2023년 5월 13일
0

AEWS EKS STUDY

목록 보기
4/7
post-thumbnail

🎯 목표

  • EKS Storage에 대한 이해 확립
  • EBS / EFS 컨트롤러를 이용하여 각 서비스를 k8s 환경에서 관리
  • kubestr을 사용하여 스토리지의 iops 및 스토리지 상태 점검

🏃 진행

1. 실습을 위한 EKS 배포

👉 기본 설정 및 EFS 확인

  • 이전 원클릭 배포에서 EFS 관련 설정이 추가 됨(v2)
    [이미지]
  • 배포 완료 후 default 네임스페이스 적용 & context 이름 yoni 변경
  • EFS 파일 시스템을 통해 pod가 EFS를 저장소로 사용할 수 있도록 마운트
mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport <자신의 EFS FS ID>.efs.ap-northeast-2.amazonaws.com:/ /mnt/myefs
df -hT --type nfs4
mount | grep nfs4

  • 실제로 EFS 시스템에 저장 되는지 테스트

  • 현재 AWS EBS 스토리지 클래스는 defaultgp2로 설정되어 있음

  • EBS 파라미터 타입도 gp2 인 것을 확인할 수 있음

👉 AWS LB/ExternalDNS, kube-ops-view 설치

  • AWS LB Controller 설치
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
  --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller

  • ExternalDNS 배포
MyDomain=<자신의 도메인>
MyDnzHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text)
echo $MyDomain, $MyDnzHostedZoneId
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/aews/externaldns.yaml
MyDomain=$MyDomain MyDnzHostedZoneId=$MyDnzHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -

  • kube-ops-view
    • node에 설치 된 pod의 개수를 좀 더 보기 편하게 해 주는 도구
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ="Asia/Seoul" --namespace kube-system
kubectl patch svc -n kube-system kube-ops-view -p '{"spec":{"type":"LoadBalancer"}}'
kubectl annotate service kube-ops-view -n kube-system "external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain"
echo -e "Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=1.5"

2. 스토리지 이해

👉 스토리지 개요

  • 파드 내부의 데이터는 파드가 정지되면 모두 삭제 됨(Stateless) : Temporary filesystem, Volume
    • 그러므로 파드안에 들어있는 컨테이너는 언제나 종료될 수 있다고 가정하고 설계해야 함
    • 아래의 그림과 같이 파드안에 볼륨을 만들고 여러개의 컨테이너가 볼륨을 공유해서 쓸 수 있지만, 파드 생명주기에 따라 파드가 죽으면 볼륨에 저장되어 있는 내용은 사라짐


      출처 : https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/

  • 그래서 데이터를 보존하기 위해 상태가 있는(Stateful) 애플리케이션을 사용함

👉 스토리지 소개

  • Pod의 볼륨 : emptyDir
  • Node의 볼륨 : hostPath
  • k8s의 볼륨 : PV
    • PVC로 통해 Pod와 마운트 됨

👉 CSI (Container Storage Interface)

  • CSI 를 사용하면, K8S 의 공통화된 CSI 인터페이스를 통해 다양한 프로바이더를 사용할 수 있음
  • 쿠버네티스에서 스토리지를 관리할 수 있도록 만들어 주는 리소스

    출처 : AWS 문서

Node-specific Volume Limits

  • AWS EC2 Type에 따라 볼륨 최대 제한 : 25개 ~ 39개
  • 한 워커 노드당 붙일 수 있는 최대 맥시멈 개수 : 현재 25개
  • KUBE_MAX_PD_VOLS 환경 변수의 값을 설정한 후, 스케줄러를 재시작하여 한도 변경 가능

실습 1 - PV/PVC 배포

❓ PV/ PVC를 사용하지 않으면 ❓

  • 파드 배포
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/date-busybox-pod.yaml
cat date-busybox-pod.yaml | yh
kubectl apply -f date-busybox-pod.yaml

  • 배포한 파드 정보 확인

  • 파드 삭제 & 재생성 후 파일 정보 확인

    • 삭제 되었을 때 이전 저장소가 남아있지 않는 것을 확인할 수 있음 -> 기본 컨테이너 환경의 임시 파일시스템 사용
    • ❗️ PV가 필요한 이유

실습 2 - hostPath를 사용하는 PV/PVC : local-path-provisioner 스토리지 클래스 배포

  • 스토리지 클래스 배포
curl -s -O https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
kubectl apply -f local-path-storage.yaml

  • 배포 확인
    • local-path-storage라는 별도의 네임스페이스에 설치가 됨
kubectl get-all -n local-path-storage
kubectl get pod -n local-path-storage -owide
kubectl describe cm -n local-path-storage local-path-config
kubectl get sc
kubectl get sc local-path


  • PVC 생성
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/localpath1.yaml
cat localpath1.yaml | yh
kubectl apply -f localpath1.yaml

  • PVC 확인
kubectl get pvc
kubectl describe pvc

  • 파드 생성
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/localpath2.yaml
cat localpath2.yaml | yh
kubectl apply -f localpath2.yaml

  • 파드 확인
kubectl get pod,pv,pvc
kubectl describe pv

kubectl exec -it app -- tail -f /data/out.txt

  • out.txt 파일 존재 확인
ssh ec2-user@$N1 tree /opt/local-path-provisioner
ssh ec2-user@$N2 tree /opt/local-path-provisioner
ssh ec2-user@$N3 tree /opt/local-path-provisioner

  • 파드 삭제 후 PV/PVC 확인
kubectl delete pod app
kubectl get pod,pv,pvc
ssh ec2-user@$N1 tree /opt/local-path-provisioner

  • 파드 재실행
kubectl apply -f localpath2.yaml

  • 삭제 전 데이터가 남아있는지 확인
    • 삭제 되었을 때 잠깐 기록이 끊어진 것을 확인할 수 있지만, 재생성 후 이전 데이터에 새 데이터가 누적이 되고 있는 것 확인
kubectl exec -it app -- head /data/out.txt
kubectl exec -it app -- tail -f /data/out.txt

  • 다음 실습을 위해 파드와 PVC 삭제
kubectl delete pod app
kubectl get pv,pvc
kubectl delete pvc localpath-claim


  • 삭제 확인

3. AWS EBS Controller


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

  • k8s가 EBS를 컨트롤 할 수 있게 해주는 컨트롤러
  • 그러므로 k8s에 적절한 권한을 부여해주어야 함

실습 3.1 - Amazon EBS CSI driver as an Amazon EKS add-on

  • aws-ebs-cs-driver 전체 버전 정보와 기본 설치 버전(True) 정보 확인
aws eks describe-addon-versions \
    --addon-name aws-ebs-csi-driver \
    --kubernetes-version 1.24 \
    --query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" \
    --output text

  • ISRA 설정 : AWS관리형 정책 AmazonEBSCSIDriverPolicy 사용
eksctl create iamserviceaccount \
  --name ebs-csi-controller-sa \
  --namespace kube-system \
  --cluster ${CLUSTER_NAME} \
  --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
  --approve \
  --role-only \
  --role-name AmazonEKS_EBS_CSI_DriverRole

  • ISRA 확인
kubectl get sa -n kube-system ebs-csi-controller-sa -o yaml | head -5
eksctl get iamserviceaccount --cluster myeks

  • Amazon EBS CSI driver addon 추가
  • 추가 된 것 확인
eksctl get addon --cluster ${CLUSTER_NAME}
kubectl get deploy,ds -l=app.kubernetes.io/name=aws-ebs-csi-driver -n kube-system
kubectl get pod -n kube-system -l 'app in (ebs-csi-controller,ebs-csi-node)'
kubectl get pod -n kube-system -l app.kubernetes.io/component=csi-driver

  • ebs-csi-controller 파드에 6개 컨테이너 확인
    • ebs를 컨트롤 하기 위해 각각의 기능들(resizer,attacher...)을 가진 파드들
kubectl get pod -n kube-system -l app=ebs-csi-controller -o jsonpath='{.items[0].spec.containers[*].name}' ; echo

  • csi가 적용 된 node들 확인
kubectl get csinodes

  • gp3 스토리지 클래스 생성
kubectl get sc
cat <<EOT > gp3-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gp3
allowVolumeExpansion: true
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
  allowAutoIOPSPerGBIncrease: 'true'
  encrypted: 'true'
  #fsType: ext4 # 기본값이 ext4 이며 xfs 등 변경 가능 >> 단 스냅샷 경우 ext4를 기본으로하여 동작하여 xfs 사용 시 문제가 될 수 있음
EOT
kubectl apply -f gp3-sc.yaml
kubectl get sc
kubectl describe sc gp3 | grep Parameters

실습 3.2 - PVC/PV 파드 테스트

  • 실제로 PV를 생성했을 때 EBS에 attach가 되는지 확인
  • 워커노드의 EBS 볼륨 확인 : tag(키/값) 필터링
aws ec2 describe-volumes --filters Name=tag:Name,Values=$CLUSTER_NAME-ng1-Node --output table
aws ec2 describe-volumes --filters Name=tag:Name,Values=$CLUSTER_NAME-ng1-Node --query "Volumes[*].Attachments" | jq
aws ec2 describe-volumes --filters Name=tag:Name,Values=$CLUSTER_NAME-ng1-Node --query "Volumes[*].{ID:VolumeId,Tag:Tags}" | jq
aws ec2 describe-volumes --filters Name=tag:Name,Values=$CLUSTER_NAME-ng1-Node --query "Volumes[].[VolumeId, VolumeType, Attachments[].[InstanceId, State][]][]" | jq
aws ec2 describe-volumes --filters Name=tag:Name,Values=$CLUSTER_NAME-ng1-Node --query "Volumes[].{VolumeId: VolumeId, VolumeType: VolumeType, InstanceId: Attachments[0].InstanceId, State: Attachments[0].State}" | jq

  • 워커노드에서 파드에 추가한 EBS 볼륨 확인
aws ec2 describe-volumes --filters Name=tag:ebs.csi.aws.com/cluster,Values=true --output table
aws ec2 describe-volumes --filters Name=tag:ebs.csi.aws.com/cluster,Values=true --query "Volumes[*].{ID:VolumeId,Tag:Tags}" | jq
aws ec2 describe-volumes --filters Name=tag:ebs.csi.aws.com/cluster,Values=true --query "Volumes[].{VolumeId: VolumeId, VolumeType: VolumeType, InstanceId: Attachments[0].InstanceId, State: Attachments[0].State}" | jq

  • 워커노드에서 파드에 추가한 EBS 볼륨 모니터링
while true; do aws ec2 describe-volumes --filters Name=tag:ebs.csi.aws.com/cluster,Values=true --query "Volumes[].{VolumeId: VolumeId, VolumeType: VolumeType, InstanceId: Attachments[0].InstanceId, State: Attachments[0].State}" --output text; date; sleep 1; done

  • PV에 사용 할 리소스의 양을 정의하는 PVC 생성
cat <<EOT > awsebs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
  storageClassName: gp3
EOT
kubectl apply -f awsebs-pvc.yaml
kubectl get pvc,pv

  • 파드 생성
cat <<EOT > awsebs-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  terminationGracePeriodSeconds: 3
  containers:
  - name: app
    image: centos
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo \$(date -u) >> /data/out.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: ebs-claim
EOT
kubectl apply -f awsebs-pod.yaml

  • PVC, 파드 확인
kubectl get pvc,pv,pod
kubectl get VolumeAttachment

  • 추가된 EBS 볼륨 상세 정보 확인
aws ec2 describe-volumes --volume-ids $(kubectl get pv -o jsonpath="{.items[0].spec.csi.volumeHandle}") | jq

  • PV 상세 확인
    • csi가 적용 된 노드인 것을 확인
kubectl get pv -o yaml | yh

kubectl get node --label-columns=topology.ebs.csi.aws.com/zone,topology.kubernetes.io/zone
kubectl describe node | more

  • 파일 내용 추가 저장 확인
kubectl exec app -- tail -f /data/out.txt

kubectl df-pv

  • 파드 내에서 볼륨 정보 확인
kubectl exec -it app -- sh -c 'df -hT --type=overlay'
kubectl exec -it app -- sh -c 'df -hT --type=ext4'

실습 3.3 - 볼륨 증가 - 감소는 안됩니다..

  • 현재 pv 의 이름을 기준하여 4G > 10G 로 증가 : .spec.resources.requests.storage의 4Gi 를 10Gi로 변경
kubectl get pvc ebs-claim -o jsonpath={.spec.resources.requests.storage} ; echo
kubectl get pvc ebs-claim -o jsonpath={.status.capacity.storage} ; echo
kubectl patch pvc ebs-claim -p '{"spec":{"resources":{"requests":{"storage":"10Gi"}}}}'

  • 볼륨 증가 확인
kubectl exec -it app -- sh -c 'df -hT --type=ext4'
kubectl df-pv
aws ec2 describe-volumes --volume-ids $(kubectl get pv -o jsonpath="{.items[0].spec.csi.volumeHandle}") | jq

  • 삭제
kubectl delete pod app & kubectl delete pvc ebs-claim

4. AWS Volume SnapShots Controller

👉 Volumesnapshots 컨트롤러 설치 및 사용

  • k8s에서 snapShot을 관리할 수 있는 컨트롤러

실습 4.1 - 설치

참고링크
https://github.com/kubernetes-csi/external-snapshotter
https://kubernetes.io/docs/concepts/storage/volume-snapshots/
https://github.com/kubernetes-sigs/aws-ebs-csi-driver/tree/master/examples/kubernetes/snapshot
https://aws.amazon.com/blogs/containers/using-amazon-ebs-snapshots-for-persistent-storage-with-your-amazon-eks-cluster-by-leveraging-add-ons/

  • 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
kubectl get crd | grep snapshot
kubectl api-resources  | grep snapshot

  • common Snapshot 컨트롤러 설치
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
kubectl get deploy -n kube-system snapshot-controller
kubectl get pod -n kube-system -l app=snapshot-controller

  • 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

실습 4.2 - 사용

  • PVC 생성
kubectl apply -f awsebs-pvc.yaml

  • 파드 생성
kubectl apply -f awsebs-pod.yaml

  • 파일내용 추가 저장 확인
kubectl exec app -- tail -f /data/out.txt

  • VolumeSnapshot 생성 : Create a VolumeSnapshot referencing the PersistentVolumeClaim name >> EBS 스냅샷 확인
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

  • VolumeSnapshot 확인
kubectl get volumesnapshot
kubectl get volumesnapshot ebs-volume-snapshot -o jsonpath={.status.boundVolumeSnapshotContentName} ; echo
kubectl describe volumesnapshot.snapshot.storage.k8s.io ebs-volume-snapshot
kubectl get volumesnapshotcontents

  • VolumeSnapshot ID 확인
kubectl get volumesnapshotcontents -o jsonpath='{.items[*].status.snapshotHandle}' ; echo

  • AWS EBS 스냅샷 확인
aws ec2 describe-snapshots --owner-ids self | jq
aws ec2 describe-snapshots --owner-ids self --query 'Snapshots[]' --output table

  • app & pvc 제거 : 강제로 장애 재현
kubectl delete pod app && kubectl delete pvc ebs-claim

  • 스냅샷에서 PVC로 복원
kubectl get pvc,pv
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

  • 복원 확인
kubectl get pvc,pv

  • 파드 생성
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

  • 파일 내용 저장 확인 : 파드 삭제 전까지의 저장 기록이 남아 있음. 이후 파드 재생성 후 기록도 잘 저장되고 있음
kubectl exec app -- cat /data/out.txt

  • 삭제
kubectl delete pod app && kubectl delete pvc ebs-snapshot-restored-claim && kubectl delete volumesnapshots ebs-volume-snapshot

5. AWS EFS Controller

👉 EFS 파일시스템 확인 및 EFS Controller 설치

  • k8s가 EFS를 관리할 수 있게 해주는 컨트롤러
  • EBS는 단일 가용영역 / EFS는 다중 가용영역
    • 그러므로 EFS가 가용성이 뛰어나고, 비쌈

실습 5.1 - EFS 파일시스템 확인 및 권한 부여

  • EFS 정보 확인
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text

  • IAM 정책 생성
curl -s -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
aws iam create-policy --policy-name AmazonEKS_EFS_CSI_Driver_Policy --policy-document file://iam-policy-example.json

  • ISRA 설정 : 고객관리형 정책 AmazonEKS_EFS_CSI_Driver_Policy 사용
eksctl create iamserviceaccount \
  --name efs-csi-controller-sa \
  --namespace kube-system \
  --cluster ${CLUSTER_NAME} \
  --attach-policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/AmazonEKS_EFS_CSI_Driver_Policy \
  --approve

  • 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

  • 확인
helm list -n kube-system
kubectl get pod -n kube-system -l "app.kubernetes.io/name=aws-efs-csi-driver,app.kubernetes.io/instance=aws-efs-csi-driver"

  • 네트워크에서 ID 확인

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

  • 모니터링
watch 'kubectl get sc efs-sc; echo; kubectl get pv,pvc,pod'
  • 실습 코드 clone
git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git /root/efs-csi
cd /root/efs-csi/examples/kubernetes/multiple_pods/specs && tree

  • EFS 스토리지클래스 생성 및 확인
cat storageclass.yaml | yh
kubectl apply -f storageclass.yaml
kubectl get sc efs-sc

  • PV 생성 및 확인 : volumeHandle을 자신의 EFS 파일시스템ID로 변경
EfsFsId=$(aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text)
sed -i "s/fs-4af69aab/$EfsFsId/g" pv.yaml

cat pv.yaml | yh

  • PV 생성
kubectl apply -f pv.yaml
kubectl get pv; kubectl describe pv

  • PVC 생성 및 확인
cat claim.yaml | yh
kubectl apply -f claim.yaml
kubectl get pvc

  • 파드 생성 및 연동 : 파드 내에 /data 데이터는 EFS를 사용
cat pod1.yaml pod2.yaml | yh
kubectl apply -f pod1.yaml,pod2.yaml
kubectl df-pv
  • 파드 정보 확인
kubectl get pods
kubectl exec -ti app1 -- sh -c "df -hT -t nfs4"
kubectl exec -ti app2 -- sh -c "df -hT -t nfs4"

  • 공유 저장소 저장 동작 확인
tree /mnt/myefs             
tail -f /mnt/myefs/out1.txt
kubectl exec -ti app1 -- tail -f /data/out1.txt
kubectl exec -ti app2 -- tail -f /data/out2.txt

  • 삭제
kubectl delete pod app1 app2 
kubectl delete pvc efs-claim && kubectl delete pv efs-pv && kubectl delete sc efs-sc

6. Fargate

  • EKS(컨트롤 플레인) + Fargate(데이터 플레인)의 완전한 서버리스화(=AWS 관리형)
  • Cluster Autoscaler 불필요, VM 수준의 격리 가능(VM isolation at Pod Level)
  • 파게이트 프로파일(파드가 사용할 서브넷, 네임스페이스, 레이블 조건)을 생성하여 지정한 파드가 파게이트에서 동작하게 함
  • EKS 는 스케줄러가 특정 조건을 기준으로 어느 노드에 파드를 동작시킬지 결정, 혹은 특정 설정으로 특정 노드에 파드가 동작하게 가능함
  • Data Plane

7. EKS Persistent Volumes for Instance Store & Add NodeGroup

  • 인스턴스 스토어
  • 고사양 EC2에만 존재
  • 장점 : EBS와 비슷한 기능을 하지만, 약 8배 빠른 속도

실습 7.1 - 신규 노드그룹(2) 생성 및 확인

  • 인스턴스 스토어 볼륨이 있는 c5 모든 타입의 스토리지 크기
aws ec2 describe-instance-types \
 --filters "Name=instance-type,Values=c5*" "Name=instance-storage-supported,Values=true" \
 --query "InstanceTypes[].[InstanceType, InstanceStorageInfo.TotalSizeInGB]" \
 --output table

  • 신규 노드 그룹 생성
eksctl create nodegroup --help
eksctl create nodegroup -c $CLUSTER_NAME -r $AWS_DEFAULT_REGION --subnet-ids "$PubSubnet1","$PubSubnet2","$PubSubnet3" --ssh-access \
  -n ng2 -t c5d.large -N 1 -m 1 -M 1 --node-volume-size=30 --node-labels disk=nvme --max-pods-per-node 100 --dry-run > myng2.yaml

cat <<EOT > nvme.yaml
  preBootstrapCommands:
    - |
      # Install Tools
      yum install nvme-cli links tree jq tcpdump sysstat -y

      # Filesystem & Mount
      mkfs -t xfs /dev/nvme1n1
      mkdir /data
      mount /dev/nvme1n1 /data

      # Get disk UUID
      uuid=\$(blkid -o value -s UUID mount /dev/nvme1n1 /data) 

      # Mount the disk during a reboot
      echo /dev/nvme1n1 /data xfs defaults,noatime 0 2 >> /etc/fstab
EOT
sed -i -n -e '/volumeType/r nvme.yaml' -e '1,$p' myng2.yaml
eksctl create nodegroup -f myng2.yaml

  • 노드 보안그룹 ID 확인
NG2SGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng2* --query "SecurityGroups[*].[GroupId]" --output text)
aws ec2 authorize-security-group-ingress --group-id $NG2SGID --protocol '-1' --cidr 192.168.1.100/32

  • 워커 노드 SSH 접속
N4=192.168.1.66
ssh ec2-user@$N4 hostname

  • 확인
ssh ec2-user@$N4 sudo nvme list
ssh ec2-user@$N4 sudo lsblk -e 7 -d
ssh ec2-user@$N4 sudo df -hT -t xfs
ssh ec2-user@$N4 sudo tree /data
ssh ec2-user@$N4 sudo cat /etc/fstab

실습 7.2 - 스토리지 클래스 생성

  • 기존 삭제
cd ~
kubectl delete -f local-path-storage.yaml

sed -i 's/opt/data/g' exlocal-path-storage.yaml
kubectl apply -f local-path-storage.yaml

  • 모니터링
watch 'kubectl get pod -owide;echo;kubectl get pv,pvc'
ssh ec2-user@$N4 iostat -xmdz 1 -p nvme1n1
  • 측정 : Read
kubestr fio -f fio-read.fio -s local-path --size 10G --nodeselector disk=nvme

  • 삭제
kubectl delete -f local-path-storage.yaml
eksctl delete nodegroup -c $CLUSTER_NAME -n ng2

profile
모르면 배우면 된다!

0개의 댓글