Kubernetes? 쿠버네티스?

2022. 11. 19. 16:05프로그래밍

728x90

 

 

Kubernetes

Introducing to the Kubernetes system and all the concepts that Kubernetes offers, like what it is, where to use, how it works, pros and cons.

examples.javacodegeeks.com

1. 소개

확장 가능한 개발 환경의 경우 필요할 때 자동으로 확장하는 데 당신에게 도움을 줄 수 있는 소프트웨어에 대해 생각해야 할 것입니다.

#K8 이라고도 알려져 있는 #Kubernetes 는 배포 자동화, 애플리케이션 확장 및 컨테이너화된 애플리케이션 관리를 위한 오픈 소스 시스템입니다.

이 프로젝트는 배포 확장 및 관리를 자동화하기 위한 오픈 소스 컨테이너 오케스트레이션 시스템입니다.

처음에는 Google에서 개발했으며 지금은 Cloud Native Computing Foundation에서 이 프로젝트를 유지 관리합니다.

 

2. 쿠버네티스는 뭔가?

 

Kubernetes 프레임워크는 배포 프로세스 및 컨테이너화된 애플리케이션 확장 및 관리와 같은 기타 단계를 자동화하는 데 도움이 줍니다.

이 시스템은 워크로드, 서비스 관리를 위해 이식 가능하고 확장 가능하며 선언적 구성과 자동화를 모두 용이하게 합니다.

Kubernetes는 온프레미스, 퍼블릭, 프라이빗 또는 하이브리드 클라우드의 여러 호스트에서 사용할 수 있습니다. 

따라서 Kubernetes는 쉽게 확장할 수 있기 때문에 클라우드 네이티브 애플리케이션을 호스팅하는 데 이상적인 플랫폼입니다.

Kubernetes에 대한 자세한 내용은 여기에서 확인할 수 있습니다. 공식 문서는 여기에서 찾을 수 있습니다.

 

 

2.1. 가상화 개념

Kubernetes 아키텍처에 대해 자세히 알아보기 전에 시간을 거슬러 올라가 가상화 개념을 살펴봐야 할 것입니다.

 

과거 전통적인 배포는 물리적 서버에서 애플리케이션을 실행하는 것이었습니다. 이 개념의 단점은 물리적 서버에서 응용 프로그램에 대한 경계를 정의할 수 없고 리소스 할당 문제가 발생할 수 있기 때문입니다. 물리적 서버에서 실행되는 여러 응용 프로그램이 있는 경우 일부 응용 프로그램은 대부분의 리소스를 사용하고 시스템에서 실행되는 다른 응용 프로그램은 성능이 저하될 수 있습니다. 만약 이런 경우에 솔루션은 서로 다른 물리적 서버에서 각 응용 프로그램을 실행하는 것일 것입니다.

 

가상화 배포. 이는 기존 배포를 보완합니다. 단일 물리적 서버의 CPU에서 여러 가상 머신(VM)을 실행할 수 있습니다. VM을 사용하면 애플리케이션을 격리할 수 있고 VM 간에 보안 수준을 도입할 수 있습니다. 가상화는 리소스 활용도를 높일 수 있는 가능성을 제공합니다. VM에는 자체 운영 체제가 있고 가상화 하드웨어 위에서 모든 구성 요소를 실행할 수 있습니다.

 

컨테이너 배포. 컨테이너는 다른 애플리케이션 간에 운영 체제와 공유하기 위해 서로 다른 격리 속성을 제공하는 VM과 유사합니다. VM과 비교하여 컨테이너에는 자체 운영 체제, 파일 시스템, CPU 공유, 메모리 등이 있습니다. 이러한 컨테이너는 클라우드 및 OS 배포 간에 이식할 수 있습니다.

 

컨테이너에는 다음과 같은 추가 이점이 있습니다:

 

  • VM과 비교하여 이미지 생성 및 실행 용이
  • 빠르고 효율적인 롤백을 통한 지속적인 개발, 통합 및 제공
  • 클라우드 및 OS 배포 이식성
  • 개발, 테스트 및 프로덕션 전반에 걸친 환경 일관성
  • 효율적인 리소스 활용 및 리소스 격리

 

3. 어디에 사용하나요?

 

Kubernetes는 온프레미스, OpenStack, AWS 또는 Azure 클라우드와 같은 여러 플랫폼에서 실행할 수 있습니다.

 

