brunch

You can make anything
by writing

C.S.Lewis

by Master Seo May 10. 2023

EKS 8탄-4. EKS- 스토리지-EFS-4/17

EKS 8탄 - 3주차


본 내용은 CloudNet 주말 스터디 내용을 참고로 작성되었습니다.

https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863  

계속 테스트하며  내용과 설명이 업데이트 됩니다.


진행?

이론 1시간

실습 1시간

이론부터 1시간 설명후 바로 실습 진행합니다.



목표

EFS 기본 이해

LB컨트롤러 , External DNS 자동 추가, kube-ops-view 사용해 보기

CSI 이해  = CSI (Container Storage Interface) driver

임시 파일 시스템 이해

PV/PVC 이해



<1> EKS 설치

<2> EFS 설정

<3> AWS LB 컨트롤러 , ExternalDNS 자동 추가, kube-ops-view 설치

<4> 스토리지 이해

<5>  CSI (Container Storage Interface) driver ?

<6> 임시 파일시스템 사용 테스트

<7> 로컬 디스크 사용하는 호스트 path 사용

<8> PV/PVC 를 사용하는 파드 생성

<9> 파드 삭제 후 파드 재생성해서 데이터 유지 되는지 확인

<10> 추가 공부 사이트

<11> 다음 과정 = EBS




선행 조건

스터디 전에 도메인 1개 구매

route53에 세팅 하자 - route53에서  도메인 구매하면 자동으로 ns가 등록 된다.

저는 route53에서  masterseo1.link 도메인을  미리구매 했다. (30분 걸림)

스터디 전에 EKS 설치




<1> EKS 설치


1

AWS 콘솔 로그온 하기

https://console.aws.amazon.com/



2

cloudformation으로 설치



Stack name = mykops

ec2-key pair 필요

access-key / secret key 필요

도메인 하나 준비





WorkerNodeInstanceType를 c5d.large

 - EC2 인스턴스 스토어(임시 블록 스토리지)가 가능한 사양으로 사용하도록하자.


Next > Next > 생성하기



3

EKS 생성 모니터링 ?


콘솔에서 myeks-bastion-EC2 공인IP 확인

myeks-bastion-EC2에 로그온해서 master, node 서버들이 만들어지는지 모니터링 하자.


while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --output text | sort; echo "------------------------------" ;date; sleep 1; done

------------------------------

Wed May 10 17:46:19 KST 2023

myeks-bastion-EC2       3.38.151.129    running

myeks-ng1-Node  15.165.7.14     running

myeks-ng1-Node  3.38.187.172    running

myeks-ng1-Node  52.78.210.102   running



(15분 걸림)




https://vclock.kr/timer/#countdown=00:10:00&enabled=0&seconds=0&sound=xylophone&loop=1



4

CloudFormation에 추가된 내용 확인


// EFS 파일 시스템 추가

// iam에 OIDC  활성화

// iam에 서비스 어카운트 추가



// 서비스 계정에 AWS Identity and Access Management(IAM) 역할을 사용하려면 클러스터의 OIDC 발급자 URL에 IAM OIDC 제공업체가 있어야 합니다.

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/enable-iam-roles-for-service-accounts.html



AWSTemplateFormatVersion: '2010-09-09'


Metadata:

  AWS::CloudFormation::Interface:

:

:

# EFS

  EFSSG:

    Type: AWS::EC2::SecurityGroup

    Properties:

      VpcId: !Ref EksVPC

      GroupDescription: EFS Security Group

      Tags:

      - Key : Name

        Value : !Sub ${ClusterBaseName}-EFS

      SecurityGroupIngress:

      - IpProtocol: tcp

        FromPort: '2049'

        ToPort: '2049'

        CidrIp: !Ref VpcBlock


  ElasticFileSystem:

    Type: AWS::EFS::FileSystem

    Properties:

      FileSystemTags:

        - Key: Name

          Value: !Sub ${ClusterBaseName}-EFS

  ElasticFileSystemMountTarget0:

    Type: AWS::EFS::MountTarget

    Properties:

      FileSystemId: !Ref ElasticFileSystem

      SecurityGroups:

      - !Ref EFSSG

      SubnetId: !Ref PublicSubnet1

  ElasticFileSystemMountTarget1:

    Type: AWS::EFS::MountTarget

    Properties:

      FileSystemId: !Ref ElasticFileSystem

      SecurityGroups:

      - !Ref EFSSG

      SubnetId: !Ref PublicSubnet2

  ElasticFileSystemMountTarget2:

    Type: AWS::EFS::MountTarget

    Properties:

      FileSystemId: !Ref ElasticFileSystem

      SecurityGroups:

      - !Ref EFSSG

      SubnetId: !Ref PublicSubnet3

