Kubernetes

jungseo·2023년 7월 21일

Cloud

목록 보기
2/4

쿠버네티스란

  • 컨테이너 오케스트레이션(orchestration) 도구로, 대규모 분산 애플리케이션의 배포, 관리, 확장을 자동화하는 오픈 소스 플랫폼

    컨테이너 오케스트레이션 도구 :
    수많은 컨테이너를 관리하기 위한 툴

  • 컨테이너 기술인 도커(Docker)와 같은 컨테이너 런타임을 기반으로 동작
  • 도커는 애플리케이션을 컨테이너로 패키징하여 이식성과 확장성을 갖도록 해주는 기술이며, 쿠버네티스는 이러한 도커 컨테이너를 관리하고 조율하여 클러스터 내에서 효율적으로 운영할 수 있도록 함

1. 기능

  • 컨테이너 스케줄링
    • 클러스터 내에서 컨테이너를 적절히 분배하고 스케줄링하여 자원을 효율적으로 활용
    • 노드 간의 부하 분산, 자동 복구 및 확장 기능을 제공
  • 자동화된 롤링 업데이트
    • 애플리케이션의 업데이트나 패치를 자동으로 배포하고 관리
    • 비스의 가용성을 유지하면서 사용자에게 중단 없는 업데이트를 제공 가능
  • 스케일 인/아웃
    • 애플리케이션의 수평 스케일링을 지원하여 필요에 따라 자동으로 애플리케이션 인스턴스의 개수를 조정 가능
    • 부하에 따라 자원을 동적으로 조절하여 성능을 향상
  • 서비스 디스커버리와 로드 밸런싱
    • 애플리케이션 인스턴스를 위한 네트워크 서비스 디스커버리와 로드 밸런싱을 제공
    • 내부와 외부의 트래픽을 적절히 분배하여 안정적인 서비스를 제공
  • 자가 치유와 자동 복구
    • 애플리케이션 및 노드의 상태를 지속적으로 모니터링하고, 장애가 발생하면 자동으로 장애를 탐지하고 복구

2. Resources

  • Node

    • 쿠버네티스 클러스터를 구성하는 개별 서버 또는 가상 머신을 나타내는 리소스
    • 애플리케이션 컨테이너를 실행하고 관리하는데 사용
    • 각 노드는 CPU, 메모리, 스토리지 등 자원을 가지고 있으며 Pod가 노드 상에서 실행됨
  • Pod

    • 쿠버네티스에서 가장 작은 배포 단위
    • 하나 이상의 컨테이너를 포함
  • Replicaset

    • Pod의 복제본 집합을 정의하는 리소스
    • Pod의 개수를 지정, 스케일링과 롤링 업데이트를 관리
    • 지정된 개수의 Pod가 항상 실행되도록 유지, Pod가 실패 혹은 삭제될 경우 자동으로 복구
  • Deployment

    • 애플리케이션 버전 관리 및 롤링 업데이트를 지원하는 리소스
    • Pod를 관리하고 Pod의 수를 자동 조정
  • Service

    • 여러 Pod에 대한 로드 밸런싱, 서비스 디스커버리 및 네트워크 연결을 제공하는 리소스
    • 애플리케이션에 대한 단일 진입점을 만들어 외부에서 접근 가능하게 함
  • Ingress

    • 외부에서 클러스터 내부로의 HTTP 및 HTTPS 트래픽을 관리하는 리소스
    • 로드 밸런싱, 경로 기반 라우팅, SSL 인증서 관리 등을 제공하여 애플리케이션에 대한 인바운드 트래픽을 제어
  • ConfigMap

    • 설정 데이터를 저장하고 Pod에서 사용할 수 있도록 제공하는 리소스
    • 환경 변수, 설정 파일 등을 저장하고 애플리케이션의 동적인 구성 변경을 지원
  • Job

    • 일회성 작업을 실행하는 리소스
    • 특정 작업이 성공적으로 완료될 때까지 Pod를 실행하고 관리
    • 작업이 성공적으로 완료될 때까지 Pod를 유지하며, 실패한 경우에도 재시작
  • NamesSpace

    • 쿠버네티스 클러스터 내에서 리소스를 그룹화하고 격리하는 논리적인 공간
    • 네임스페이스는 리소스의 이름 충돌을 방지하고, 다른 팀 또는 애플리케이션 간의 리소스를 분리하여 관리 가능

