Linux Container & Kubernetes

김현송·2023년 5월 30일
0

출처 레드햇

리눅스 컨테이너

격리된 환경에서 실행되는 프로세스로 호스트머신의 운영체제와 커널은 공유하지만, 파일 시스템, 네트워크, 사용자ID 등의 자원은 격리되어 있습니다. 이러한 격리는 다른 컨테이너 또는 호스트 시스템에서 실행되는 프로세스에 영향을 미치지 않도록 합니다.

컨테이너 이미지를 사용하여 애플리케이션의 배포와 관리를 쉽게 할 수 있습니다.

컨테이너 오케스트레이션 시스템

여러 대의 컴퓨터에 걸쳐 컨테이너화된 애플리케이션을 배치하고, 확장하고, 관리하는 시스템입니다. 컨테이너 오케스트레이션 시스템에는 Kubernetes, Docker Swarm, Apache Mesos 등이 있습니다. 이들 시스템은 컨테이너 배포, 자동 확장, 자동 복구, 서비스 디스커버리 등의 기능을 제공하며, 클라우드 환경에서 사용되는 것이 일반적입니다.

Docker

리눅스 컨테이너의 대표적인 플랫폼으로 컨테이너 이미지를 쉽게 빌드하고 배포할 수 있습니다.

애플리케이션을 격리된 컨테이너라는 유닛으로 패키징하고 배포할 수 있습니다.

Docker의 핵심 개념은 이미지, 컨테이너, 레지스트리입니다.

  • 이미지 : Docker 컨테이너를 실행하는데 필요한 모든 파일, 코드, 라이브러리, 의존성을 포함하는 패키지입니다.

  • 컨테이너 : 이미지를 기반으로 생성되는 실행 가능한 인스턴스 입니다.

  • 레지스트리 : 이미지를 저장하고 공유할 수 있는 저장소입니다.

  • 호스트 시스템과는 독립적으로 배포할 수 있습니다.

도커 설치시 swap 메모리를 비활성화 하는 이유

Docker는 독립적인 프로세스로 실행되며 이러한 독립성을 유지하기 위해서는 컨테이너가 호스트 시스템의 리소스를 직접 사용하지 않도록 해야합니다.

또한 Docker에서 swap 메모리를 사용하기 되면 컨테이너의 동작이 느려지거나 컨테이너가 중단될 수 있으며, 호스트 시스템의 성능 저하와 같은 부작용이 발생할 수 있습니다.

  • swap 비활성화

    모든 스왑을 비활성화

    sudo swapoff -a

    /etc/fsatab 파일에서 swap.img를 사용하는 라인을 주석처리함

    sudo sed -i '/swap.img/s/^/#/' /etc/fstab

cgroup

프로세스 그룹을 관리하는 커널 기능

프로세스 그룹에 리소스 제한을 적용하고, 프로세스 그룹에 대한 계측 및 통제를 합니다.

cpu, 메모리, I/O, 네트워크 등의 리소스에서 제한을 할 수 있습니다.

Docker 데몬

컨테이너의 생성, 관리, 실행을 담당하는 Docker의 백그라운드 프로그램

호스트와 컨테이너 간의 네트워크 통신을 관리하며, 이미지 빌드와 레지스트리 간의 통신을 담당합니다.

Docker를 사용하기 위해서는 Docker 데몬을 실행해야합니다.

daemon.json 설정

{
  // cgroup 드라이버, systemd를 사용하도록 설정
  "exec-opts": ["native.cgroupdriver=systemd"],
  // 로그 파일의 형식
  "log-driver": "json-file",
  // 로그 파일의 크기
  "log-opts": {
    "max-size": "100m"
  },
  // 저장 드라이버
  "storage-driver": "overlay2"
}    

overlay2 : 파일 시스템 레이어를 효율적으로 관리하기 위해 메타데이터와 데이터를 분리하여 저장

docker-compose

하나의 명령어로 전체 애플리케이션을 빌드, 시작, 중지, 제거할 수 있으며 각 컨테이너의 로그를 볼 수 있습니다.

Kubernetes

컨테이너화된 애플리케이션을 자동으로 배포, 확장 및 관리하기 위한 오픈소스 플랫폼

대규모 컨테이너 환경에서 원활한 배포, 확장, 관리를 위한 다양한 기능을 제공합니다.

쿠버네티스는 클러스터를 구성하며, 클러스터에는 여러개의 노드가 있습니다.