:

:

      UserData:

        Fn::Base64:

          !Sub

            #!/bin/bash

            hostnamectl --static set-hostname "${ClusterBaseName}-bastion-EC2"


            # Config convenience

            echo 'alias vi=vim' >> /etc/profile

            echo "sudo su -" >> /home/ec2-user/.bashrc


            # Change Timezone

            sed -i "s/UTC/Asia\/Seoul/g" /etc/sysconfig/clock

            ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime


            # Setting EFS Filesystem

            mkdir -p /mnt/myefs

            mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport ${ElasticFileSystem}.efs.ap-northeast-2.amazonaws.com:/ /mnt/myefs            

            # Create EKS Cluster & Nodegroup

            eksctl create cluster --name $CLUSTER_NAME --region=$AWS_DEFAULT_REGION --nodegroup-name=ng1 --node-type=${WorkerNodeInstanceType} --nodes ${WorkerNodeCount} --node-volume-size=${WorkerNodeVolumesize} --vpc-public-subnets "$PubSubnet1","$PubSubnet2","$PubSubnet3" --version ${KubernetesVersion} --ssh-access --ssh-public-key /root/.ssh/id_rsa.pub --with-oidc --external-dns-access --full-ecr-access --dry-run > myeks.yaml

            sed -i 's/certManager: false/certManager: true/g' myeks.yaml

            sed -i 's/ebs: false/ebs: true/g' myeks.yaml

            cat <<EOT >> myeks.yaml

            addons:

            - name: vpc-cni # no version is specified so it deploys the default version

              version: v1.12.6-eksbuild.1

              attachPolicyARNs:

                - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy

            - name: kube-proxy

              version: latest # auto discovers the latest available

            - name: coredns

              version: latest # v1.9.3-eksbuild.2

            EOT

            cat <<EOT > irsa-lb.yaml

              serviceAccounts:

              - metadata:

                  name: aws-load-balancer-controller

                  namespace: kube-system

                wellKnownPolicies:

                  awsLoadBalancerController: true

            EOT

            sed -i -n -e '/withOIDC/r irsa-lb.yaml' -e '1,$p' myeks.yaml

            nohup eksctl create cluster -f myeks.yaml --verbose 4 --kubeconfig "/root/.kube/config" 1> /root/create-eks.log 2>&1 &


            echo 'cloudinit End!'




(기타)

myeks.yaml 파일로 보기


(access-05-03@myeks:N/A) [root@myeks-bastion-EC2 ~]# cat myeks.yaml | yh

apiVersion: eksctl.io/v1alpha5

cloudWatch:

  clusterLogging: {}

iam:

  vpcResourceControllerPolicy: true

  withOIDC: true

  serviceAccounts:

  - metadata:

      name: aws-load-balancer-controller

      namespace: kube-system

    wellKnownPolicies:

      awsLoadBalancerController: true


// iam에 OIDC  활성화

// iam에 서비스 어카운트 추가

// iam에 로드밸랜서 컨트롤러 추가



5

금일 수동으로 추가 할 작업은 ?

EBS 컨트롤러 추가

EFS 컨트롤러 추가 (EFS 파일 시스템은 CF으로 미리 만들었다)




6

(선택)

아래 CLI 로 EKS 설치법은 참고


# YAML 파일 다운로드

curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick2.yaml




# CloudFormation 스택 배포

예시) aws cloudformation deploy --template-file eks-oneclick2.yaml --stack-name myeks --parameter-overrides KeyName=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32  MyIamUserAccessKeyID=AKIA5... MyIamUserSecretAccessKey='CVNa2...' ClusterBaseName=myeks --region ap-northeast-2



# CloudFormation 스택 배포 완료 후 작업용 EC2 IP 출력

aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[0].OutputValue' --output text



# 작업용 EC2 SSH 접속