확장성이 뛰어난 응용 프로그램을 사용하려면 전체 서버를 관리하여 짧은 대기 시간, 높은 가동 시간 및 확장 가능한 인스턴스(대규모로 운영되는 조직의 경우)를 제공하는 플랫폼이 필요합니다.

This orchestration tool is suitable for a containerized application that wants to move it to the next level of resilience infrastructure.

이 오케스트레이션 도구는 복원력있는 다음 단계 수준 인프라로 진화하려는 컨테이너화된 애플리케이션에 적합합니다.

 

Kubernetes를 사용하는 최고의 대기업은 다음과 같습니다:

 

  • Google
  • Spotify
  • Capital One
  • The New York Times
  • Pinterest
  • Adidas
  • Tinder
  • Airbnb

 

4. 동작 방식은?

 

컨테이너 오케스트레이터는 기본적으로 컨테이너화된 애플리케이션 집합을 관리하는 관리자입니다. 일부 컨테이너에 더 많은 리소스가 필요하거나 다시 시작해야 하는 경우 이 오케스트레이터책임이 있습니다. Kubernetes는 운영 체제처럼 작동하며 잘 설계된 분산 시스템으로 간주됩니다. 클러스터에 속한 모든 시스템은 리소스 풀로 간주됩니다. 이 도구는 스케줄러 관리, 리소스 할당, 인프라 상태 모니터링, 워크로드 및 원하는 상태 유지 관리를 통해 분산 운영 체제의 역할을 합니다.

 

앞에서 언급했듯이 Kubernetes는 클라우드 또는 사설 데이터 센터의 여러 클러스터 및 인프라에서 최신 애플리케이션을 실행할 수 있는 운영 체제입니다. 이것은 두 개의 레이어 헤드 노드와 작업자 노드로 구성됩니다. 헤드 노드는 워크로드의 수명 주기를 예약하고 관리하는 역할을 합니다. 반면에 작업자 노드는 애플리케이션을 실행하는 핵심 역할을 합니다. 이 두 계층의 모음이 클러스터 노드를 구성합니다. 클러스터를 관리하기 위해 제어판과의 통신은 명령줄 인터페이스 또는 기타 타사 도구를 통한 API를 통해 이루어집니다. 애플리케이션은 액세스 가능한 이미지 레지스트리에 저장된 하나 이상의 컨테이너 이미지로 구성될 수 있습니다.

 

 

5. 장단점

Kubernetes는 기본적으로 장애 조치(failover) 및 백업을 관리하는 배포 패턴을 제공하는 등 많은 이점이 있습니다. 주요 초점은 배포를 용이하게 하고 다운타임 없이 복잡한 분산 시스템을 관리하는 것입니다. 이 시스템은 하나 이상의 클러스터를 담당하며 실행 중인 각 이미지의 가용성을 감지합니다. 클러스터의 크기는 필요한 경우 2개에서 수천 대의 머신 및 컨테이너가 서로 다른 클라우드 제공업체에 분산될 수 있습니다. 노드에서 오류가 발생하는 경우 도구는 전체 클러스터 작동을 유지하면서 다른 노드를 시작할 수 있습니다.

5.1. Kubernetes 사용의 장점

  • 기본 구성 단위 인 POD에 대해서만 자가 치유 개념의 접근이지만, Kubernetes는 애플리케이션 안정성을 보장하기 위해 자가 치유 계층으로의 추가 통합을 제공할 수 있습니다.
  • 개발자는 컴퓨팅 리소스를 활용하는 특정 서버뿐만 아니라 전체 클러스터에 워크로드를 배포할 수 있습니다.
  • 동시에 실행되는 여러 컨테이너를 모니터링합니다.
  • Kubernetes는 지원하는 애플리케이션 유형을 제한하지 않고 워크로드 이식성을 지원합니다.
  • 로드 밸런싱 서비스를 제공하고 모든 포드에 대한 개별 IP 주소와 포드 집합에 대한 단일 DNS 이름을 제공합니다.
  • 휴대용 및 비용 효율적인 플랫폼. 특히 운영에 더 적은 컴퓨팅 리소스가 필요합니다. 컨테이너의 경우 CPU 및 메모리 리소스에 대해 최대 및 최소를 설정할 수 있습니다.

