쿠버네티스 알기

FineLee·2022년 1월 25일
0

Cloud

목록 보기
4/8

쿠버네티스란?

k8s라고도 알려진 쿠버네틱스.

컨테이너형 애플리케이션의 배포, 확장, 관리를 자동화 하는 오픈소스 시스템이다.

쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해준다.

복잡하고 다양한 작업을 하지만 자세히 들여다보면 현재상태를 모니터링 하면서 관리자가 설정한 원하는 상태를 유지하려고 내부적으로 이런저런 작업을 하는 로직을 가지고 있다.

쿠버네티스의 핵심은 ‘상태’ 이며, 쿠버네티스를 사용하려면 어떤 상태가 있고 어떻게 상태를 선언하는지를 알아야한다.

$ docker run # 명령
$ kubectl create # 상태 생성

[참고1] [참고2]

쿠버네티스가 쓰이게 된 여정

https://d33wubrfki0l68.cloudfront.net/26a177ede4d7b032362289c6fccd448fc4a91174/eb693/images/docs/container_evolution.svg

  • Traditional : 초기에는 애플리케이션을 물리서버에서 실행했었다. 하지만 여러 애플리케이션의 리소스 한계를 정의할 방법이 없었기에, 리소스 할당의 문제가 발생했다.
  • Virtualized : 그 해결책으로 가상화가 도입되었다. 이는 단일 물리 서버의 CPU에서 여러 가상 시스템 (VM)을 실행할 수 있게 한다.애플리케이션의 격리가 가능해졌다. 각 VM은 가상화된 하드웨어 상에서 자체 운영체제를 포함한 모든 구성요소를 실행하는 하나의 완전한 머신이다.
  • Container: 컨테이너는 VM과 유사하지만 격리 속성을 완화 하여 애플리케이션간에 운영체제를 공유한다. VM과 마찬가지로 컨테이너에는 자체 파일 시스템, CPU점유율, 메모리, 프로세스 공간 등이 있다. 기본 인프라와의 종속성을 끊었기 때문에, 클라우드나 OS배포본에 모두이식할 수 있다.

쿠버네티스의 필요성과 역할

쿠버네티스는 분산 시스템을 탄력적으로 실행하기 위한 프레임워크를 제공한다.

애플리케이션의 확장과 장애 조치를 처리하고, 배포 패턴 등을 제공한다.

쿠버네티스는 다음을 제공한다.

쿠버네티스의 특징

  • Automated rollouts and rollbacks

    • 쿠버네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술할 수 있으며 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다. 예를 들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용할 수 있다.
  • Service discovery and load balancing

    • 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다.
  • Storage orchestration

    • 쿠버네티스를 사용하면 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재 할 수 있다.
  • Secret and configuration management

    • 쿠버네티스를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리 할 수 있다. 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트 할 수 있다
  • Automatic bin packing

    • 컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다. 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시한다. 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 해준다.
  • Batch execution

  • IPv4/IPv6 dual-stack

  • Horizontal scaling

  • Self-healing

    • 쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, '사용자 정의 상태 검사'에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때까지 그러한 과정을 클라이언트에 보여주지 않는다.
  • Desinged for extensibility

  • HPA (Horizontal Pod AutoScaler)

    • 특정 메트릭에 리소스 지표들이 임계점을 지나면 파드의 조절하여스케일링
  • VPA (Vertical Pod Autoscaler)

    • 파드의 리소스를 CPU 및 메모리를 자동으로 조정하여 애플리케이션의 “크기를 적절히 조정”

쿠버네티스의 오브젝트

쿠버네티스는 상태를 관리하기 위한 대상을 오브젝트로 정의한다.

○ Pod

쿠버네티스에서 배포할 수 있는 가장 작은 단위로, 한 개 이상의 컨테이너와 스토리지, 네트워크 속성을 가짐. Pod에 속한 컨테이너는 스토리지와 네트워크를 공유하고 서로 localhost로 접근할 수 있음. 컨테이너를 하나만 사용하는 경우도 반드시 Pod로 감싸서 관리

○ ReplicaSet

Pod를 여러개 복제하여 관리하는 오브젝트. Pod를 생성하고 개수를 유지하려면 반드시 ReplicaSet을 사용해야함.

○ Service

네트워크와 관련된 오브젝트. Pod를 외부 네트워크와 연결해주고, 여러개의 Pod를 바라보는 내부 로드 밸런서를 생성할 때 사용. 내부 DNS에 서비스 이름을 도메인으로 등록하기 때문에 서비스 디스커버리 역할도 함.

○ Volume

저장소와 관련된 오브젝트.

○ Object Spec -YAML

오브젝트의 spec은 YAML파일로 정의하고 여기에 오브젝트의 종류와 원하는 상태를 입력합니다.

쿠버네티스에서 오브젝트를 생성할 때, (이름과 같은) 오브젝트에 대한 기본적인 정보와 더불어, 의도한 상태를 기술한 오브젝트 spec을 제시해 줘야만 한다.

