Udemy CKA course 2. Core Concepts (핵심 개념 요약): Pod, Replica Set, Deployment, Service, Namespace

jihyelee·2023년 12월 29일
2

kubernetes

목록 보기
3/15

Certified Kubernetes Administrator (CKA) with Practice Tests (강의 링크, 레퍼런스 노트)

  • 평소 강의 할인도 많이 하고, 연습문제도 풀어볼 수 있으니 실제 강의 수강을 추천
  • 아래는 강의 내용 번역 및 정리본 (문제 시 댓글로 알려주세요)

Pod

  • 응용 프로그램을 컨테이너의 형태로 워커 노드(worker node)에 배포할 때 pod로 캡슐화
    • pod는 응용 프로그램(application)의 단일 인스턴스(instance)
    • 쿠버네티스에서 만들 수 있는 가장 작은 객체(object)
  • pod는 일반적으로 컨테이너와 1:1 관계
    • 스케일업을 할 때 pod를 생성, 스케일다운을 할 때 pod를 삭제
    • 기존 pod에 컨테이너를 추가로 생성하지 않음
  • 멀티 컨테이너 pod
    • 헬퍼 컨테이너가 필요할 때 동일 pod 내에 여러 개의 컨테이너를 가질 수 있음
    • 동일한 네트워크 공간 및 저장 공간 사용

명령어

  • pod 생성해 도커 컨테이너 배포
    • kubectl run nginx --image nginx
    • 도커 허브에서 도커 이미지 다운로드 (--image)
  • pod 확인
    • kubectl get pods
    • kubectl get pods -o wide
  • pod 자세하게 확인
    • kubectl describe pod [이름]
  • pod 삭제
    • kubectl delete pod [이름]

YAML

  • pod, replicaset, deployment, service 등의 객체를 생성할 때 yaml 파일 사용
  • pod-definition.yml
    • apiVersion: 쿠버네티스 API 버전 (e.g. v1, apps/v1)
    • kind: 객체의 타입 지정 (e.g. Pod)
    • metadata: name, labels 등 지정 (dictionary 형태, labels로 그룹화 가능)
    • spec: e.g. containers (list/array 형태, -로 구분)
  • kubectl create -f pod-definition.yml
  • kubectl apply -f pod-definition.yml
  • kubectl run [이름] --image=[이미지명] --dry-run=client -o yaml > [파일명].yaml

Replica Set

  • 응용 프로그램의 지속적인 수행을 보장하기 위함 (high availability)
    • 동일한 서비스를 제공하는 pod 여러 개를 Replication Controller가 관리하거나
    • 하나의 pod만 있더라도 Replication Controller가 관리 (서비스 죽으면 바로 복구)
  • 사용자가 몰릴 경우에도 원활한 서비스 제공 (load balancing & scaling)
    • 사용자가 몰려 로드가 증가할 때 pod를 추가로 만들어 응용 프로그램을 제공
    • Replication Controller는 여러 개의 node에 걸칠 수 있음

YAML

Replication Controller

  • 이전 버전에서 사용됨
  • apiVersion: v1
  • kind: ReplicationController
  • metadata: name, labels key는 고정
    • name: myapp-rc
    • labels: labels 하위의 dictionary key는 사용자가 정할 수 있음
      • app: myapp
      • type: front-end
  • spec:
    • template: pod에 대한 템플릿을 만듦
      • pod.yaml에서 metadata, spec 부분을 옮김
    • replicas: 3
  • kubectl create -f [파일명].yml
  • kubectl get replicationcontroller
  • kubectl get pods

Replica Sets

  • 최근 버전에서 사용됨
  • apiVersion: apps/v1
  • kind: ReplicaSet
  • metadata: name, labels key는 고정
    • name: myapp-replicaset
    • labels: labels 하위의 dictionary key는 사용자가 정할 수 있음
      • app: myapp
      • type: front-end
  • spec:
    • template: pod에 대한 템플릿을 만듦
      • pod.yaml에서 metadata, spec 부분을 옮김
    • replicas: 3
    • selector: 어떠한 pod가 하위에 있는지 구분 가능 (Replica Set에만 있음)
      • matchLabels:
        • type: front-end

Labels and Selectors

  • Replica Set은 pod를 모니터링하는 프로세스
  • 어떠한 pod를 모니터링할지는 레이블링으로 결정
    • matchLabels (replicaset yaml) == labels (pod yaml)
    • 만약 이미 돌고 있는 pod가 있다면 해당 pod를 포함, 그렇지 않다면 새로 생성

