버전 비교

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

...

  • 서비스 디스커버리와 로드밸런싱

    • 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있습니다.

    • 트래픽이 많아지면, 자동으로 네트워크 트래픽을 로드밸런싱하여 배포가 안정적으로 이루어질 수 있도록 합니다.

  • 스토리지 오케스트레이션

    • 로컬 저장소, 공용 클라우드 등과 같이 원하는 저장소 시스템을 자동으로 탑재할 수 있습니다.

  • 자동화된 롤아웃과 롤백

    • 롤아웃: 새로운 버전의 애플리케이션을 배포할 때, 이전 버전과 새로운 버전을 비교하여 설정한 속도에 따라 변경(전환) 할 수 있습니다.

    • 롤백: 배포 중 문제가 발생하거나, 이전 버전으로 되돌아가야할 때, 롤백을 지원합니다.

    • 롤아웃과 롤백은 이벤트 로그를 자동으로 기록하며, 추적이 가능합니다. 하여 이를 통해 배포 이력을 관리 할 수 있습니다.

  • 자동화된 빈 패킹

    • 컨테이너화된 작업을 실행하는데 사용할 수 있는 클러스터 노드를 제공합니다.

  • 시크릿과 구성 관리

    • 시크릿된 정보들은 암호화되어 저장됩니다.

    • 시크릿과 애플리케이션 구성을 안전하게 배포하고 업데이트할 수 있습니다.

  • 자동화된 복구

    • 오류가 발생하거나 노드가 죽었다면, 컨테이너를 재시작하고 다시 스케쥴링합니다.

  • 배치 실행

    • 배치(일괄적으로 모아서 한 번에 처리하는 것) 단위의 작업을 실행할 수 있도록 하며, 주기적인 배치 작업도 실행할 수 있습니다.

  • Auto Scailing

    • CPU 사용률이나 애플리케이션이 제공하는 Metric을 모니터링하여 애플리케이션에서 실행되는 인스턴스의 수를 조정할 수 있습니다.

    • CPU 사용율을 기반(HPA, horizontal Pod Autoscaling)으로 인스턴스 수를 자동 조절 할 수 있으며, POD의 CPU와 메모리 사용량 기반(VPA, Vertical Pod Autoscaling)으로 인스턴스를 조정할 수 있습니다.

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

Image RemovedImage Removed

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