분류 전체보기 77

Linux Namespaces

Namespace는 프로그래밍 언어 외에 다양한 컴퓨팅 분야에 널리 사용되는 개념이다. 하나의 namespace 안에서 이름과 개체(또는 자원)은 1:1로 매칭된다. 일반적인 정의는 다음과 같다. In computing, a namespace is a set of signs(names) that are used to identify and refer to objects of various kinds. A namespace ensures that all of a given set of objects have unique names so that they can be easily identified. - Wikipedia 예를 들어, C++, Java와 같은 프로그래밍 언어에서는 동일한 Namespace 안..

Calico IPAM

Kubernetes는 직접 Pod에 IP 주소를 할당하고 관리하는 대신 IPAM 플러그인을 사용하도록 설계되었다. CNI 플러그인과 마찬가지로 다양한 IPAM 플러그인이 존재하지만, 보통은 CNI 플러그인과 같이 제공하는 경우가 많다. Calico 역시 자체 IPAM 플러그인 calico-ipam을 가지고 있으며 다음과 같은 기능을 가지고 있다. Calico IPAM Calico 설치시 따로 설정을 변경하지 않는 이상, Default로 사용되는 IPAM 플러그인이다. 기본적으로 K8s의 Pod CIDR과 매칭되는 하나의 IP Pool을 사용하지만, 필요한 경우 Pod CIDR을 쪼개서 여러개의 IP Pool을 구성하여 이를 node, namespace, pod annotation에 따라 선택할 수 있는 ..

Kubernetes 2021.01.31

Calico 설치 및 Mode 변경

Calico 설치 본 설치는 50개 이하 Node로 구성된 on-prem K8s 클러스터에 적합한 방식이며, 그외에는 Calico 공식 홈페이지를 참고하도록 하자. 테스트 환경은 Master 1개, Worker 2개로 이루어진 간단한 Cluster이며, 각 Node의 IP와 Pod CIDR은 다음과 같다. master: 172.30.1.42 worker-1: 172.30.1.45 worker-2: 172.30.1.29 Pod CIDR: 192.168.0.0/16 1. Manifest 다운로드 Manifest 파일은 아래 명령어를 통해 Download 하도록 하자. 해당 파일을 종종 수정해야 할 일이 생기므로, 매번 인터넷에서 가져오는 것보다 직접 갖고 있는 편이 좋다. curl https://docs.p..

Kubernetes 2021.01.29

StatefulSet

redis, mysql과 같이 상태를 유지해야하는(Stateful) 어플리케이션은 자신만의 Persistent Volume을 요구한다. 또한 자체적인 고가용성(High Availability)를 위해 Main&Backup 또는 Read Replicas로 구성하는 것이 일반적이다. Deployment의 경우 모든 Pod이 동등하며 랜덤하게 관리되므로, 특정 Pod을 Master 또는 Slave로 지칭하거나, 우선순위를 부여할 수 없다. 또한 Service를 통해 접근시 Load Balancing이 발생하기 때문에 어떤 Pod에 연결될지 알 수 없다. 무엇보다 한개의 Persistent Volume과 Claim을 여러 Pod에서 가지려고 하는 문제가 발생한다. 이런 Stateful Application 배포..

Kubernetes 2021.01.25

CNI - Spec

Container Runtime은 Pod 생성시, 다음과 같은 방법으로 CNI에게 Network 설정을 요청한다. CNI 플러그인이 지원해야하는 Operation CNI 플러그인은 실행가능한 파일로 구현하여, 각 Container Runtime Engine(Docker, rkt 등)에 의해 호출된다. 네트워크 인터페이스를 컨테이너의 Network Namespace에 추가하고, 호스트와 연결(veth pair)한다. 또한 IPAM 플러그인을 통해인터페이스에 IP를 할당하고, Routing Rule을 갱신할 수 있어야 한다. CNI Spec v0.4.0을 기준으로 다음과 같은 4개의 Operation을 지원해야 한다. ADD: 네트워크에 Container 추가 DEL: 네트워크에서 Container 제거 C..

Cluster Networking

시작하며... Kubernetes 클러스터를 직접 구축하는 경우, CNI 플러그인 설치를 요구받게 된다. 현재 시장에는 수십개 이상의 CNI 플러그인이 존재하며, 한번 설치하고나면 운영 중 다른 플러그인으로 교체는 결코 쉽지 않은 작업이 되므로 신중하게 선택해야 한다. 각 플러그인마다 수행방식이나 네트워크 모델이 제각각이며 장단점 또한 다르기 때문에 우리의 선택엔 확실한 근거와 기준이 필요하다. 이를 위해 Container와 Container, Container와 Host 사이에 어떻게 네트워크가 구성되는지 알아보도록 하자. 우선 Kubernetes의 Network Model은 아래와 같이 단순하지만 확고한 요구사항 3개를 명시해 놓았다. K8s Network Requirements Pod은 NAT을 사..

Scheduler

Scheduler는 K8s의 Control Plane Component 중 하나로, Pod을 어떤 Node에 생성할지 결정하는 역할을 맡고 있다. 기본적인 동작 원리는 다음과 같다. API Server는 Client(ex: Admin)로부터 Pod 생성을 요청받으면, 우선 이를 etcd에 저장한다. Scheduler는 API Server를 계속 확인하며 만약 새로운 Pod 또는 Node를 배정받지 못한(unscheduled) Pod이 있는 경우, 해당 Pod이 생성될 수 있는 최적의 Node를 찾아 API Server에 전달한다. 마지막으로, 선택된 Node에서 수행중인 kubelet은 API Server로부터 PodSpec을 전달받아 이를 생성한 뒤, Pod의 상태를 API Server에 보고하는 것으..