오브젝트를 생성하기 위해(직접이든 또는 kubectl을 통해서든) 쿠버네티스 API를 이용할 때, API 요청은 요청 내용 안에 JSON 형식으로 정보를 포함시켜 줘야만 한다. 

대부분의 경우 정보를 .yaml 파일로 kubectl에 제공한다. kubectl은 API 요청이 이루어질 때, JSON 형식으로 정보를 변환시켜 준다.

<예시>

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

쿠버네티스 배포방식

쿠버네티스는 애플리케이션을 배포하기 위해 원하는 상태를 다양한 오브젝트에 라벨을 붙여 정의하고 API 서버에 전달하는 방식을 사용.

쿠버네티스 아키텍처

중앙에 API서버와 상태 저장소를 두고 각 서버의 에이전트와 통신하는 구조이다.

마스터 -노드 구조

  • 마스터에 명령을 내리고 마스터가 노드에 접속하여 대신 결과를 응답한다.

  • Master

    • 마스터 서버는 다양한 모듈이 확장성을 고려하여 기능별로 쪼개져 있는 것이 특징. 마스터 서버가 죽으면 클러스터를 관리할 수 없기때문에 보통 3대를 구성하여 안정성을 높이고, AWS EKS같은 경우 마스터를 AWS에서 자체 관리하여 안정성을 높였고, 개발 환경이나 소규모 환경에서는 마스터와 노드를 분리하지 않고 같은 서버에 구성하기도 함.
  • Node

    • 노드서버는 마스터서버와 통신하면서 필요한 Pod를 생성하고 네트워크와 볼륨을 설정함. 실제 컨테이너들이 생성되는 곳으로 수백, 수천대로 확장할 수 있습니다. 각각의 서버에 라벨을 붙여 사용목적(GPU 특화, SSD 서버 등)을 정의할 수 있습니다.
  • Kubectl

    • api 서버는 json 또는 protobuf형식을 이용한 http통신을 지원함. 보통 kubectl이라는 명령행 도구 사용


      EKS 란?

      Amazon EKS는 자체 Kubernetes 제어 영역이나 작업자 노드를 설치 및 운영할 필요 없이 AWS에서 Kubernetes를 손쉽게 실행할 수 있도록 지원하는 관리형 서비스입니다.

      다양한 AWS 서비스와 통합되어 애플리케이션에 확장성과 보안을 제공

      오픈 소스 Kubernetes 소프트웨어의 최신 버전을 실행하므로 Kubernetes 커뮤니티에서 모든 기존 플러그인과 도구를 사용할 수 있다. Amazon EKS에서 실행되는 애플리케이션은 온프레미스 데이터 센터에서 실행 중이든 퍼블릭 클라우드에서 실행 중이든 상관없이 모든 표준 Kubernetes 환경에서 실행되는 애플리케이션과 완벽하게 호환된다. 즉, 필요한 코드를 수정하지 않고 표준 Kubernetes 애플리케이션을 Amazon EKS로 쉽게 마이그레이션할 수 있습니다.

      EKS 의 작동

      EKS 특징

    • VPC와 통합

      • 클러스터 외부와의 통신이 가능해짐
    • 지원하는 운영체제
      - Amazon EKS는 Kubernetes와 호환되는 Linux x86, ARM 및 Windows Server 운영 체제 배포를 지원


      EKS 구성하기

    • 사용자 권한에 원활한 실습을 위해 AdministratorAccess policy 부여

    • kubectl 설치(1.18)

    • eksctl설치

    • Deploy EKS Cluster
      - 방법1. yml 작성

      ```yaml
      ---
      apiVersion: eksctl.io/v1alpha5
      kind: ClusterConfig
      
      metadata:
        name: cloud-eks-cluster
        region: ap-northeast-2
      
      availabilityZones: ["ap-northeast-2a", "ap-northeast-2c"]
      
      iam:
        withOIDC: true
      
      managedNodeGroups:
      - name: cloud-eks-workers
        desiredCapacity: 1
        iam:
          withAddonPolicies:
            albIngress: true
        instanceTypes: ["c4.large","c5.large"]
        spot: true
      #  instanceType: t3.small
      #  ssh:
      #    publicKeyName: "<your key pair name>"
      #    https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#KeyPairs:
      
      cloudWatch:
          clusterLogging:
              enableTypes: ["audit", "authenticator", "controllerManager"]
      ```
      
      - 방법2. CLI로 수행
      
      ```powershell
      eksctl create cluster \
      --name cloud-eks-01 \
      --version 1.18 \
      --region ap-northeast-2 \
      --zones=ap-northeast-2a,ap-northeast-2c \
      --nodegroup-name cloud-eks-workers \
      --nodes 1 \
      --nodes-min 1 \
      --nodes-max 3 \
      --with-oidc \
      --managed \
      --alb-ingress-access \
      --spot \
      --instance-types=c4.large,c5.large
      
      ```

profile
해송의 벨로그

0개의 댓글