명령어

  • replica set 스케일 하는 법
    • replicas 숫자 변경 (yaml file) 후 kubectl replace -f [파일명].yml
    • kubectl scale --replicas=[숫자] -f [파일명].yml
    • kubectl scale --replicas=[숫자] replicaset[타입] myapp-replicaset[이름]
      • 하지만 파일 안의 내용이 자동으로 업데이트되지는 않음
  • kubectl create -f [파일명].yml
  • kubectl get replicaset
  • kubectl get pods
  • kubectl delete replicaset(rs) [이름]
  • kubectl edit replicaset(rs) [이름]
    • 수정 후에 기존 pod를 삭제해야 변경사항이 반영된 pod가 자동으로 생성됨

Deployment

  • Deployment는 아래와 같은 기능을 가능케 함
    • 운영환경에 배포 시 여러 개의 인스턴스 필요
    • 응용 프로그램의 새로운 버전 등장 시 인스턴스 업그레이드
      • 동시에 업그레이드하지 않고 인스턴스를 하나씩 업그레이드할 수도 있음 (rolling update)
      • 문제가 발생할 시 롤백 (roll back)
    • 환경을 잠시 멈추고 모든 변경사항을 수행한 뒤 재시작
  • Deployment는 Replica Set을 감싸고 있는 상위 객체
    • Replica Sets
      • 여러 개의 pod를 배포
    • Pod
      • 응용 프로그램의 단일 인스턴스 배포
      • 컨테이너를 캡슐화

YAML

  • apiVersion: apps/v1
  • kind: Deployment
  • 여타 부분은 Replica Set과 동일

kubectl run으로 yaml file 간편하게 만들기

  • nginx pod 만들기
    • kubectl run nginx --image=nginx
  • POD manifest yaml 파일 (-o yaml) 작성
    • kubectl run nginx --image=nginx --dry-run=client -o yaml
    • dry-run 사용 시 파일만 생성될 뿐 실제 pod가 생성되지는 않음
  • Deployment yaml 파일 작성
    • kubectl create deployment --image=nginx nginx --dry-run=client -o yaml > nginx-deployment.yaml
    • kubectl create deployment --image=nginx nginx --replicas=4 --dry-run=client -o yaml > nginx-deployment.yaml
      • 1.19 버전 이상에서는 --replicas 옵션으로 deployment 생성 가능
  • 파일 수정 후 Deployment 생성
    • kubectl create -f nginx-deployment.yaml

명령어

  • kubectl create -f [파일명].yml
  • kubectl get deployments(deploy)
  • kubectl get all

Service

  • 다양한 그룹 사이의 연결성(connectivity) 및 통신 담당
    • 프론트엔드과 엔드 유저(사용자)
    • 프론트엔드와 백엔드
    • 백엔드와 데이터

NodePort

  • 노드의 포트로부터 들어오는 요청을 pod에 전달하는 역할
  • 사용자가 쿠버네티스 노드 내의 pod에 접속하고자 할 때 사용
    • TargetPort
      • Pod에 붙어있는 포트
    • Port
      • Service에 붙어있는 포트
      • 클러스터 IP와 함께 존재
    • NodePort
      • Node에 붙어있는 포트
      • 30000-32767 (범위)
  • 여러 개의 pod와 연결될 때, 랜덤 알고리즘으로 로드 밸런싱
  • 1(pod):1(node), N:1, N:N일 경우 모두 가능

YAML

  • apiVersion: v1
  • kind: Service
  • metadata:
    • name: myapp-service
  • spec:
    • type: NodePort
    • ports:
      • -targetPort: 80
      • port: 80 (필수)
      • nodePort: 30008
    • selector: replicaset처럼 관련 pod의 정보를 작성 (labels)
      • app: myapp
      • type: front-end

ClusterIP

  • 클러스터 내에 가상의 IP를 생성
  • 다른 서비스들 간의 통신을 담당 (e.g. 프론트엔드와 백엔드)
  • 여러 개의 서비스 pod(e.g. 백엔드)를 위한 단일한 인터페이스를 제공

YAML

  • apiVersion: v1
  • kind: Service
  • metadata:
    • name: back-end
  • spec:
    • type: ClusterIP (서비스의 기본타입)
    • ports:
      • -targetPort: 80 (백엔드가 노출되는 포트)
      • port: 80 (서비스가 노출되는 포트)
    • selector: pod의 labels 정보 가져오기
      • app: myapp
      • type: back-end

LoadBalancer

  • 로드 트래픽을 여러 다른 웹서버로 분산하는 역할
  • 여러 개의 클러스터 노드 IP에 대해 개별 접속하는 것이 아니라 단일한 경로로 서비스를 사용할 수 있도록 도움
  • NodePort 대신 LoadBalancer 사용할 수 있음
    • Google Cloud Platform 등에서는 사용 가능
    • VirtualBox에서는 사용 불가

