PVC, PV - Pod(hostPath)
PVC(Persistent Volume Claim)
PVC란 일종의 PV와 Pod간의 명세서 역할을 해주는 Interface입니다.
인프라 담당자가 Pod는 개발자가 만들고, PV는 인프라 담당자가 만들게 되는데 PV가 변경되어도 개발자가 다른 설정사항을 수정하지 않아도 되게 해주는 역할을 하는 것이죠.
resource
자원을 정의하는 부분입니다.requests에서 사용할 스토리지의 용량을 storage속성을 통해 선택합니다.
이 값은 PV의 capaticy의 storage값과 일치해야 합니다.
accessModes
해당 마운트한 폴더에 접근 권한을 설정하는 부분입니다.
이 값은 PV의 accessModes의 값과 일치해야 합니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: anotherclass-123
name: api-tester-1231-files
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: kubectl
spec:
resources:
requests:
# volume의 용량을 정의
storage: 2G
# 접근 권한 설정(읽기, 쓰기, 읽기 & 쓰기)
accessModes:
- ReadWriteMany
selector:
matchLabels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231-files
PV(Persistent Volume)
PV란 Kubernets에서 지속적인 저장소 관리를하는 오브젝트입니다.
가령 이런 상황을 상상해봅시다.
보통 Kubernetes환경이 아닌 일반 환경에서 운영한다고 친다면, 우리는 local storage에 데이터를 저장하거나 파일을 저장할 겁니다.
하지만 Kubernetes환경은 조금 다르죠??
장애가 발생하면 Pod이 내려가고 새로운 Pod이 실행됩니다.
문제는 이 때 내려간 Pod의 local storage에 데이터를 저장하면 Pod이 내려갔을 때, 데이터는 삭제도리 겁니다. 그러면 운영환경에서 큰 문제가 있겠죠??
이 문제를 해결하기 위해 Pod이 아닌 특정 Node에 데이터를 쓰는 방식을 사용하는 겁니다.
그 Node에서 사용하는 path와 용량은 얼마나 사용할 것인지를 명세하는 오브젝트입니다.
local
spec에 있는 속성으로써 하위에 있는 path속성을 통해 Node의 Volume path를 지정합니다.
nodeAffinity
어느 Node를 지정할 것인지 정하는 속성입니다.local속성을 사용하면 nodeAffinity는 반드시 작성해야 합니다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: api-tester-1231-files
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231-files
version: 1.0.0
managed-by: dashboard
spec:
capacity:
storage: 2G
volumeMode: Filesystem
accessModes:
- ReadWriteMany
# 이 path를 Volume으로 사용하겠다는 의미
local:
# 미리 폴더를 만들어 두어야함
path: "/root/k8s-local-volume/1231"
# 대상 Node를 선택하는 것
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-master]}

참고사항
Pod
Pod내부에 volumes속성에 있는 hostPath속성과 nodeSelector를 사용해서 PV에 설정하는거 처럼 설정 할 수 있습니다.
하지만 이 경우는 Kubernets에서 지양하는 사항입니다.
hostPath, local 사용 목적은 Node의 정보를 이용해야하는 기능의 App에서 사용하거나 테스트환경에서 임시 저장 용도로 사용하는 것이 목적입니다.
절대 운영환경에서는 해당 속성으로 사용하지 마시기 바랍니다.
조금은 귀찮더라도 PVC와 PV를 이용해서 설정해 주시기 바랍니다.
Deployment - update
Deployment
이번에는 Deployment를 사용해 Version up을 하거나 RollBack을 할 경우에 대해 알아 보게습니다.
Pod의 업데이트는 Deployment의 template의 하위 속성값들이 변경되면 발생한다.
strategy
이 속성은 update시에 어떤 방식으로 Pod을 갈아 끼울건지에 대한 설정을 type속성에 할 수 있습니다.
- ReCreate
- 모든
Pod을 내리고 새로Pod을 생성하는 전략 - 운영중 배포가 중단되는 일이 발생
- 모든
- RollingUpdate
maxUnavailable속성으로 업데이트시 몇개의 Pod을 한번에 내릴건지 %비율로 설정할 수 있다.maxSurge속성으로 업데이트시 몇개의 Pod을 한번에 생성할건지 %비율로 설정할 수 있다.- 무중단 배포가 가능해진다. 하지만, 그만큼 자원을 사용하기 때문에 200%이상의 자원을 더 사용하게 될수도 있다.