ssh -i ~/.ssh/kp-gasida.pem ec2-user@$(aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[0].OutputValue' --output text)




여기까지 이해 되셨을까요 ?

이해 되셨으면 채팅창에 1  , 아니면 2




<2> EFS 설정


1

# default 네임스페이스 적용

kubectl ns default



2

# (옵션) context 이름 변경

NICK=<각자 자신의 닉네임>


NICK=masterseo

kubectl ctx

kubectl config rename-context admin@myeks.ap-northeast-2.eksctl.io $NICK@myeks


// iam 계정이름이 EC2 프롬프트의 기본 이름이 된다.

// access-05-03  (계정을 admin으로 만들었다면 admin)

// (access-05-03@myeks:default) [root@myeks-bastion-EC2 ~]#

// 변경

kubectl config rename-context access-05-03@myeks.ap-northeast-2.eksctl.io $NICK@myeks



3

EFS 파일 시스템은 Cloudformation 으로 미리 만들어 두었다.


# EFS  파일 시스템 확인

AWS 관리콘솔 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



// AWS 콘솔에서  EFS ID를 확인하여 입력하자.



mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-02ba1c75a3d1dc1aa.efs.ap-northeast-2.amazonaws.com:/ /mnt/myefs


// 본인 EFS 정보를 넣으세요



df -hT --type nfs4

----------------------------

Filesystem                                              Type  Size  Used Avail Use% Mounted on

fs-00fc18f0ad801703e.efs.ap-northeast-2.amazonaws.com:/ nfs4  8.0E     0  8.0E   0% /mnt/myefs

// 타입이 nfs4 ,  경로는 /mnt/myefs를 cloudformation으로 디렉토리 미리 만들어 놓았다.


확인

mount | grep nfs4



4

데이터가 efs에 저장 되는지 테스트 ?


echo "efs file test" > /mnt/myefs/memo.txt

cat /mnt/myefs/memo.txt

efs file test



삭제

rm -f /mnt/myefs/memo.txt



5

# 스토리지 클래스 및 CSI 노드 확인 ?


스토리지 클래스 디폴트는 gp2이다.

gp2는 사용하지 않을것이고,  EBS 컨트롤러 설치후 gp3로 변경해 사용할것이다.


kubectl get sc

NAME  PROVISIONER  RECLAIMPOLICY  VOLUMEBINDINGMODE  ALLOWVOLUMEEXPANSION   AGE

gp2 (default)   kubernetes.io/aws-ebs   Delete  WaitForFirstConsumer   false    70m



kubectl get sc gp2 -o yaml | yh

apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

  annotations:

    kubectl.kubernetes.io/last-applied-configuration:

      {"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"},"name":"gp2"},"parameters":{"fsType":"ext4","type":"gp2"},"provisioner":"kubernetes.io/aws-ebs","volumeBindingMode":"WaitForFirstConsumer"}

    storageclass.kubernetes.io/is-default-class: "true"

  creationTimestamp: "2023-05-10T08:34:41Z"

  name: gp2

  resourceVersion: "278"

  uid: 86c7fe94-e285-4720-af30-491352479dde

parameters:

  fsType: ext4

  type: gp2

provisioner: kubernetes.io/aws-ebs

reclaimPolicy: Delete

volumeBindingMode: WaitForFirstConsumer



kubectl get csinodes

NAME                                               DRIVERS   AGE

ip-192-168-1-140.ap-northeast-2.compute.internal   0         62m

ip-192-168-2-38.ap-northeast-2.compute.internal    0         62m

ip-192-168-2-85.ap-northeast-2.compute.internal    0         62m




6

# 노드 정보 확인


kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone


eksctl get iamidentitymapping --cluster myeks




7

# 노드 IP 확인 및 PrivateIP 변수 지정


N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})


N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address})


N3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})


echo "export N1=$N1" >> /etc/profile

echo "export N2=$N2" >> /etc/profile

echo "export N3=$N3" >> /etc/profile


echo $N1, $N2, $N3




# 노드 보안그룹 ID 확인

NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text)

aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32



# 노드에 툴 설치

ssh ec2-user@$N1 sudo yum install links tree jq tcpdump sysstat -y

ssh ec2-user@$N2 sudo yum install links tree jq tcpdump sysstat -y

ssh ec2-user@$N3 sudo yum install links tree jq tcpdump sysstat -y