5.2. Kubernetes 사용의 단점

  • 부적절한 유형의 응용 프로그램, 로컬 개발 또는 간단한 응용 프로그램에서 사용.
  • 로컬 개발에서는 Kubernetes는 생산성을 저하시킬 수 있는 복잡성을 수반할 수 있습니다.
  • 신규 사용자에게 Kubernetes로의 전환은  혼란스럽고 느리고 복잡하며 관리하기 어려울 수 있습니다.
  • Kubernetes는 복잡하고 학습 곡선이 약간 가파르며 K8에 대한 보다 심층적인 지식을 갖춘 전문가가 필요합니다.
  • Kubernetes에는 많은 이점이 있지만 모든 이점을 활용하게 되면, 많은 시간, 노력 및 리소스가 소모될 수 있습니다. 팀은 이 새로운 개념과 워크플로에 익숙해지기 위한 지식을 필요로 합니다.
  • 가상화는 완벽하지 않습니다. 고성능 애플리케이션의 경우 애플리케이션이 실행되는 위치에 따라 달라집니다. 네트워크 활용도가 높은 포드는 함께 배치된 포드에 영향을 미칩니다. 디스크 IO가 높은 포드는 동일한 볼륨을 사용하는 포드에 영향을 미칩니다.

 

6. 아키텍쳐

이 섹션에서는 Kubernetes 아키텍처의 각 구성 요소에 대해 설명합니다.

그림 1: Kubernetes 아키텍처

Web-UI(대시보드)는 Kubernetes 클러스터용 애드온 웹 기반 UI입니다. 이 UI를 통해 사용자는 클러스터 자체는 물론 클러스터에서 실행 중인 애플리케이션을 관리하고 문제를 해결할 수 있습니다.

Kubectl은 Kubernetes 클러스터에 대해 명령을 실행할 수 있는 명령줄 도구입니다. Kubectl을 사용하면 애플리케이션을 배포하고 클러스터 리소스를 검사 및 관리하고 로그를 볼 수 있습니다.

 

6.1. 제어판의 구성 요소

제어판 구성 요소는 클러스터에 대한 전역 결정을 내리고 클러스터 이벤트를 감지하고 응답합니다. 이 제어판은 클러스터의 모든 시스템에서 실행할 수 있습니다.

 

Kube-apiserver는 Kubernetes API를 노출하는 Kubernetes 제어판의 구성 요소입니다. 이 서버는 Kubernetes 제어판의 프런트 엔드에 있습니다. kube-apiserver의 주요 역할은 더 많은 인스턴스를 배포하여 수평으로 확장하는 것입니다.

 

etcd는 기본적으로 모든 클러스터에 대한 키-값 데이터를 저장하는 데이터베이스입니다. etcd를 백업 저장소로 사용하는 경우 해당 데이터에 대한 백업 계획이 있는지 확인해야만 합니다.

 

kube-scheduler는 할당된 노드 없이 새로 생성된 포드를 감시하고 실행할 노드를 선택합니다. 일정 결정을 위해 고려해야 할 몇 가지 사항은 다음과 같습니다.

개별 및 집단 리소스 요구 사항, 하드웨어/소프트웨어/정책 제약, 선호도 및 반선호도 사양, 데이터 지역성, 워크로드 간 간섭 및 마감일.

 

kube-controller-manager는 컨트롤러 프로세스를 관리합니다. 그 외에도 각 컨트롤러는 별도의 프로세스이지만 복잡성을 줄이기 위해 단일 바이너리로 컴파일되어 단일 프로세스에서 실행됩니다.

 

컨트롤러 유형은 다음과 같습니다:

 

  • 노드 컨트롤러. 노드가 다운되면 모니터링하고 알립니다.
  • 작업 컨트롤러. 일회성 작업을 나타내는 작업 개체를 찾은 다음 해당 작업을 완료하기 위해 Pod를 생성합니다.
  • 엔드포인트 컨트롤러. 엔드포인트 객체(서비스 및 파드)를 채웁니다.
  • 서비스 계정 및 토큰 컨트롤러. 새 네임스페이스에 대한 기본 계정 및 API 액세스 토큰 생성을 확인합니다.
  • 무엇보다 클라우드 컨트롤러 관리자라는 또 다른 구성 요소가 있습니다. 이 컨테이너는 특정 클라우드 관련 로직을 포함합니다.

6.2. 노드 구성 요소

노드 구성 요소는 실행 중인 포드를 유지 관리하고 Kubernetes 런타임 환경을 제공합니다. 이러한 구성 요소는 모든 노드에서 실행됩니다.

 

kublet은 클러스터의 각 노드에서 실행되는 에이전트입니다. 이 에이전트는 컨테이너가 Pod에서 실행되고 있는지 확인하는 것에 대한 책임을 가지고 있습니다. 여기에는 다양한 메커니즘을 통해 제공되는 PodSpec 집합이 필요하며 설명된 컨테이너가 실행 중이고 정상 상태인지 확인합니다. Kublet은 Kubernetes에서 생성되지 않은 컨테이너를 처리하지 않습니다.

 