3. 워크로드

  • 워크로드
    • 쿠버네티스에서는 “쿠버네티스상에서 작동되는 애플리케이션”을 의미
    • 클라우드 분야에서는 “어떤 애플리케이션을 실행할 때 필요한 IT 리소스의 집합”이라는 의미
  • 쿠버네티스에서는 워크로드 리소스를 만들기 위해 보통 YAML 파일과 같은 리소스 정의 파일을 사용
  • 기본 명령어
    • minikube start
      • 클러스터 생성
    • kubectl create deployment "이름" --image="도커 허브 아이디"/"레포":"태그"
      • 이미지를 사용해 배포 가능한 리소스(디플로이먼트) 생성
    • kubectl expose deployment "이름" --type=NodePort --port=8080
      • 서비스로 노출
    • kubectl port-forward service/"이름" 3333:8080
      • 로컬 클러스터를 호스트 컴퓨터에서 접속할 수 있게 포트 포워딩
    • kubectl get "리소스"
    • kubectl get all
    • kubectl describe "리소스/이름"
    • kubectl rollout history deploymnet 디플로이먼트이름

Pod

  • 쿠버네티스에서 배포 가능한 가장 작은 컴퓨팅 유닛
  • 예시 pod 정의 파일(simple-pod.yaml)
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
  • 다음 명령어로 파드 적용
$ kubectl apply -f simple-pod.yaml

Deployment

  • 쿠버네티스에서의 Deployment는 파드의 교체/배치(placement)와 관련된 명세
  • 쿠버네티스는 컨테이너를 오케스트레이션하는 것으로, 파드 장애시 자동 복구하거나, 복제하거나 하는 등의 일을 자동으로 처리하기 위한 것으로 파드를 디플로이먼트, 스테이트풀셋, 데몬셋을 이용해 관리하는 것이 바람직
  • 예시 yaml 파일
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    # 아래는 파드 템플릿
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

서비스

  • 서비스 리소스를 사용하여 파드에서 실행 중인 애플리케이션을 클러스터 외부에서 접근 가능
  • 서비스는 파드의 집합에 접근할 수 있는 정책을 정의하는 추상적 개념
  • yaml 파일에서 selector를 이용해 서비스할 대상 타겟을 설정 가능
  • 예시 yaml 파일
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  selector:
    app: nginx # 배포하려는 파드를 지정(파드가 이미 실행 중이어야 함)
  type: LoadBalancer
  ports:
  - name: nginx
    protocol: TCP
    port: 80
    targetPort: 80

4. 실습 코드

1) Deployment로 배포

  • cozserver-deployment-v1.yaml에 명세 작성 및 실행
# cozserver-deployment-v1.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cozserver
  namespace: default
  labels:
    app: cozserver
spec:
  selector:
    matchLabels:
      app: cozserver
  replicas: 3
  template:
    metadata:
      labels:
        app: cozserver
    spec:
      containers:
        - name:  springboot
          image:  donghyunele/cozserver:1.0
          ports:
            - containerPort: 8080
$ kubectl apply -f cozserver-deployment-v1.yaml --record
  • 배포 이력을 남기기 위해 --record 옵션 사용

2) Service 리소스로 파드를 외부로 노출

  • cozsercer-service.yaml 작성 및 실행
# cozserver-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: cozserver
  namespace: default
spec:
  selector:
    app: cozserver
  type: LoadBalancer
  ports:
  - name: cozserver
    protocol: TCP
    port: 8085
    targetPort: 8080
$ kubectl apply -f cozserver-service.yaml
  • 로컬 환경에서 테스트하기 위해 터널 필요
    • 새로운 터미널을 열어 명령어 입력
      $ minikube tunnel

3) 새로운 버전 배포, 롤아웃

  • cozserver-deployment-v2.yaml 생성 및 적용
# cozserver-deployment-v2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cozserver
  namespace: default
  labels:
    app: cozserver
spec:
  selector:
    matchLabels:
      app: cozserver
  replicas: 3
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: cozserver
    spec:
      containers:
        - name:  springboot
          image:  donghyunele/cozserver:2.0
          ports:
            - containerPort: 8080
$ kubectl apply -f cozserver-deployment-v2.yaml --record

4) 3.0 배포 및 2.0으로 롤백

  • cozserver-deployment-v3.yaml 작성 및 배포
# cozserver-deployment-v3.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cozserver
  namespace: default
  labels:
    app: cozserver
spec:
  selector:
    matchLabels:
      app: cozserver
  replicas: 3
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: cozserver
    spec:
      containers:
        - name:  springboot
          image:  donghyunele/cozserver:3.0
          ports:
            - containerPort: 8080
$ kubectl apply -f cozserver-deployment-v3.yaml --record
  • kubectl get all : Pods, Deployment, Service, Replicaset 확인 가능

  • kubectl rollout history deploymnet 디플로이먼트이름
    - 해당 디플로이먼트의 배포 이력 확인 가능

  • 이전 버전으로 롤백

$ kubectl rollout undo deployment/cozserver --to-revision=2

0개의 댓글