Service
기본 개념
Service는 Pod과 외부와의 연결을 위해 존재하는 Object입니다.Node에 특정 port를 통해 Pod내부에 있는 Container에 접근이 가능하도록 도와주는 것이죠.
type
Service에 종류에는 두가지가 있습니다.
이전 예제에서 만들어 보았던 NodePort방식과 default로 설정되어 있는 ClusterIp방식이 있습니다.
NodePort(검은색 화살표 진행방향)
NodePort 방식의 속성들을 살펴보겠습니다.
- targetPort
targetPort란 최종적으로 Container에서 어디로 갈지 목적지 포트를 알려주는 겁니다.
- nodePort
nodePort는Node레벨에서 사용하는 포트입니다.- 외부에서 접근하는 포트이고 이 포트로 접속하면
selector로 선택한Pod의targetPort로 연결이 되는 것이지요
ports:
protocol: TCP
targetPort: 8080
nodePort: 31231
ClusterIp(초록색 화살표 진행방향)
이 타입은 Kubernetes 내부에서 Pod에 접근하기 위해서만 사용하는 타입입니다.
다시말해 내부통신을 위한 방법인것이죠.
또한 이 방식은 내부적으로 DNS를 이용한 Service이름으로 API호출이 가능하게 됩니다.
Pod내부에서 내 자신을 호출하는 방법# ${Service NAME}:${port}/${path} curl http://api-teseter-1231:80/versionPod내부에서 다른Pod을 호출하는 방법# ${Service NAME}.${Service NAMESPACE}:${port}/${path} curl http://api-teseter-1231.anotherclass-123:80/version
ClusterIp방식의 속성들을 살펴보겠습니다.
- targetPort
targetPort란 최종적으로Container에서 어디로 갈지 목적지 포트를 알려주는 겁니다.
- port
- 내부에서 접근할 포트
ports:
protocol: TCP
targetPort: 8080
port: 80
포트를 명시적으로 지정
name
Pod의 속성중에 containers - ports하위 속성에서 설정하면 명시적으로도 설정이 가능합니다.
이 방법은 name을 지정해 마치 labels와 selector처럼 target을 지칭하는 것 정도로 이해해도 괜찮습니다.
이 때, Service Object에는 targetPort속성에 값을 Pod의 containers - ports - name과 일치시켜 주면 됩니다.
현재 예시가 http라 프로토콜 관련이라고 이해하시는 분들이 계신데 헷갈리지 마시고 그냥 고유 이름을 가르킨다고 생각하고 이해하시기 바랍니다.
containerPort
name와 같은 레벨에 있는 속성으로써 명시적으로 지칭한 targetPort에서 어떤 Conainter의 포트로 API요청을 보내야하는지를 설정하는 속성입니다.

HPA
HPA는 Pod의 갯수를 자동으로 증가/감소 시켜주는 역할을 하는 Object입니다.
metrics
metrics는 어떤 상황일 때, scaleOut을 할지 정해주는 속성입니다. 아래 예시로 설명해 보겠습니다.
name
자원중에 어떤 자원으로 판별할지 이름을 적는 부분입니다. 우리는 cpu로 해보겠습니다.
target
cpu의 평균 사용량이 60%가 넘으면 scaleOut을 발생하게 합니다.
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averegeUtilization: 60
behavior
scaleUp
위에 작성한 scaleOut상황에서 좀 더 디테일하게 설정해주는 부분입니다.
아래 예시는 2분동안 60%이상의 cpu사용량을 유지할 시에 scaleOut을 한다는 의미입니다.
scaleDown
부하 감소했을 경우 scaleIn상황시에 좀 더 디테일하게 설정해주는 부분입니다.
아래 예시는 부하가 감소해도 10분 동안은 Pod의 갯수를 감소시키지 않는 다는 설정입니다.
policies
부하 감소시에 Pod의 갯수 감소에 대한 정칙을 설정하는 부분입니다.
아래 예시는 부하가 감소했을 경우 Pod을 1분마다 1개씩 제거한다는 의미입니다.
behavior:
scaleUp:
stabilizationWindowSeconds: 120
scaleDown:
stabilizationWindowSeconds: 600
policies:
- type: Pods
value: 1
periodSeconds: 60

이 글은 인프런의 일프로님 강의를 기반으로 재정리된 자료입니다.
'FrameWorks > Kubernetes' 카테고리의 다른 글
| [Kubernetes] CI/CD 환경 구축하기 (0) | 2025.03.11 |
|---|---|
| [Kubernetes] Component 동작으로 이해하기 (0) | 2025.03.11 |
| [Kubernetes] Application 기능 이해하기 - Configmap, Secret (0) | 2025.03.10 |
| [Kubernetes] Application 기능 이해하기 - Pod(Probe) (0) | 2025.03.09 |
| [Kubernetes] Object의 metadata 그림으로 파헤치기 (0) | 2025.03.07 |
댓글