버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

PaaS 환경 구축/운영 방식 추가

2.2 컨테이너 Orchestration

컨테이너 Orchestration은 애플리케이션을 구성하고 있는 수십 또는 수백 개의 컨테이너와 호스트들을 배포하고 관리하기 위한 도구입니다.

컨테이너 Orchestration은 어떤 환경에서든 사용할 수 있으며, 재설계할 필요 없이 각기 다른 환경 전반에 동일한 애플리케이션을 배포하는데 도움이 됩니다.

2.2.1 컨테이너 Orchestration 종류

...

Kubernetes

...

Docker Swarm

...

Apache Mesos

...

  • 구글에 의해 개발된 오픈 소스 프로젝트로 가장 널리 사용되고 있는 오케스트레이션 툴

...

  • Docker가 공식적으로 만든 오케스트레이션 툴

...

  • Apache 재단에서 발표된 오픈 소스 프로젝트

...

  • 컨테이너의 롤링 업그레이드 지원

  • 여러 Host를 묶어 클러스터 구성 및 배포, 자동 복구 지원

  • 컨테이너 추가, 복제, 업데이트, 롤백 지원

  • 베어메탈, VM환경, 퍼블릭 클라우드 등의 다양한 환경에서 작동

...

  • 호스트 OS에 Agent만 설치하면 간단하게 작동하고 설정이 쉬움

  • Docker 명령어와 Compose를 그대로 사용 가능

...

  • 수만 대의 물리적 시스템으로 확장할 수 있도록 설계됐으며, 대형 스케일 클러스터에 적합한 도구

  • 하둡, MPI, Hypertable, Spark 같은 응용프로그램을 동적 클러스터 환경에서 리소스 공유와 분리를 통해 최적화 가능

  • Docker 컨테이너를 적극적으로 지원

2.2.2 컨테이너 Orchestration의 활용

  • 컨테이너 프로비저닝 및 배포

  • 컨테이너 구성 및 스케쥴링 조정

  • 컨테이너 상태 모니터링 및 장애 복구

  • 컨테이너 추가 또는 제거로 확장 및 축소

  • 실행될 컨테이너를 기반으로 애플리케이션 설정

  • 컨테이너 간 상호 작용의 보안 유지

3. 쿠버네티스 소개

3.1 쿠버네티스(K8s)

쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 오케스트레이션 도구 입니다.

3.2 쿠버네티스를 구성하는 3가지 방법

3.2.1 관리형 쿠버네티스

...

퍼블릭 클라우드 업체에서 제공하는 관리형 쿠버네티스

  • 구성이 이미 갖춰져 있고 마스터 노드는 클라우드 업체에서 관리합니다.

  • 사용자는 필요한 부분들을 애플리케이션에 올려놓고 애플리케이션을 배포하여 사용하는 형태

  • 예시: EKS(Amazon Elastic Kubernetes Service), AKS(Azure Kubernetes Service), GKE(Google Kubernetes Service)

3.2.2 설치형 쿠버네티스

...

SUSE, Redhat와 같은 플랫폼에서 패키지화된 쿠버네티스를 제공하는 설치형 쿠버네티스

  • 직접 설치할 수 있도록 패키지화된 쿠버네티스를 제공합니다.

  • 예시: Rancher, RedHat OpenShift

3.2.3 구성형 쿠버네티스

...

사용하는 시스템에 쿠버네티스 클러스터를 자동으로 구성해주는 구성형 쿠버네티스

...

관리형/설치형 쿠버네티스 보다 자유롭게 구성 가능합니다.

...

...

4. 쿠버네티스 아키텍처 및 구성요소

Image AddedImage Added

4.1 Control Plane

kube-apiserver

  • 쿠버네티스 클러스터로 들어오는 요청을 가장 앞에서 접수하는 역할을 합니다.

  • kubectl을 사용하여 명령을 수행할 경우 kube-apiserver로 전송합니다.

kube-scheduler

  • 새로 생성된 파드를 감지하고, 어떤 노드에 배치되어야 하는지 판단합니다.

  • 파드 스케줄링 결정을 위해 요구사항, 정책제어, 어피니티, 라벨 등 요소를 고려합니다.

kube-controller-manager

  • 컨트롤러 프로세스를 실행하는 컨트롤 플레인 컴포넌트

    • 노드 컨트롤러 : 노드가 다운되었을 때 통지와 대응에 관한 책임을 가집니다.

    • 잡 컨트롤러 : 일회성 작업인 Job 오브젝트를 감시하여 해당 작업을 완료할 때까지 동작하는 파드를 생성합니다.

    • 엔드포인트 컨트롤러 : 서비스와 파드를 연결합니다.

    • 서비스 어카운트&토큰 컨트롤러 : 새로운 네임스페이스에 대한 기본 계정과 API 접근 토큰을 생성합니다.

ETCD

  • 모든 클러스터 데이터를 담는 Key-Value 저장소입니다.

  • etcd 백업 기능으로 특정 시간의 데이터 백업 수행합니다.

4.2 Node 컴포넌트

kubelet

  • 클러스터의 각 노드에서 실행되는 에이전트

  • 파드에서 컨테이너가 확실하게 동작하도록 관리합니다.

  • 파드 스펙(PodSpec)을 받아 컨테이너 동작을 확실히하며, 쿠버네티스를 통해 생성되지 않은 컨테이너는 관리하지 않습니다.