kube-proxy는 클러스터의 각 노드에서 실행되는 네트워크 프록시입니다. 이것은 노드에서 네트워크 규칙을 유지 관리하는 역할을 합니다. 이 네트워크 규칙을 사용하면 클러스터 내부 또는 외부의 네트워크 세션에서 Pod와 통신할 수 있습니다. kube-proxy는 사용 가능한 경우 운영 체제 패킷 필터링 계층의 개념을 사용하고, 그렇지 않으면 트래픽 자체를 전달할 것입니다.

 

Container running. 컨테이너 실행을 담당하는 소프트웨어입니다. Kubernetes는 컨테이너, CRI-O 또는 Kubernetes CRI(컨테이너 런타임 인터페이스)의 기타 구현과 같은 컨테이너 런타임을 지원합니다.

 

위에서 언급한 것 중 몇 가지 애드온을 추가할 수 있습니다. 애드온은 Kubernetes 리소스를 사용하여 클러스터 기능을 구현합니다. 클러스터 수준 기능, kube-system 네임스페이스에 속하는 네임스페이스 리소스입니다.

 

애드온의 몇가지 예는 다음과 같습니다:

  • DNS
  • Container Resource Monitoring
  • Cluster-Level Logging
  • DNS
  • 컨테이너 리소스 모니터링
  • 클러스터 수준 로깅

 

7. 쿠버네티스 설정(Linux 기반)

로컬 머신(단일 인스턴스)에 Kubernetes를 설치하는 것은 그다지 권장되지 않습니다. 설치하려면 여러 인스턴스가 있어야 합니다. 2개 이상의 노드(마스터 노드 1개, 작업자 노드 1개) 이상을 권장합니다. 계속 진행하면 sudo/root 액세스 권한과 패키지 관리자가 있는지 확인해야 합니다. 시작하기 전에 업데이트 패키지 목록인 sudo apt-get update를 실행하세요.

 

7.1. 컨테이너 설치

먼저 도커를 설치해야 합니다. 도커를 설치하려면 

sudo apt-get install docker.io
 

명령을 실행합니다. 

docker 버전을 확인하려면 

docker --version
 

을 실행합니다.

 

부팅 시 도커를 활성화하려면 다음 명령을 실행해야 합니다.

sudo systemctl enable docker
 

Kubernetes를 실행하려는 다른 머신에 도커 서비스를 설치하십시오.

Fig.2: Checking docker version after install

7.2. 쿠버네티스 설치

Kubernetes를 설치하려면 먼저 서명 키를 추가해야 합니다.

다음 명령을 실행하여 추가합니다.

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
 

curl을 설치하지 않은 경우 다음 명령을 실행하십시오.

sudo apt-get install curl
 

다른 노드에서 이전 명령을 반복하여 서명 키를 추가합니다.

 

Kubernetes는 추가할 기본 저장소에 포함되어 있지 않기 때문에 다음 명령을 실행하여 추가 합니다.

sudo apt-add-repository "deb http://apt.kubernetes.io/kubernetes-xenial main"
 

7.3. Kubernetes 도구 설치

Kubeadm(Kubernetes Admin) 이 도구는 클러스터를 초기화하는 데 도움을 줄 것입니다.

 

Kubelet은 작업 패키지입니다. 이 서비스는 모든 노드에서 실행되고 컨테이너를 시작합니다.

 

Kubectl은 클러스터에 대한 명령줄 액세스를 제공합니다.

 

이러한 도구를 설치하려면 

sudo apt-get install kubeadm kubelet kubectl
 

명령을 실행합니다.

 

kubeadm의 버전을 확인하려면 kubeadm 버전을 실행합니다.

각 노드에서 해당 도구 설치프로세스를 반복해 줍니다.

 

모든 도구를 설치하면 각 도구의 버전을 볼 수 있습니다.

Fig.3: Versions of Kubernetes tools

7.4. Kubernetes로 배포

Kubernetes로 배포를 시작하려면 다음 명령을 사용하여 각 서버에서 메모리 스왑을 비활성화 합니다. 

sudo swapoff –a
 
 

각 노드에 대해 호스트 이름을 정의합니다.

다음 명령으로 마스터 노드를 정의합니다.

sudo hostnamectl set-hostname master-node
 