각 노드는 컨테이너를 실행하는 호스트입니다.

쿠버네티스의 역할 : 노드간 로드 밸런싱, 스케줄링, 자원할당, 상태 모니터링, 자가 치유 등을 담당한다.

쿠버네티스 클러스터

여러 대의 서버를 하나의 시스템으로 관리하는 것

컴퓨터(서버) == 클러스터 노드

각 노드는 마스터 노드에 의해 관리, 마스터 노드는 클러스터 전체를 제어하는 제어 플레인 컴포넌트와 클러스터 상태를 유지하는 스토리지 및 API 서버 등의 컴포넌트로 구

쿠버네티스 Pod

하나 이상의 컨테이너를 포함하는 가장 작은 배포 단위입니다.

Pod는 고유한 IP주소를 가지며 Pod내의 컨테이너는 동일한 인터페이스와 파일 시스템을 공유합니다.

https://www.redhat.com/ko/topics/containers/what-is-kubernetes-pod

br_netfilter

linux 커널의 모듈중 하나로 네트워크 브릿지와 관련된 네트워크 패킷 필터링을 수행합니다.

네트워크 연결을 관리하고 iptables 및 ip6tables에서 사용되는 필터링 규칙을 적용하여 네트워크 보안을 강화합니다.

쿠버네티스 설치를 위해 필요한 모듈 설정 파일에 작성합니다.

sudo vi /etc/modules-load.d/k8s.conf
br_netfilter

kubelet, kubeadm, kubectl

kubelet, kubeadm, kubectl은 쿠버네티스를 설치, 관리 및 제어하는 데 필요한 세 가지 도구입니다.

  • kubelet: 클러스터 노드에서 실행되는 쿠버네티스 에이전트로서, 컨테이너를 관리하고 클러스터 내부와 통신하는 데 사용됩니다.
  • kubeadm: 쿠버네티스 클러스터를 부트스트래핑(초기화)하는 데 사용되는 도구로, 클러스터 구성 요소를 설치하고 구성하며, 마스터 노드를 초기화하는 데 사용됩니다.
  • kubectl: 쿠버네티스 클러스터를 제어하기 위한 커맨드라인 도구로, 클러스터 내부의 오브젝트를 생성, 수정, 삭제 및 관리하는 데 사용됩니다.

이 세 가지 도구를 함께 사용하여 쿠버네티스 클러스터를 구성하고 관리할 수 있습니다.

CNI

CNI(CNI-Container Network Interface)는 Kubernetes 클러스터 내에서 Pod 간의 통신을 위한 네트워크 모델을 제공하는 인터페이스입니다. CNI는 Kubernetes에서 적용 가능한 네트워크 드라이버 플러그인을 사용하여 다양한 방식으로 구성 가능합니다.

CNI는 컨테이너 오케스트레이션 시스템에서 다양한 네트워크 솔루션들을 통합하여 사용 가능하도록 해주며, 그 중 대표적인 솔루션으로는 Calico, Flannel, Weave Net 등이 있습니다. CNI를 사용하면 Kubernetes에서는 각 Pod가 고유한 IP 주소를 가지며, Pod 간에는 가상 네트워크를 통해 통신합니다.

Calico

Calico는 쿠버네티스 클러스터 내에서 네트워크 정책을 구현하는 데 사용되는 오픈소스 소프트웨어입니다. Calico는 라우팅, 로드 밸런싱 및 보안 기능을 제공하며, 많은 기능을 표준 Kubernetes API와 통합됩니다. Calico는 쿠버네티스의 Service, Pod, Deployment, Ingress 등과 같은 다양한 오브젝트를 지원하며, 플러그인 방식으로 설치되므로 다른 CNI 플러그인과도 호환됩니다. Calico는 네트워크 정책 및 보안 규칙 구현을 위한 강력한 도구를 제공하여 클러스터에서 매우 안전한 환경을 유지할 수 있습니다.

구축한 클러스터

트러블 슈팅

1.

Windows의 경우 다음과 같은 이더넷 속성을 설정해주어야 합니다

2.

pending 오류

pod가 스케줄링 되지 않은 이유 검거하기

kubectl describe pod httpd-deployment-57fc687dcc-krlws

Events:
Type Reason Age From Message


Warning FailedScheduling 26s (x21 over 22m) default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.

해석 : pod에 taints가 있어 해당 pod에 띄울 수 없다는 의미이다.

profile
안녕하세요

0개의 댓글