본 내용은 CloudNet 주말 스터디 내용을 참고로 작성되었습니다.
계속 테스트하며 내용과 설명이 업데이트 됩니다.
진행?
이론 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 콘솔 로그온 하기
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
접속
// 아래 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를 위한 영구 스토리지 적용하기
2
파드 내부의 데이터는 파드가 정지되면 모두 삭제됨.
임시 스토리지(Ephemeral storage) 와 임시 볼륨(Ephemeral volumes) 둘다 임시다.
임시 볼륨(Ephemeral volumes) 도 Pod가 삭제되는 즉시 Volume도 삭제가 됨.
3
인스턴스 스토어는 인스턴스에 블록 수준의 임시 스토리지를 제공합니다.
인스턴스 스토어 정보
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
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 스트리지 클래스 배포
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
감사합니다.