작업자 노드를 정의 명령은 다음과 같습니다

sudo hostnamectl set-hostname worker-node
 
Fig.4: Master node

 

Fig.5: Worker node

다음 명령으로 마스터 노드 네트워크를 설정하십시오.

sudo kubeadm init --pod-network-cidr=192.168.0.0/16 (IP 주소와 네트워크 마스크 입력)
 

이 명령이 끝나면 kubeadm 조인이 표시됩니다. 다음으로 클러스터에 대한 디렉터리를 만듭니다:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
 

선택 사항: 클러스터링할 POD 네트워크를 구성합니다. POD 네트워크는 클러스터의 서로 다른 노드 간의 통신을 허용하는 방법입니다. 이 기사의 목적을 위해 플란넬 가상 네트워크를 사용합니다. 작업자 노드에서 이 명령을 실행하도록 구성하려면 다음 명령이 필요 합니다.

sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
 

작업자 노드를 클러스터에 결합하려면 다음 명령을 실행하십시오. 

kubeadm join --discovery-token <codes_from_master_server> --discovery-token-ca-cert-hash <codes_from_master_server>
 

다음 명령으로 상태 노드를 확인하십시오. 

kubectl get nodes
 
Fig.6: Output of the joined nodes into the cluster

 

8. Kubernetes의 유용한 명령

# 현재 존재하는 모든 pod를 리턴한다.
kubectl get pods 
#새로운 redis pod를 생성한다.(파일 정의도 가능함)
kubectl run redis --image=redis123 --generator=run-pod/v1 
#pod에 대한 정보를 확인한다
kubectl describe pod 
#기존 pod 편집
kubectl edit pod redis123 
#PODs에 대한 상세정보를 리턴한다.
kubectl get pods -o wide 
#POD 삭제
kubectl delete pod nginx 
#POD 정의 파일로 새로운 파일을 생성한다.
kubectl create -f redis-pod.yaml 
#replication controller 수를 리턴한다.
kubectl get replicationcontroller 
#replica 파라메터 업데이트
kubectl scale --replicas=6 -f replicaset-definition.yaml 
#위와 마찬가지 명령이나, pod 정의 파일은 업데이트 하지 않는다.
kubectl scale --replicas=6 replicaset myapp=replicaset 
#모든 설치 POD를 삭제한다.
kubectl delete replicaset myapp-replicaset 
#모든 replica set를 표시한다.
kubectl get replicaset or kubectl get rs 
#replica set을 편집한다.
kubectl edit replicaset redis123 
#
kubectl scale rs new-replica-set --replicas=5
# 다음 명령(deployment replica set and pods)과 함께 주면 kubernetes 내에 존재 하는 모든 정보를 볼 수 있다. 
kubectl get all deployment replica set and pods.
#POD manifest yaml 파일을 생성한다.
kubectl run --generator=run-pod/v1 nginx --image=nginx --dry-run -o yaml 
#deployment 생성
kubectl create deployment --image=nginx nginx	
#deployment yaml 파일을 생성한다.
kubectl create deployment --image=nginx nginx --dry-run -o yaml 
#nginx-deployment.yaml 파일에서 deployment yaml 파일을 생성한다
kubectl create deployment --image=nginx nginx --dry-run -o yaml > nginx-deployment.yaml
#기본 namespace에서 부터 모든 pod 정보를 얻는다.
kubectl get pods 
#kube-system에서 부터 모든 pod 정보를 얻는다.
kubectl get pods --namespace=kube-system 
#모든 namespace에서 모든 pod 정보를 확인한다.
kubectl get pods --all-namespaces 
#모든 namespace 정보를 확인한다.
kubectl get namespaces 
#namespace 내에 pod를 생성한다.
kubectl create -f pod-definition.yml --namespace=dev 
#namespace를 생성한다.
kubectl create namespace dev 
#원하는 namesapce내에 새로운 pod를 생성한다.
kubectl run redis --image=redis --generator=run-pod/v1 --namespace=finance 
#모든 service를 확인한다.
kubectl get services
 
 

9. 결론

이 기사에서는 Kubernetes의 개념, 이 도구가 무엇인지, 어디에 사용하고 어떻게 사용하는지 이해 할 것입니다. Kubernetes에 대한 기본 개념 외에도 아키텍처 개념과 이러한 구성 요소가 함께 작동하여 자동 배포 및 확장 응용 프로그램을 위한 강력한 도구를 구축하는 방법에 대한 지식을 얻을 수 있습니다.

 

이상.