명령어

  • kubectl create -f [파일명].yaml
  • kubectl get services(svc)
  • curl http://192.168.1.2:30008
    • NodePort의 IP, port 정보 (접속 시)
  • kubectl expose pod [pod명] --port=[포트번호] --name [service명] --dry-run=client -o yaml
    • pod를 포트에 노출시키는 ClusterIP 타입의 서비스 파일 생성
    • pod의 레이블을 자동으로 selector로 사용
  • kubectl create service clusterip [pod명] --tcp=6379:6379 --dry-run=client -o yaml
    • 위와 동일하게 서비스 파일을 생성하는 명령어
    • selector를 자동으로 선택하는 것이 아니라 app=redis로 설정하기 때문에 주의 필요 (수정 필요할 수 있음)
  • kubectl run [pod명] --image=[이미지명] --port=[포트번호] --expose=true
    • Service와 Pod를 동시에 생성할 수 있음

Namespace

  • 자동 생성 네임스페이스
    • Default
      • 클러스터가 셋업될 당시 자동으로 만들어짐
    • kube-system
      • 네트워킹, DNS 등 사용자가 실수로 삭제해서는 안 될 것들을 모아놓음
    • kube-public
      • 모든 사용자들이 이용 가능한 자원
  • 서비스와 자원들을 고립시킬 때 유용 (isolation)
    • e.g. 개발환경과 운영환경을 분리할 때
  • 네임스페이스마다 다른 정책 사용 가능 (policies)
  • 사용 가능한 자원의 한계를 지정 가능 (resource limit)

명령어

  • 기본 네임스페이스 내 명령어 (pod 확인, 생성)
    • kubectl get pods
    • kubectl create -f [파일명].yaml
  • 네임스페이스 지정 명령어 (pod 확인, 생성)
    • kubectl get pods --namespace=kube-system(-n=)
    • kubectl create -f [파일명].yaml --namespace=dev
      • 혹은 yaml file metadata 하위에 namespace: dev와 같이 작성
  • 네임스페이스 확인
    • kubectl get namespaces(ns)
  • 네임스페이스 생성
    • kubectl create namespace [이름]
  • 네임스페이스 전환 (기본에서 변경)
    • kubectl config set-context $(kubectl config current-context) --namespace=dev
  • 모든 네임스페이스 확인
    • kubectl get pods --all-namespaces(-A)

YAML

  • apiVersion: v1
  • kind: Namespace
  • metadata:
    • name: dev

DNS

  • 같은 네임스페이스 안에서는 이름으로 호출 가능
    • e.g. mysql.connect("db-service")
  • 다른 네임스페이스에 있는 서비스를 호출할 때는 서비스명.네임스페이스.svc.cluster.local 형태로 호출
    • e.g. mysql.connect("db-service.dev.svc.cluster.local")
    • cluster.local은 기본 도메인명 (쿠버네티스 클러스터)
    • svc는 서브도메인 (서비스)

Resource Quota

  • apiVersion: v1
  • kind: ResourceQuota
  • metadata:
    • name: compute-quota
    • namespace: dev
  • spec:
    • hard:
      • pods: '10'
      • requests.cpu: '4'
      • requests.memory: 5Gi
      • limits.cpu: '10'
      • limits.memory: 10Gi
  • kubectl create -f [파일명].yaml

Imperative vs. Declarative

  • Imperative
    • 무엇이 필요한지, 어떻게 해야 하는지 단계적 설명 제공
    • 직접적으로 객체의 생성, 변경, 삭제 등을 진행
      • YAML 파일을 변경하지 않고 명령어로 생성, 수정 시에 쿠버네티스 메모리에는 기록이 남으나 로컬 파일에는 변경되지 않으므로 주의 필요
    • kubectl run --image=nginx nginx
    • kubectl create deployment --image=nginx nginx
    • kubectl expose deployment nginx --port=80
    • kubectl edit deployment nginx
    • kubectl scale deployment nginx --replicas=5
    • kubectl set image deployment nginx nginx=nginx:1.18
    • kubectl create -f nginx.yaml
    • kubectl replace -f nginx.yaml
    • kubectl delete -f nginx.yaml
  • Declarative
    • 필요한 것들만 명시, 시스템이 알아서 진행
    • configuration을 시스템이 확인하고 알아서 생성, 변경, 삭제 등을 진행
    • kubectl apply -f nginx.yaml
      • 쿠버네티스의 live object configuration에 정보 저장됨 (다른 명령어와 동일)
      • json 포맷으로 변경되어 마지막으로 적용된 configuration 저장 (다른 명령어와 다름)
        • live object configuration 내에 저장됨
        • 어떤 필드가 삭제되었는지 확인 용이
profile
Graduate student at Seoul National University, majoring in Artificial Intelligence (NLP). Currently AI Researcher and Engineer at LG CNS AI Lab

0개의 댓글

관련 채용 정보