매니징 쿠버네티스
매니징 쿠버네티스를 공부하며 작성한 노트 필기
Chapter 1. 쿠버네티스란?
Kubernetes : 컨테이너화된 애플리케이션을 배포하기 위한 오픈 소스 오케스트레이터(orchestrator). 구현은 오케스트레이션을 위한 API이다. Kubernetes Cluster : 컨테이너 오케스트레이션을 위한 시스템셋. 쿠버네티스 API로 동작한다. 운영 주제 :
- 클러스터 작동 방식
- 클러스터 조정, 보안, 적용 방법
- 클러스터를 이해하고 문제에 대응하는 방법
- 새로운 기능과 사용자 정의 기능으로 클러스터를 확장하는 방법
Chapter 2. 쿠버네티스 살펴보기
2.1. 컨테이너
컨테이너의 두 구성
- 컨테이너 이미지
- 프로세스(컨테이너 이미지 러닝용) 격리를 위한 운영체제의 지원
컨테이너 이미지
애플리케이션의 구성
- 애플리케이션 바이너리
- 라이 브러리
- 기타 데이터 => 자기 컴퓨터에서 싸도 남의 컴퓨터에서 돌꺼라는, 이식성을 갖춘 컨테이너 이미지 획득
컨테이너 이미지 실행환경
운영체제의 네임스페이스
네임스페이스의 구성
- OS내의 다른 프로세스 등으로부터 격리
- chroot : 분리된 고유한 파일 시스템?
- 고유한 네트워크 및 프로세스 식별자(PID)
- 개별 SELinux를 실행 중인 컨테이너와 함께 사용 가능
컨테이너 이미지 관련 도구
- 이미지 빌더 : ex. 도커
- 이미지 생성 절차 : ex. dockerfile
- 이미지 레지스트리 : ex. registry
2.2. 컨테이너 오케이스트레이션
이미지 레지스트리에서 애플리케이션을 운영하기 위한 환경 및 API 이미지를 돌리기 위한 사양을 설정->현재 확인하여 스케줄링->설정된 스케줄에 따라 이미지가 러닝
2.3. 쿠버네티스 API
클러스터를 운영하기 위한 API로 RESTful API. API 서버 제공. 하위 호환성이 개쩐다.
2.3.1. 기본 오브젝트
파드
쿠버네티스 클러스터 구성 최소 단위(atomic). 실행 중인 컨테이너로 구성. 하나의 파드에서 수행된다는 것은 동일한 시스템을 차지하도록 보장. 하나의 파드에서 수행되는 컨테이너는 네임스페이스를 공유 -> 네트워크 공유, IPC를 통한 통신 가능 -> 파드는 논리적으로 그 루핑된 복제 단위
레플리카셋
복제본. 스케일아웃하여 하나가 자빠져도 다른 친구가 일해라. ReplicaSet 사용. RelicatoinController는 안녕.
서비스
서비스는 로드밸런서. TCP/UDP를 밸런싱 하며 아래와 같이 구성된다.
- 자체 IP 주소(->서비스의 DNS 바인딩)
- 클러스터 DNS 항목
- 로드 밸런싱 규칙(Service->파드)
스토리지: 퍼시스턴트 볼륨, 컨피그맵, 시크릿
볼륨 :
- 파드내에서 볼륨 집합 정의 가능.
- NFS, iSCSI, gitRepo, 클라우드 스토리지 등 10가지. -> 다양한 종류의 스토리지를 연결하기 위한 CSI(Container Storage Interface) 제공
- Mount : 컨테이너-볼륨 연결
컨피그맵(Configmap)
- ConfigMap 기반의 볼륨. Configmap으로 정의된 볼륨을 컨테이너에서 볼 수 있음
시크릿
- 디비암호, 인증서와 같은 보안 데이터. Configmap과 동일하게 동작.
2.3.2. 클러스터 구성 오브젝트: 네임스페이스, 레이블, 어노테이션
네임스페이스
쿠버네티스 클러스터의 자원 폴더. 폴더가 삭제되면 내부 자원도 모두 삭제 네임스페이스별 RBAC을 지원.
기본 생성되는 네임스페이스
- default : 기본 네임스페이스
- kube-system : 클러스터 운영 컨테이너
- kube-public : 전체 클러스터에서 읽을 필 요가 있는 자원을 위한 네임스페이스. 모든 사용자(인증되지 않은 사용자 포함) 접근 가능
- kube-node-lease : 스케일링을 위한 리스 노드?용 네임스페이스
FQDN에 네임스페이스를 포함하여 네임스페이스 별로 동일한 자원명 설정이 가능. 예를 들어 my-service라는 서비스를 만들면, FQDN에 네임스페이스를 포함. 예를 들어 my-service.svc.my-namespace.cluster.internal.
레이블과 레이블 쿼리
레이블 : 자원 식별하는데 도움이 되는 키밸류 데이터. 전통적인 의미로 태그에 가까운듯? 예를 들어 "role" : "frontend"
레이블쿼리 : 레이블 셀렉터. 복수의 자원을 레이블로 검색해서 땡김
어노테이션
우리가 아는 그 어노테이션. 단순 주석일수 있지만 주석형 지시자로 어노테이션을 확장하여 신규 기능 개발 가능. 레이블은 쿼리가 가능하지만 어노테이션은 쿼리가 불가능.
2.3.3. 고급 오브젝트 : 디플로이먼트, 인그레스, 스테이트풀셋
디플로이먼트
롤아웃 업데이트를 위한 API. 3개의 리플리카셋이 있다면 v1 하나생성->정상동작확인->기존레플리카수 하나 줄이기를 3회 반복하여 롤아웃 업데이트. 디플로이먼트의 기능이 많으므로 굳이 레플리카셋을 직접 다루지않고 디플로이먼트를 사용
HTTP 로드밸런싱과 인그레스
인그레스 : HTTP 로드 밸런서(L7) foo.company.com, bar.company.com이 있을 때, DNS->인그레스(IP)연결하고, 인그레스에서 매핑 정보를 통해 각 서비스로 라우팅.
스테이트풀셋
레플리카셋의 보완책. 상태 기반 레플리카셋.
배치 워크로드 : 잡과 크론잡
잡 : 일회성 업무 크론잡 : 잡을 스케줄링함. 크론탭의 그 크론
2.3.5. 클러스터 에이전트와 유틸리티 : 데몬셋
에이전트
2.4. 마치며
잘 이해하자.
Chapter 3. 아키텍처
3.1. 개념
3.1.1. 선언적 구성(Declarative Configuration)
어떤 자원을 얼마나 사용할지에 대한 상태를 미리 선언(yaml or json) <-> 명령어 구성(imperative configuration)과 반대. 자가 복구가 가능해짐.
3.1.2. 조정 또는 컨트롤러
쿠버네티스 클러스터에서 구동되는 자원에 대해 사용자가 원하는 상태를 선언하고, 컨트롤러가 현재 상태를 관찰하여 해당 상태를 유지 모니터링을 위하여 자원의 라벨과 라벨쿼리를 이용
3.1.3. 암시적 또는 동적 그룹화
명시적/정적 그룹화 <-> 암시적/동적 그룹화
3.2. 구조
설계 원칙
3.2.1. 유닉스 철학
각자 일을 잘 수행하는 작은 조각, 모듈화를 기반으로 함. 단일 바이너리가 아니라 각자의 역할을 잘 수행하는 조각의 모음.
3.2.2. API 기반 상호작용
3.3. 구성 요소
워커 노드와 헤드 노드로 분류
- 헤드 노드/제어/플랜 노드에서 쿠버네티스 인프라를 구성하는 대부분의 구성 요소가 수행
- 워커 노드에서 실제 워크로드가 수행
3.3.1. 헤드노드의 구성요소
etcd
쿠버네티스 클러스터의 모든 오브젝트에 대한 키밸류 저장소. 이를 이용하여 비교 후 교환(CAS, Compare and Swap) 구현 가능? watch 프로토콜을 구현? 감시용 프로토콜?
API 서버
그야말로 인터페이스. 클라이언트는 API를 통해서 etcd를 조작한다. 이것이 쿠버네티스 클러스터의 기본 흐름(클라이언트 -> API 서버 -> etcd)
스케줄러
실제 워크로드 수행 스케줄을 짬. OS의 태스크스케줄러 역할. 스케줄러->API 서버->파드에서 워크로드 돌림 여기까지 구축하면 기본적으로 컨테이너 이미지를 돌릴 수 있는 환경이 구축된다.
컨트로러 관리자
etc, API 서버, 스케줄러만으로는 제어 루프 수행 불가 => replicasets, service, deployment 동작 불가
3.3.2. 모든 노드의 구성 요소
모든 노드에서 공통 요소. 필수 기능이 구현됨.
쿠블렛(kubelet)
현재 노드 의 API 서버 사이의 연결자. 예를 들어 컨트롤 루프가 컨테이너 상태를 볼때 API 서버에 요청을 하면 API 서버가 각 노드의 쿠블렛과 통신하여 CPU, 메모리 등의 정보를 던짐. 하드웨어 자원뿐 아니라 노드 위에 수행 컨테이너 정보를 포함. 모니터링 뿐만 아니라 컨테이너 스케줄링 및 제어도 담당.
kube-proxy
Service의 로드밸런서 네트워킹 구현. pod->pod 트래픽 라우팅.
3.3.3. 스케줄된 구성 요소
쿠버 DNS
쿠버 DNS 서버. Service에 대한 가상 IP와 도메인 정보를 담음. 쿠버 DNS 서비스에는 정적 가상 IP주소가 부여되므로, 컨테이너에서 해당 DNS로 DNS 쿼리를 날려 개발 가능함.
힙스터
바이너리 파일. 모든 컨테이너의 CPU, 메모리 등 메트릭 수집. 인플럭스 DB(influxDB) ? kubelet과 다른가? 자동 스케일링을 구현하는데 메트릭을 사용. => 요즘은 metrics-server를 통해 클러스터 전체 리소스 사용량 데이터를 집계. 힙스터 안씀
추가 기능
대시보드 Faas, 자동 인증 에이전트 등.
3.4. 마치며
Chapter 4 쿠버네티스 API 서버
4.1. 관리 효율을 위한 기본 특성
API 서버 - persistence DB 구조이므로 API 서버는 스테이트리스하다. 다만, 로그가 잔뜩 쌓이는데, 로그 로테이트로 돌리거나 집계 서비스로 뽑아서 관리하자
###4.2. API 서버의 구성
4.2.1. API 관리
4.2.2. 요청 처리
요청 경로는 /api or /apis로 시작한다. 예를 들어 /apis/batch/v1과 같은 요청 경로를 가진다.
경로 구성 방식 - namespace가 있는 경우
- /api/v1/namespaces/<namespace-name>/<resource-type-name>/<resource-name>
- espace(/apis/<api-group>/<api-version>/namespace/<namespace-name>/<resource-type-name>/<resource-name>)
경로 구성 방식 - namespace가 없는 경우
-
"/api/v1/<resource-type-name>/<resource-name>"
-
"/apis/<api-group>/<api-version>/<resource-type-name>/<resource-name>"
4.2.3. API 검색
; 로컬 클라이언트에서 API Server로 향하는 프록시 서버 생성(localhost:8001); curl로 API 명령 가능kubectl proxy
4.3. 요청관리
4.3.1. 요청의 유형
GET
특정 리소스와 연관된 데이터를 검색. 예를 들어 /api/v1/namespaces/dafault/pods/foo라는 요청을 날리면 default네임스페이스의 foo 파드 데이터 검색함.
LIST
LIST = Collection Get. /api/v1/namespace/default/pods를 때리면 default 네임스페이스에 있는 전체 pods를 땡김.
POST
리소스 생성. 경로에 리소스 유형을 넣으므로 pod을 추가하려면 경로를 /api/v1/namespace/pods로 요청하고 생성할 pod의 내용을 본문에 넣음
DELETE
리소스 삭제. /api/v1/namespace/default/pods/foo와 같이 삭제할 리소스 경로 전송. 진짜 지워진다. 조심허자.
4.3.2. 요청의 수명
요청->인증
인증
요청의 첫 단계.
RBAC/인가
인증 후 인가(authentication 후 authorization)를 수행하며 RBAC 모델을 따른다.
요청자는 인가된 사용자가 아니면 403 응답을 받음.
승인 제어
Admission Controller에서 구현. 요청이 올바른지 판단하고 오류가 있을 경우 유청을 거부함. 플러그인 가능한 인터페이스.
유효성 검사
단일 오브젝트 요청에 대한 유효성 검사. 더 많은 정보를 필요로 할 경우 어드미션 컨트롤러로 구현 필요.
전문화된 요청
/proxy, /exec, /attach, /logs
단일 요청에 대한 응답 구조가 아니라 지속적으로 오픈 후 데이터 스트리밍과 같은 전문화된 요청이 가능
/logs
/logs 땡길 경우,client->apiserver-> kubelet->컨테이너 매트릭을 땡겨감.
데이터를 스트리밍 하므로 웹 소켓(3개 : std in, std out, std err)을 이용.