<3> AWS LB 컨트롤러 , ExternalDNS 자동 추가, kube-ops-view 설치



0

watch -d kubectl get pod -n kube-system



1

로드밸런서 컨트롤러 추가 ?


# 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



2

# ExternalDNS 자동 추가 되도록 설정  ?

// 도메인이 1개 필요하다.


MyDomain=<자신의 도메인>


MyDomain=masterseo1.link


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 -




3

노드당 pod가 어떻게 추가되는지 보는 유용한 유틸 ?


# kube-ops-view


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"

---------------

Kube Ops View URL = http://kubeopsview.masterseo1.link:8080/#scale=1.5


(10분 소요)



4

모니터링

watch -d kubectl get deploy,rs,ep,svc,pods



// kube-system 네임 스페이스에서 확인 가능하다.


k ns kube-system




5

접속


http://kubeopsview.masterseo1.link:8080/#scale=1.5


// 아래 pod들은 시스템 네임스페이스에 할당된 pod들이다.

// 위에 생성될 pod는 디폴트 네임스페이스에서 생성시 pod.




6

nginx pod 로 kube-ops-view 테스트 해보자.


pod 생성


curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/2/nginx-dp.yaml



kubectl apply -f nginx-dp.yaml





pod를 늘려보자

kubectl scale deployment nginx-deployment --replicas=8


kubectl scale deployment nginx-deployment --replicas=50


max pod 확인?

pending 확인?




7

설치 정보 확인  ?


# 이미지 정보 확인

kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c



8

# eksctl 설치/업데이트 addon 확인

eksctl get addon --cluster $CLUSTER_NAME


2023-05-10 19:22:02 [ℹ]  Kubernetes version "1.24" in use by cluster "myeks"

2023-05-10 19:22:02 [ℹ]  getting all addons

2023-05-10 19:22:03 [ℹ]  to see issues for an addon run `eksctl get addon --name <addon-name> --cluster <cluster-name>`

NAME            VERSION                 STATUS  ISSUES  IAMROLE                                                                         UPDATE AVAILABLE        CONFIGURATION VALUES

coredns         v1.9.3-eksbuild.3       ACTIVE  0

kube-proxy      v1.24.10-eksbuild.2     ACTIVE  0

vpc-cni         v1.12.6-eksbuild.1      ACTIVE  0       arn:aws:iam::476286675138:role/eksctl-myeks-addon-vpc-cni-Role1-11DYQF2ETYXDT



9

# IRSA 확인

Pod가 로드밸런서를 제어할수 있어야 한다.


eksctl get iamserviceaccount --cluster $CLUSTER_NAME


NAMESPACE       NAME                            ROLE ARN

kube-system     aws-load-balancer-controller    arn:aws:iam::476138:role/eksctl-myeks-addon-iamserviceaccount-kube-sy-Role1-ILKFQ6E5





여기까지 이해 되셨을까요 ?

이해 되셨으면 채팅창에 1  , 아니면 2




<4> 스토리지 이해



1

참고 자료

Kubernetes를 위한 영구 스토리지 적용하기

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



2

파드 내부의 데이터는 파드가 정지되면 모두 삭제됨.





임시 스토리지(Ephemeral storage) 와 임시 볼륨(Ephemeral volumes) 둘다 임시다.

임시 볼륨(Ephemeral volumes) 도 Pod가 삭제되는 즉시 Volume도 삭제가 됨.



3

인스턴스 스토어는 인스턴스에 블록 수준의 임시 스토리지를 제공합니다.


인스턴스 스토어 정보

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes



4

데이터 보존이 필요시 ?


영구 볼륨(Persistent Volumes)= PV

PV로 영구 저장소를 만들고, PVC로 연결해 사용한다.

Persistent Volume(PV)은 실제 스토리지 볼륨을 나타냅니다.

Kubernetes는 PV를 포드에 연결하는데 필요한 추가 추상화 계층인 PersistentVolumeClaim(PVC)을 가지고 있습니다.

PV 는 실제 스토리지 볼륨을 나타내며, PVC는 Pod가 실제 스토리지를 얻기 위해 수행하는 스토리지 요청을 나타냅니다.



5

백엔드 기술(Backend technology)  ?


PV는 추상적인 구성 요소이며, 실제 물리적 스토리지는 어딘가에서 가져와야 합니다.