kube-proxy

  • 각 노드에서 실행되는 네트워크 프록시로, 쿠버네티스 서비스 개념의 구현부

  • 노드의 네트워크 규칙을 유지 관리하여, 클러스터&파드의 통신을 가능하게 해줍니다.

Container Runtime

  • 컨테이너 실행을 담당하는 소프트웨어

  • 쿠버네티스 CRI 구현체인 containerd, CRI-O 와 같은 런타임을 지원합니다.

  • 쿠버네티스에서는 도커를 런타임으로 지원하였으나, v1.24 버전부터 기본 엔진에서 제외했습니다.

...

그림 출처 - https://www.docker.com/products/container-runtime/

Container Network Interface (CNI)

  • 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준

  • CNI를 준수하는 다양한 플러그인이 존재( Calico, Weave, Cilium 등)

  • CNI 요구사항

    • veth 페어 생성 및 컨테이너 네트워크 인터페이스와 연결

    • 파드 네트워크 대역 확인 후 IP 설정

    • CNI 설정 파일 작성

    • IP 설정 및 관리

    • 컨테이너 내 기본 라우팅 정보 삽입(default route rule)

    • 다른 노드들에게 IP 라우팅 정보 전달(advertising the routes)

    • 호스트 서버에 라우팅 정보 삽입

    • 네트워크 정책에 따라 트래픽 처리

4.3 컴포넌트 통신 플로우

...

Control plane의 API Server와 Worker Node의 kubelet을 통해 클러스터 관리합니다.

  • 관리자는 kubectl 명령어를 사용하여 클러스터를 관리합니다.

  • 사용자는 Proxy(Service IP)를 통해 접근하여 서비스 접속할 수 있습니다.

...

5. 쿠버네티스 구축

이번 실습은 Centos 7.8에서 Kubeadm을 이용해 마스터와 워커 노드를 1대 씩 구축해보도록 하겠습니다.

5.1 요구 사항

  • 머신 당 최소 2GB 이상의 RAM과 2 CPU 이상을 필요로 합니다.

  • 클러스터에 있는 모든노드들은 서로 네트워크로 연결되어 있어야 합니다.

  • 모든 노드가 각자 고유한 호스트 이름, MAC 주소 및 Product_uuid를 가져야 합니다.

  • 포트 설정. 자세한 내용은 여기를 참조하세요.

  • kubelet이 제대로 작동하려면 스왑을 비활성화 해야 합니다.

    • 스왑을 활성화 하게 되면, 메모리 사용량이 실제로는 물리 메모리와 디스크 합으로 계산되어 메모리 사용량을 정확히 파악 할 수가 없기 때문에 리소스 관리에 문제가 생길 수 있습니다.

5.2 구축 실습

코드 블럭
# 마스터와 워커에서 모두 진행
# MAC 주소 확인
ip link
# Product_uuid 확인
cat /sys/class/dmi/id/product_uuid

# 스왑 비활성화
swapoff -a

# Selinux 비활성화
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# kubeadm, kubelet, kubectl 설치를 위해 레포지토리 및 GPG 키 추가
tee /etc/yum.repos.d/kubernetes.repo<<EOF
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

# 레포지토리를 최신화
yum clean all
yum update -y 

# kubeadm, kubelet, kubectl 설치
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# kubelet 시작 및 활성화
systemctl start kubelet
systemctl enable kubelet

# 커널 모듈 활성화
modprobe overlay
modprobe br_netfilter

# overlay란?
File System과 관련있는 Linux kernal 모듈
# br_netfilter란?
network 관련 Linux kernal 모듈

# 재기동해도 커널 모듈이 유지되도록 설정
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# 재부팅 없이 새 sysctl 구성을 적용
sysctl --system

# containerd 설치를 위해 레포지토리 추가
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 레포지토리 업데이트 
yum update -y 

# containerd 설치
yum install -y containerd.io

# containerd 구성 파일 설정
containerd config default > /etc/containerd/config.toml

# containerd 시작 및 활성화
systemctl restart containerd
systemctl enable containerd

# 마스터에서만 진행
# 클러스터 초기화
kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=10.10.10.238

# 권한 설정하기
# 일반 유저인 경우
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# root 유저인 경우
export KUBECONFIG=/etc/kubernetes/admin.conf

# cluster를 초기화하고 나온 정보는 join하는데 필요하니 꼭 메모해주세요.
kubeadm join 10.10.10.238:6443 --token 65zdpt.i1vzr571eo22pcff \
        --discovery-token-ca-cert-hash sha256:0d50fa4f095d8cd106fb1121cc7893c288184257ec31e81ae5a0a0602a68b315

# CNI(컨테이너 네트워크 인터페이스) 플러그인 설치 및 실행
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml

# 워커노드에서만 진행
kubeadm join 10.10.10.238:6443 --token 65zdpt.i1vzr571eo22pcff \
--discovery-token-ca-cert-hash sha256:0d50fa4f095d8cd106fb1121cc7893c288184257ec31e81ae5a0a0602a68b315

# 확인해보기
# Not Ready에서 Ready 상태로 변경되는데 약 10초정도 소요됩니다.
kubectl get nodes
NAME                    STATUS   ROLES           AGE   VERSION
master-node.novalocal   Ready    control-plane   14m   v1.26.2
worker-node.novalocal   Ready    <none>          44s   v1.26.2