쿠버네티스를 아직 제대로 공부해본 적이 없어서 .. ㅠㅠ 책에서 나온 개념들을 적어가며 읽어 보았는데, 어느정도 개념을 익히는데 도움이 되었다..!
쿠버네티스 챕터는 갓갓 선생님들 3분께 열심히 많이 배우겠습니다 !!
여러분은 어떤 방식으로 k8s을 공부했는지 궁금해요! 경험해보신바로 k8s를 효율적으로 공부하기위한 best practice 같은거..?
쿠버네티스 개념 소개
쿠버네티스 클러스터의 주요 목적 중 하나는
컨테이너를 배포 및 실행하면서 b/g 또는 카나리 배포 등의 기술을 사용해 무중단 롤링 업그레이드를 지원하는 것이다.
쿠버네티스는 하나 혹은 다수의 컨테이너가 배치된 Pod를 클러스터의 가용 노드에 스케쥴링할 수 있다.
쿠버네티스는 실행 중인 컨테이너의 상태를 모니터링할 수 있도록 컨테이너가 라이브니스 프로브를 구현한다고 가정한다. 라이브니스 프로브가 비정상 컨테이너를 보고하면 쿠버네티스는 해당 컨테이너를 다시 시작한다.
수평 오토스케일러를 사용해 자동이나 수동으로 컨테이너를 스케일링할 수 있다.
메모리 및 CPU와 같은 클러스터의 가용 하드웨어 자원을 최적화하려면 할당량을 사용해 컨테이너를 구성해 컨테이너에 필요한 자원 양을 지정할 수 있다.
컨테이너 그룹이 소비할 수 있는 자원 양에 대한 제한은 네임스페이스 수준에서 지정한다.
쿠버네티스의 다른 주요 목적은
실행중인 Pod와 컨테이너를 위한 서비스 검색을 제공하는 것이다.
쿠버네티스의 서비스 객체를 정의하면 요청을 가용 Pod로 로드 밸런싱하고 서비스를 검색할 수 있다.
서비스 객체를 쿠버네티스 클러스터 외부로 공개할 수도 있지만, 서비스 그룹으로 들어오는 외부 트래픽을 처리하는 데는 인그레스 객체가 더 적합하다.
컨테이너가 레디니스 프로브를 구현하면 들어오는 요청을 수락할 준비가 됐는지 쿠버네티스가 안다.
내부적으로 클러스터는 각 Pod에 IP 주소를 할당하고 Pod를 실행하는 노드와 관계 없이 다른 Pod에 접근할 수 있게 하는 하나의 플랫 IP 네트워크를 제공한다.
기본적으로 Pod는 격리되어 있지 않으며, 들어오는 모든 요청을 수락한다. 네트워크 정책을 정의할 수 있는 CNI 플러그인을 사용하면 Pod에 대한 접근을 제한할 수 있다. 예를 들어, 동일 네임스페이스에 있는 Pod에서 오는 트래픽만 허용할 수 있다.
여러 팀이 하나의 쿠버네티스 클러스터에서 안전하게 작업할 수 있도록 역할 기반 접근 제어를 적용할 수 있다. 예를 들어, 관리자에게는 클러스터 수준의 리소스에 접근할 수 있는 권한을 부여하고, 팀 구성원에게는 팀 소유의 네임스페이스에 생성된 리소스에만 접근할 수 있게 제한한다.
쿠버네티스 API 객체 소개
Node : 노드는 클러스터에 속한 가상 혹은 물리 서버를 의미한다.
Pod : 쿠버네티스에 배포할 수 있는 컴포넌트의 최소 단위로, 하나 혹은 여러 개의 컨테이너를 포함한다. 일반적으로 Pod는 하나의 컨테이너로 구성되지만, 주 컨테이너의 기능 확장을 위해 보조 컨테이너를 사용하기도 한다.
Deployment : Pod를 배포하고 업그레이드한다. 디플로이먼트 객체는 Pod 생성과 모니터링을 레플리카 셋이 담당하도록 위임한다. 디플로이먼트를 처음 생성했을 때 디플로이먼트 객체가 수행하는 작업은 레플리카 셋 객체를 생성하는 데 그치지만, 디플로이먼트를 롤링 업그레이드할 때 더 큰 역할을 수행한다.
Replica Set : 지정한 수의 Pod가 항상 실행되게 한다. Pod가 삭제되면 레플리카 셋이 대체할 Pod를 실행한다.
Service : 하나 혹은 여러 개의 Pod에 연결하고자 사용하는 안정적인 네트워크 엔드포인트다. 서비스에는 쿠버네티스 클러스터의 내부 네트워크 IP 주소와 DNS 이름이 할당된다. 서비스의 IP 주소는 서비스가 살아 있는 동안 동일하게 유지된다. 서비스로 전송된 요청은 라운드 로빈 방식의 로드 밸런싱을 사용해 사용 가능한 Pod 중 하나로 전달된다. 기본적으로 서비스는 클러스터 IP 주소를 사용해 클러스터 내부에만 노출된다. 클러스터에 있는 각 노드의 전용 포트나 쿠버네티스와 연결된 외부 로드 밸런서를 통해 클러스터 외부로 서비스를 노출할 수도 있다. 로드 밸런서를 사용하면 공인 IP나 DNS 이름을 자동으로 프로비저닝할 수 있다.
Ingress : 쿠버네티스 클러스터의 서비스에 대한 HTTP 기반의 외부 접근을 관리한다. 예를 들면 URL 경로나 호스트 이름 등의 HTTP 헤더를 기반으로 트래픽을 클러스터의 서비스로 라우팅한다. 노드 포트나 로드 밸런서를 사용해 서비스를 외부로 노출하는 대신 서비스 앞에 인그레스를 설정하는 게 보통 더 편리하다. 인그레스 객체로 정의한 통신을 실제로 처리하려면 클러스터에서 인그레스 컨트롤러를 실행하고 있어야 한다.
Namespace : 쿠버네티스 클러스터의 리소스를 모으고 특정 수준으로 격리하고자 사용한다. 네임스페이스에 속한 리소스는 이름이 고유해야 하지만, 네임스페이스가 다른 경우에는 이름이 같을 수 있다.
Config Map : 컨테이너에서 사용하는 구성을 저장할 때 사용한다. 실행 중인 컨테이너에 환경 변수나 파일 형식으로 매핑할 수 있다.
Secret : 자격 증명 등의 컨테이너에서 사용하는 민감한 정보를 저장할 때 사용한다. 시크릿은 컨피그 맵과 같은 방식으로 컨테이너에 사용할 수 있다. API 서버 접근 권한이 있는 사람은 누구나 시크릿의 내용을 볼 수 있으므로 이름이 의미하는 것처럼 안전하진 않다.
DaemonSet : 클러스터 노드 집합의 각 노드마다 하나의 Pod가 실행되게 한다.
이런 객체는 직접 실행하는 대신 여러 종류의 원하는 상태를 정의하는 방식으로 사용한다. 현재의 클러스터 상태에 원하는 상태를 반영하고자 쿠버네티스는 다양한 런타임 컴포넌트로 구성된 아키텍처를 갖고있다.
쿠버네티스 런타임 컴포넌트 소개
다음은 컨트롤 플레인을 구성하는, 마스터 노드에서 실행되는 컴포넌트다.
API server : 컨트롤 플레인의 진입점이다. 쿠버네티스의 CLI 도구인 kubectl 등이 사용하는 RESTful API를 제공한다.
etcd : 가용성이 높은 키/값 저장소로 클러스터의 모든 데이터를 저장하는 데이터베이스로 사용한다.
Controller Manager : etcd 데이터베이스에 정의된 객체의 현재 상태와 원하는 상태를 비교해 지속적으로 평가하는 여러 컨트롤러를 포함한다.
원하는 상태나 현재 상태가 변경될 때마다 해당 상태 유형을 담당하는 컨트롤러가 원하는 상태와 현재 상태를 맞추는 작업을 수행한다. 예를 들어, Pod를 관리하는 레플리케이션 컨트롤러는 API 서버를 통해 Pod가 추가되거나 실행 중이던 Pod가 종료되면 새 Pod를 시작한다. 노드 컨트롤러는 사용할 수 없는 노드가 생기면 해당 노드에서 실행 중이던 Pod를 클러스터의 다른 노드로 다시 스케줄링한다.
Scheduler : 새로 생성된 컨테이너를 사용 가능한 메모리, CPU 등을 고려해 적절한 노드에 할당한다. 어피니티 규칙을 사용해 Pod를 어떤 노드로 보낼지 결정한다. 예를 들어, 많은 양의 디스크 I/O가 필요한 Pod는 빠른 SSD 디스크를 가진 워커 노드에 할당한다. 안티 어피니티 규칙을 사용해 포드를 분류할 수도 있다. 이를테면 한 디플로이먼트에 속한 Pod를 같은 노드에 스케줄링하지 못하도록 안티 어피니티 규칙을 정의할 수 있다.
다음은 데이터 플레인을 구성하는, 전체 노드에서 실행되는 컴포넌트다.
kubelet : 컨테이너로 실행되지 않고 노드의 운영체제에서 직접 실행되는 노드 에이전트다. Pod 안에서 동작하는 컨테이너를 kubelet이 실행 중인 노드에 할당한다. 노드의 컨테이너 런타임과 API 서버 사이의 통로 역할을 한다.
kube-proxy : 쿠버네티스의 서비스 개념을 구현하는 네트워크 프록시다. 적절한 Pod로 요청을 전달하며, 서비스를 위한 Pod가 둘 이상인 경우에는 보통 라운드 로빈 방식을 사용한다. kube-proxy는 DaemonSet으로 배포된다.
Container Runtime : 노드에서 컨테이너를 실행하는 소프트웨어다. 일반적으로 도커를 사용하지만, 쿠버네티스 런타임 인터페이스(CRI) 구현이라면 모두 사용할 수 있다.
쿠버네티스 DNS : 클러스터 내부 네트워크에서 사용하는 DNS 서버다. 서비스와 Pod에 DNS 이름을 할당하며, Pod는 이 DNS 서버를 사용해 내부 DNS 이름을 찾도록 구성된다. DNS 서버는 디플로이먼트 객체와 서비스 객체로 배도된다.
느낀점