다음은 몇 가지 예입니다.

CSI: Container Storage Interface(CSI) → (예: Amazon EFS , Amazon EBS , Amazon FSx 등)

iSCSI(SCSI over IP) 스토리지

local: 노드에 마운트된 로컬 저장 장치

NFS: 네트워크 파일 시스템(NFS) 스토리지





<5>  CSI (Container Storage Interface) driver ?


1

컨테이너 스토리지 인터페이스 ?


쿠버네티스에서 다양한스토리지 연결을 위해 CSI 인터페이스를 제공한다.


AWS CSI 드라이버 = EBS CSI 드라이버,EFS CSI 드라이버, FSx CSI 드라이버 등

Kubernetes 에 존재하는 AWS EBS provisioner는  Kubernetes release lifecycle을 따라서 배포되므로, provisioner 신규 기능을 사용하기 위해서는 Kubernetes version을 업그레이드해야 하는 제약 사항이 있다.

 따라서, Kubernetes 내부에 내장된 provisioner (in-tree)를 모두 삭제하고, 별도의 controller Pod을 통해 동적 provisioning을 사용할 수 있도록 만들었습니다.

이것이 바로 CSI (Container Storage Interface) driver 입니다



2

Kubernetes default limits ?


Amazon Elastic Block Store (EBS) = Maximum volumes per Node  39

https://kubernetes.io/docs/concepts/storage/storage-limits/


AWS EC2 Type에 따라 볼륨 최대 제한 : 25개 ~ 39개



3

# 확인

kubectl describe node | grep Allocatable: -A1

------------------------------------------------

Allocatable:

  attachable-volumes-aws-ebs:  25



4

KUBE_MAX_PD_VOLS 환경 변수의 값을 설정한 후, 스케줄러를 재시작하여 이러한 한도를 변경 가능.





<6> 임시 파일시스템 사용 테스트


1

# 파드 배포

# date 명령어로 현재 시간을 10초 간격으로 /home/pod-out.txt 파일에 저장


k ns default


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


2

# 파일 확인

(masterseo@myeks:default) [root@myeks-bastion-EC2 ~]# more date-busybox-pod.yaml

apiVersion: v1

kind: Pod

metadata:

  name: busybox

spec:

  terminationGracePeriodSeconds: 3

  containers:

  - name: busybox

    image: busybox

    command:

    - "/bin/sh"

    - "-c"

    - "while true; do date >> /home/pod-out.txt; cd /home; sync; sync; sleep 10; done"

(masterseo@myeks:default) [root@myeks-bastion-EC2 ~]#


kubectl get pod


kubectl exec busybox -- tail -f /home/pod-out.txt

-----------

Wed May 10 10:41:37 UTC 2023

Wed May 10 10:41:47 UTC 2023



3

# 파드 삭제 후 다시 생성 후 파일 정보 확인 > 이전 기록이 보존되어 있는지?

아니다 모두 날아간다.

이전 날짜 기록은 모두 없어진다.

휘발성이다라는것을 확인한것이다.


kubectl delete pod busybox



파드 재생성

휘발성이다.

kubectl apply -f date-busybox-pod.yaml


kubectl exec busybox -- tail -f /home/pod-out.txt

-----------------------

Wed May 10 10:43:45 UTC 2023

Wed May 10 10:43:55 UTC 2023

Wed May 10 10:44:05 UTC 2023



5

# 실습 완료 후 삭제

kubectl delete pod busybox




<7> 로컬 디스크 사용하는 호스트 path 사용


호스트의 로컬 디렉토리 사용해보자.

로컬 디스크를 사용하는 경우도 있다.

속도가 빠르다.



1

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

https://github.com/rancher/local-path-provisioner


2

# 배포

curl -s -O https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml

kubectl apply -f local-path-storage.yaml



3

# 확인 - 로컬 패스를 사용하는 스토리지 확인

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

NAME         PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE

local-path   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  34s


// local-path 라는 스토리지 클래스.




<8> PV/PVC 를 사용하는 파드 생성



1

# PVC 생성


curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/localpath1.yaml


cat localpath1.yaml | yh

(masterseo@myeks:default) [root@myeks-bastion-EC2 ~]# cat localpath1.yaml | yh

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: localpath-claim

spec:

  accessModes:

    - ReadWriteOnce

  resources:

    requests:

      storage: 1Gi



