본문 바로가기
BackEnd/K8S

[K8S] 쿠버네티스 스터디 - 1(pod, replica set, deployment, namespace)

by 하용권 2024. 5. 8.

사내 쿠버네티스 스터디

 

 

POD

POD 는 K8S에서 만들 수 있는 가장 작은 단위

POD는 보통은 컨테이너와 1 대 1로 매핑

확장을 위해서 기존 POD에 컨테이너를 추가하지 않음.(새로운 POD를 생성하거나 POD를 지움)

 

POD 하나에 여러 컨테이너를 넣을 수 있음.

(파일 관리 같은 Helper Container가 필요할 수 있음.)

-> POD만 정의하면 모든 컨테이너가 함께 작동하기 때문에 관리하기 용이.

 

이들은 서로 같은 공간을 공유하기 때문에 파일이나 통신이 용이.

 

 

 

//pod 생성
kubectl run [pod name] --image [image_name]

//pod 목록
kubectl get pods

 

 

POD들은 YAML 파일 기반으로 만들 수 있음.

# pod-def.yml

apiVersion : v1 # API 버전
kind:Pod # replicaset 등 종류
metadata: #개체에 대한 데이터
  name : myServer-pod #obeject 이름
  labels: #레이블. 이 레이블 이름을 기반으로 필터링을 할 수 있음.
    app: myServer
    type: back-end
spec: #object에 관련된 추가 정보 제공하는 곳.
  containers:
    - name: server-contaniner
    imgae: server
          
          
          
  #이를 이용하여 실행 가능        
  #kubectl create -f pod-def.yml

 

 

 

Replica Sets

pod가 다운되면, 끝남.

replication controller는 pod가 죽으면, 다시 실행시킴.

또한 node에 리소스가 부족하면, 다른 node에 pod를 실행함.

 

replica set 과의 차이점은?

replica controller가 replica set드로 대체되고 있다고 함.

 

# rc-def.yml. replica controller

apiVersion : v1 # API 버전
kind:ReplicaController
metadata: 
  name : myServer-pod #obeject 이름
  labels: #레이블. 이 레이블 이름을 기반으로 필터링을 할 수 있음.
    app: myServer
    type: back-end
spec: #object에 관련된 추가 정보 제공하는 곳.
  template: # pod 정보 작성
    # pod 정보
    metadata:
      name: myServer-pod
      labels:
        app: myServer
        type: bacek-end
    spec:
      containers:
        - name: server-contaniner
        imgae: server
        
  replicas: 3
          
          
          
  #이를 이용하여 실행 가능        
  #kubectl create -f rc-def.yml
  
  
  
# rs-def.yml. replica set
  
  
apiVersion : apps/v1 # replica controller와 다름. 이렇게 선언 안 하면 에러 발생?
kind:ReplicaSet
metadata: 
  name : myServer #obeject 이름
  labels: 
    app: myServer
    type: back-end
spec: #object에 관련된 추가 정보 제공하는 곳.
  template: # pod 정보 작성
    # pod 정보
    metadata:
      name: myServer-pod
      labels:
        app: myServer
        type: bacek-end
    spec:
      containers:
        - name: server-contaniner
        imgae: server
        
  replicas: 3
  selector: # controller와 다른 점. set은 필수로 선언 필요. contrlloer는 기본으로 정의파일에서 정의한 레이블이랑 같다고 판단
    matchLabels:
      type: back-end
    
  #이를 이용하여 실행 가능        
  #kubectl create -f rs-def.yml

 

select가 정확히 무슨 역할을 하는지?

이미 생성되어 있던 pod를 모니터링할 수 있음.

하나가 고장나면 재배포도 가능.

 

만약 이미 3개가 있는 상태에서 replicas를 3으로 설정하면?

이미 3개가 있으니까 다시 pod를 재배포하지 않음.

-> pod를 재배포하지는 않지만, spec은 적어야 함. 나중에 다운될 수도 있기 때문.

 

scale 하고 싶으면,

// replicas 설정하고
k replace -f rs-def.yml

k scale --replicas=6 -f rs-def.yml

k scale --replicas=6 replicaset myServer

 

 

Deployments

여러 pod가 있을 경우, 모두 한 번에 업데이트하는 것보다는 하나 씩 하는 것이 좋음

-> 이를 롤링 업데이트라고 함.

 

만약 하다가 문제가 생기면 롤백을 할 수 있어야 함.

보통 pod 들은 replica set을 이용.

deployment는 롤링 업데이트 등 인스턴스를 매끄럽게 업데이트 해줌.

 

deployment > replica set > pod

# df-def.yml
  
  
apiVersion : apps/v1 # replica controller와 다름. 이렇게 선언 안 하면 에러 발생?
kind: Deployment # 대문자 지켜야 함
metadata: 
  name : myServer-deployment #obeject 이름
  labels: 
    app: myServer
    type: back-end
spec:
  template:
    # pod 정보
    metadata:
      name: myServer-pod
      labels:
        app: myServer
        type: bacek-end
    spec:
      containers:
        - name: server-contaniner
        imgae: server
        
  replicas: 3
  selector:
    matchLabels:
      type: back-end
    
  #이를 이용하여 실행 가능        
  #kubectl create -f df-def.yml

 

파일은 replica set이랑 큰 차이가 없음.

 

 

 

Namespaces

dev, stg, prod 처럼 서로 공간을 분리할 수 있음.

-> 다른 name space의 리소스를 실수로 건들이지 않도록 할 수 있음.

 

dns

같은 name space안에서는 service 이름으로 서로 호출 가능.

 

다른 name space의 service를 부르려면? 

-> [service 이름].[name space].svc.cluster.local ..?

cluster.local은 domain, svc는 service 를 뜻함.

 

 

# pod-def.yml

apiVersion : v1 # API 버전
kind:Pod # replicaset 등 종류
metadata: #개체에 대한 데이터
  name : myServer-pod #obeject 이름
  namespace: dev
  labels: #레이블. 이 레이블 이름을 기반으로 필터링을 할 수 있음.
    app: myServer
    type: back-end
spec: #object에 관련된 추가 정보 제공하는 곳.
  containers:
    - name: server-contaniner
    imgae: server
          
          
          
  #이를 이용하여 실행 가능        
  #kubectl create -f pod-def.yml

namespace는 metadata아래에 선언하면 됨.

 

 

namesapce를 만들려면?

apiVersion : v1
kind:Namespace 
metadata: #개체에 대한 데이터
  name : dev

 

 

 

반응형