Search

기본 구성요소(Object)

1.
Pod
a.
하나의 독립적 서비스를 구현하는 컨테이너들이 존재
b.
컨테이너별로 서비스를 제공하는 포트를 보유
i.
같은 pod 내 중복 포트 사용 불가
ii.
pod는 하나의 host처럼 동작 : 다른 container로 접근할때 localhosts:8080 이런식으로 접근 가능
c.
생성시 자동으로 IP 할당 : 휘발성 IP
i.
클러스터 내에서만 접근할 수 있는 IP → 외부에서는 접근 불가
ii.
pod에 문제가 생기면 pod가 삭제되고 재생성되는데 IP 주소는 변경
2.
label : key:value 형태
a.
목적에 따라 object를 분류하고, 해당 object만 따로 연결하기 위함
b.
pod 뿐만 아니라 모든 object에 연결 : pod에서 제일 많이 사용
c.
하나의 pod에는 다수의 label을 연결 가능
i.
#처럼 원하는 pod를 선택하여 사용
3.
Node Schedule
a.
pod는 결국 특정한 Node에서 동작
b.
내가 원하는 node에서 동작
i.
node에 label을 연결
ii.
pod 생성시 label을 지정
c.
자동으로 할당된 node에서 동작
i.
k8s sellector가 자동으로 노드를 선택
ii.
전체 사용 가능한 자원량(CPU/MEM 등)을 기준으로 선택
iii.
Node 내 특정 pod가 자원을 무한정 사용하려 할때, 해당 Node 내 자원 부족으로 다른 pod도 죽을 수 있음
iv.
형태
1.
request
2.
limit : memory 의 경우 초과시 pod 종료. cpu의 경우 pod 종료는 안함
a.
파일 복사사 다른 파일 복사하면 종료되진 않고 느려지는 경우 있음 → CPU
b.
가끔씩 다른 작업할때 잘못된 메모리를 침범하여 프로세스 종료 → 메모리
4.
Service
a.
여러 종류가 있고, 종류에 따라 pod에 접근하는 방식이 다름
b.
서비스를 pod에 연결시켜 두면, 서비스를 통해 pod에 접근 가능
c.
서비스는 사용자가 삭제하지 않으면, 변경되거나 재생성되지 않음
i.
서비스의 IP로 연결하면 항상 연결됨
d.
pod는 언제든지 죽을 수 있고 재생성 발생 → 신뢰성이 떨어짐
i.
pod의 IP는 서비스 내에서만 접근
ii.
재생성되면 IP가 새롭게 변경
5.
Service - Cluster IP : 외부 접근 불가
a.
기본적으로 자신의 cluster IP를 사용
b.
type 미입력시 기본 적용 서비스
c.
Cluster 내에서만 접근 가능
i.
pod의 IP와 동일한 특징
ii.
외부에서 접근 불가
d.
하나의 서비스에 다수의 pod 연결
i.
서비스가 트래픽을 분산해서 pod에 연결
e.
사용 환경 : 인가된 사용자(운영자), 내부 대시보드, pod의 서비스상태 디버깅
6.
Service - NodePort : 외부→노드포트 → 서비스 → pod
a.
클러스터 IP의 성격을 가짐 : 서비스에는 cluster IP를 사용
b.
모든 node에 동일한 포트를 할당
i.
물리적인 host 의 IP를 통해서 pod에 접근
ii.
host IP는 보안적 이유로 내부망에서만 접근하는 것이 일반적
c.
외부로부터 해당 IP를 이용하여 동일 포트로 접근을 허용
i.
서비스는 자신에게 연결된 pod에 서비스를 연결
ii.
다만 pod가 없는 node를 포함한 모든 node에 포트를 할당
d.
접근시 node의 포트로 접근
i.
서비스는 node의 IP와 상관없이 자신에게 연결된 아무 pod한테나 트래픽을 전달
ii.
YAML 내 externalTrafficPolicy를 local로 주면, 해당 node IP의 pod에게만 전달
1.
이 경우 pod가 없는 nodeport로 접근시 접근 불가
e.
사용환경 : 보안적 이유로 내부망에서만 연결, Demo나 임시 연결용, daemonset에서 활용
7.
Service-LoadBalancer : 외부→로드밸런서→서비스→pod
a.
노드포트의 성격을 가짐
b.
접근시 로드밸런서가 부하를 자동 분산
c.
실제 서비스를 외부에 연결시 사용
i.
내부 IP를 외부에 노출시키지 않고, 서비스를 안정적으로 운영
d.
외부 접근을 위한 IP는 기본적으로 생성되지 않음 : 별도로 외부 IP를 할당해주는 플러그인이 필요
e.
사용 환경 : 외부 시스템 노출용
8.
Volume
9.
Volume - emptyDir
a.
pod 내 컨테이너끼리 데이터를 공유하기 위함
b.
Volume 생성시 항상 내용이 비어 있어서 emptyDir로 명칭
c.
pod 재 생성시 데이터 없음 : 일시적 사용 목적 데이터만 사용
10.
Volume - hostpath
a.
host 내 pod들끼리 데이터를 공유하기 위함
b.
Host 내 특정 경로의 path를 사용
i.
pod 생성전에 사전에 경로가 존재해야 함
ii.
type따라 pod 생성시 경로 생성도 가능 : DirectoryOrCreate
c.
각각의 pod들이 mount해서 데이터를 공유
d.
pod가 죽어도 데이터는 유지
e.
pod가 동일 host에서 재성성되면 데이터 접근
f.
pod가 다른 host에서 재생성되면 접근 불가
i.
노드 추가시마다 동일이름의 NFS를 마운트하면 동일 데이터 볼수 있음 : k8s 기능 아님
11.
Volume - PVC/PV : Persistent Volume Claim / Persistent Volume
a.
pod에 영속성 있는 볼륨을 제공 : 로컬볼륨(특정 host에만 pod 구동) 외부볼륨(nfs, iSCSI, git 등)
b.
pod는 PVC를 통해 PV와 연결
c.
PV : admin 영역, k8s 운영자
i.
실제 스토리지 연결에 대한 정의
d.
PVC : 사용자 영역, pod 배포 담당하는 서비스 담당자
i.
볼륨 할당 요청
ii.
요청보다 낮은 PV만 있는 경우에는 연결 불가
iii.
요청보다 높은 PV가 가용한 경우에는 연결
Volume 다시 볼것!!!
12.
Object -
a.
Pod 생성시 ConfigMap과 Secret을 연결하면, 환경변수에 해당 Object가 적용됨
b.
pod에서는 해당 환경변수를 적용하여 생성
c.
환경에 따라 변경되는 값들을 외부에서 결정
d.
Dev/Production 상관없이 동일 이미지 사용 가능
e.
상수/파일/볼륨마운트를 통해 사용 가능
i.
상수 : 직접 YAML 파일 안에 기록
ii.
파일 : 파일이름이 key, 내용이 value
1.
pod 생성시 적용되며, 생성 후 변경사항은 적용되지 않음
2.
pod 재생성시 적용
iii.
볼륨마운트(파일) :
1.
기본사항은 파일과 동일
2.
pod 생성시 mount path를 정의해서 파일을 마운트
3.
pod 생성후에도 파일 변경시, 변경사항 적용
13.
Object - ConfigMap
a.
분리해야 하는 일반적인 내용들을 모아
b.
key:value로 구성
i.
모두 string(문자열)
ii.
boolean(true/false) 값 입력시는 ‘true’로 감싸줘야 함 →boolean은 프로그램 조건문, if등에서 직접 사용 가능, string은 조건문에서 쓰려면 추가 변환 필요
14.
Object - Secret
a.
키와 같이 보안적인 사항을 모아
b.
상수값 입력시는 key:value이나 value를 Base64 encording된 값을 입력
c.
파일 입력시에 base64 인코딩이 되기때문에, 사전에 encording 없음
d.
pod에 적용될 때는 decoding응 통해 적용
e.
1Mb까지 메모리에 저장 ← 많으면 시스템 자원에 영향
f.
일반적 object 값들은 K8s DB에 저장되나, Secret은 메모리에 저장
15.
전체 사용할수 있는 자원이 있음 - mem/cpu 등
a.
하나의 클러스터 안에는 여러 namespace가 존재
b.
namespace 안에는 여러 pod가 존재
c.
pod는 필요한 자원을 할당 받아 사용
16.
Namespace
a.
동일 namespace 내 object들은 이름 중복 불가
i.
예를 들어 pod 이름 등
ii.
별도의 UUID가 존재는 하나, 이름 역시도 중복은 불가
b.
다른 namespace의 자원과 분리하여 관리
i.
PV나 node는 namespace 상관없이 사용 가능
c.
namespace 삭제시 내부 object도 함께 삭제됨으로 주의
d.
기본적으로 namespace간에는 통신 가능, network policy로 제한 필요
i.
nodeport와 hostpath도 namespace간에 share되어 중복 불가
17.
ResourceQuota - namespace와 cluster에 적용
a.
namespace 내 자원에 대한 자원의 한계를 설정
i.
제한하고 싶은 object를 정의
1.
cpu/mem/storage
2.
object count : pod, service, configmap 등
ii.
request : 최소 확보 용량
iii.
limit : 최대 용량
b.
namespace에 resourcequota가 존재하면 pod에도 존재해야함, 미존재시 생성 안됨
c.
pod request의 합계가 resourcequota의 request를 초과하면 생성 안됨
d.
한 namespace 안에 과다한 자원을 사용할 경우 다른 namespace의 pod에 영향
e.
namespace 마다 최대 한계를 설정하여 자원 사용량 제한
f.
namespace 내 pod는 자원이 모자르지만, 다른 namespace에는 영향을 못미침
g.
기존 pod가 있는 상태에서 resourcequota를 추가 적용시 신규 pod부터 영향
18.
limitRange - namespace와 cluster에 적용
a.
한 pod에 과다한 자원을 사용할 경우 같은 namespace 내 pod에 영향
b.
pod의 크기를 제한 - limitrange보다 작은 pod만 생성 가능
c.
각각의 pod마다 namespace에 들어올 수 있는지 체크
i.
min : 최소 값
ii.
max : 최대 값
iii.
MaxLimitRequestRatio : request와 limit의 차이가 최대 몇배인가
iv.
defaultrequest : pod에 아무런 설정이 없으면 request로 적용
v.
default : pod에 아무런 설정이 없으면 limit로 적용
d.
하나의 namespace에 여러개의 limitragne를 설정하면 값별로 혼재되어 적용 → 주의해라
i.
max는 작은값, default는 큰 값
:clipboard:
반드시 익혀야 할 Kubernetes 객체들:
Namespace, Pod, ReplicaSet, Deployment, Service, Ingress, Secret, ConfigMap, LimitRange, ResourceQuota, HorizontalPodAutoscaler, RBAC (Role/RoleBinding, ClusterRole/ClusterRoleBinding), StorageClass, PersistentVolumeClaim (PVC), PersistentVolume(PV), NetworkPolicy, Job, CronJob, StatefulSet, DaemonSet)
1- Namespace
클러스터 안에서 자원을 논리적으로 분리하고 체계적으로 관리할 수 있도록 해줍니다.
## Command$kubectl get ns ## Output NAME STATUS AGE default Active 30d dev Active 10d prod Active 30d
Shell
복사
2- Pod
가장 작은 배포 단위로, 하나 이상의 밀접하게 연관된 컨테이너를 실행합니다.
kubectl get pods NAME READY STATUS RESTARTS AGE web-app-abc123 1/1 Running 0 3h
SQL
복사
3- ReplicaSet
롤링 업데이트와 확장을 위해 ReplicaSet을 선언적으로 관리합니다.
kubectl get rs NAME DESIRED CURRENT READY web-app-6f7b6c7d8 3 3 3
SQL
복사
4- Deployment
ReplicaSet을 선언적으로 관리하며, 롤링 업데이트와 확장을 손쉽게 할 수 있게 해줍니다.
kubectl get rs NAME DESIRED CURRENT READY web-app-6f7b6c7d8 3 3 3
SQL
복사
5- Service
Pod에 접근할 수 있는 안정적인 IP/DNS를 제공하고, 로드 밸런싱 기능도 지원합니다.
kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) web-svc ClusterIP 10.96.0.1 <none> 80/TCP
SQL
복사
6- Ingress
서비스에 대한 외부 접근을 관리하며, 라우팅과 TLS 종료를 지원합니다.
kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS web-ingress nginx app.example.com 34.120.0.10 80,443
Swift
복사
7- Secret
비밀번호나 토큰 같은 민감한 데이터를 안전하게 저장하며, base64로 인코딩된 형태로 관리합니다.
kubectl get secrets NAME TYPE DATA AGE db-credentials Opaque 2 7d
C#
복사
8- ConfigMap
민감하지 않은 애플리케이션 설정 값을 key-value 형태로 저장합니다. 코드와 설정을 분리해 관리할 수 있게 해줍니다.
kubectl get configmaps NAME DATA AGE app-config 3 2d
C#
복사
9- LimitRange
Pod과 컨테이너가 사용할 수 있는 최소·최대 자원 한도를 정의합니다. 이를 통해 자원 남용을 방지할 수 있습니다.
kubectl get limitrange -n dev NAME AGE container-limits 14d
C#
복사
10- ResourceQuota
Namespace 전체에서 사용할 수 있는 자원 총량을 제한해, 자원이 공정하게 배분되도록 합니다.
kubectl get resourcequota -n dev NAME CPU(REQUEST) MEMORY(REQUEST) AGE compute-quota 4 8Gi 14d
Scss
복사
11- HorizontalPodAutoscaler
CPU, 메모리, 혹은 사용자 정의 지표를 기반으로 Pod 수를 자동으로 늘리거나 줄입니다.
kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS AGE web-app-hpa Deployment/web-app 50%/80% 2 5 7d
Swift
복사
12- RBAC (Role/RoleBinding, ClusterRole/ClusterRoleBinding)
클러스터 내 세밀한 권한 관리를 제공하는 역할 기반 접근 제어 방식입니다.
kubectl get roles -n dev NAME AGE dev-reader 20d
C#
복사
13- StorageClass
스토리지 유형을 정의하고 동적 프로비저닝을 지원합니다. 클라우드 네이티브 환경에서 유용하게 쓰입니다.
kubectl get storageclass NAME PROVISIONER AGE gp2 (default) kubernetes.io/aws-ebs 30d
Kotlin
복사
14- PersistentVolumeClaim (PVC)
Pod이 스토리지를 요청할 수 있도록 PersistentVolume과 연결해줍니다.
kubectl get pvc NAME STATUS VOLUME CAPACITY AGE db-storage Bound pv001 50Gi 12d
Swift
복사
15- PersistentVolume (PV)
클러스터 내 실제 스토리지를 제공하며, 수동 혹은 동적으로 프로비저닝됩니다.
kubectl get pv NAME CAPACITY ACCESS MODES STATUS AGE pv001 50Gi RWO Bound 12d
Swift
복사
16- NetworkPolicy
Pod 간 또는 Pod과 서비스 간의 통신을 제어합니다. 네트워크 보안에 반드시 필요한 요소입니다.
kubectl get networkpolicy NAME POD-SELECTOR AGE allow-frontend app=frontend 10d
C#
복사
17- Job
작업이 성공할 때까지 Pod을 실행합니다. 데이터베이스 마이그레이션 같은 일회성 작업에 적합합니다.
kubectl get jobs NAME COMPLETIONS DURATION AGE data-migration 1/1 30s 2h
Kotlin
복사
18- CronJob
Job을 정해진 주기마다 실행합니다. 백업이나 정기 리포트 생성에 유용합니다.
kubectl get cronjobs NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE db-backup 0 2 * * * False 0 4h ago
SQL
복사
19- StatefulSet
고정된 ID와 영구 스토리지를 갖는 Pod을 관리합니다. 데이터베이스 같은 상태 기반 워크로드에 적합합니다.
kubectl get statefulsets NAME READY AGE mysql-db 3/3 5d
C#
복사
20- DaemonSet
클러스터의 모든 노드에서 Pod이 실행되도록 보장합니다. 로깅 에이전트, 모니터링, 네트워킹 등에 활용됩니다.
kubectl get daemonsets -n kube-system NAME DESIRED CURRENT READY fluentd-logging 3 3 3
SQL
복사
:backhand_index_pointing_right:
참고: 터미널 안에서 바로 문서를 확인하고 싶다면 아래 명령을 사용할 수 있습니다.
kubectl explain <object-name>
C#
복사
Name
Select
link