kubectl apply -f localpath1.yaml


(5분 걸린다)



2

# PVC 확인

kubectl get pvc

(masterseo@myeks:default) [root@myeks-bastion-EC2 ~]# kubectl get pvc

NAME              STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE

localpath-claim   Pending                                      local-path     94s



kubectl describe pvc



3

# 파드 생성

curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/localpath2.yaml

cat localpath2.yaml | yh

kubectl apply -f localpath2.yaml



4

# 파드 확인

kubectl get pod,pv,pvc


kubectl describe pv     

# Node Affinity 확인

배포된 파드



5

확인1

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

Wed May 10 10:55:34 UTC 2023

Wed May 10 10:55:39 UTC 2023

Wed May 10 10:55:44 UTC 2023

Wed May 10 10:55:49 UTC 2023

Wed May 10 10:55:54 UTC 2023

Wed May 10 10:55:59 UTC 2023

Wed May 10 10:56:04 UTC 2023

Wed May 10 10:56:09 UTC 2023

Wed May 10 10:56:14 UTC 2023



확인2

# 워커노드 중 현재 파드가 배포되어 있다만, 아래 경로에 out.txt 파일 존재 확인


ssh ec2-user@$N1 tree /opt/local-path-provisioner

/opt/local-path-provisioner

└── pvc-f1615862-e4cd-47d0-b89c-8d0e99270678_default_localpath-claim

    └── out.txt


ssh ec2-user@$N2 tree /opt/local-path-provisioner



5

# 해당 워커노드 자체에서 out.txt 파일 확인 : 아래  부분은 각자 실습 환경에 따라 다름


ssh ec2-user@$N1 tail -f /opt/local-path-provisioner/pvc-f1615862-e4cd-47d0-b89c-8d0e99270678_default_localpath-claim/out.txt




<9> 파드 삭제 후 파드 재생성해서 데이터 유지 되는지 확인


1

watch -d kubectl get pv,pvc,pods



# 파드 삭제 후 PV/PVC 확인

kubectl delete pod app


kubectl get pod,pv,pvc

// pv와 pvc가 남아 있음.



2

# 파드 다시 실행

kubectl apply -f localpath2.yaml


(masterseo@myeks:default) [root@myeks-bastion-EC2 ~]# more localpath2.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: localpath-claim

(masterseo@myeks:default) [root@myeks-bastion-EC2 ~]#



3

# 확인

kubectl exec -it app -- head /data/out.txt


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


데이터가 추가로 저장된 것을 확인하자~

예전 데이터도 남아 있다.

(masterseo@myeks:default) [root@myeks-bastion-EC2 ~]# kubectl exec -it app -- head /data/out.txt

Wed May 10 10:54:59 UTC 2023

Wed May 10 10:55:04 UTC 2023

Wed May 10 10:55:09 UTC 2023

Wed May 10 10:55:14 UTC 2023

Wed May 10 10:55:19 UTC 2023

Wed May 10 10:55:24 UTC 2023

Wed May 10 10:55:29 UTC 2023

Wed May 10 10:55:34 UTC 2023

Wed May 10 10:55:39 UTC 2023

Wed May 10 10:55:44 UTC 2023



(masterseo@myeks:default) [root@myeks-bastion-EC2 ~]# kubectl exec -it app -- tail -f /data/out.txt

Wed May 10 10:56:49 UTC 2023

Wed May 10 10:56:54 UTC 2023

Wed May 10 10:56:59 UTC 2023

Wed May 10 10:57:04 UTC 2023

Wed May 10 10:57:09 UTC 2023

Wed May 10 10:57:14 UTC 2023

Wed May 10 10:57:33 UTC 2023

Wed May 10 10:57:38 UTC 2023

Wed May 10 10:57:43 UTC 2023

Wed May 10 10:57:48 UTC 2023

Wed May 10 10:57:53 UTC 2023



4

# 파드와 PVC 삭제

kubectl delete pod app



kubectl delete pvc localpath-claim

// pvc삭제하면 pv도 삭제 된다.


# 확인

kubectl get pv






<10> 추가 공부 사이트



https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/




<11> 다음 과정 = EBS


https://brunch.co.kr/@topasvga/3234



https://brunch.co.kr/@topasvga/3217



감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari