현실에서 쿠버네티스의 배포는 힘든 작업입니다. 작은 구성 오류나 설계 문제도 시스템을 망칠 수 있습니다. 현실에서 신속하게 문제를 해결하고, 구성을 재설정하고, 다음 문제로 넘어가려면 각 컴포넌트의 동작 방법을 아는 것은 중요합니다. 이 독특한 책은 쿠버네티스 앱을 계속 운영하기 위한 세부사항과 힘들게 얻은 노하우, 전문가들의 팁을 포함하고 있습니다.
이 책은 iptables 관리부터 부하에 따라 동적으로 확장되는 클러스터 설정까지, 쿠버네티스의 내부를 살펴봅니다. 이 책의 모든 페이지는 쿠버네티스 설정과 관리, 불가피한 껄끄러운 상황을 다루기 위한 새로운 통찰력을 제공합니다. 《코어 쿠버네티스》는 운영 환경에서 쿠버네티스 배포를 관리하기 위한 포괄적인 참조 가이드입니다.
Contents
01장: 왜 쿠버네티스인가?
1.1 사전 준비 - 몇 가지 핵심 용어 검토하기
1.2 인프라 드리프트 문제와 쿠버네티스
1.3 컨테이너와 이미지
1.4 쿠버네티스의 핵심 기초
__1.4.1 쿠버네티스에서 모든 인프라 규칙은 평범한 YAML로 관리된다
1.5 쿠버네티스의 기능
1.6 쿠버네티스 컴포넌트와 아키텍처
__1.6.1 쿠버네티스 API
__1.6.2 예제 1: 온라인 소매업체
__1.6.3 예제 2: 온라인 기부 솔루션
1.7 쿠버네티스를 사용하지 말아야 하는 경우
요약
02장: 왜 파드인가?
2.1 웹 애플리케이션 예제
__2.1.1 웹 애플리케이션 인프라
__2.1.2 운영 요구사항
2.2 파드란 무엇인가?
__2.2.1 다양한 리눅스 네임스페이스
__2.2.2 쿠버네티스, 인프라, 파드
__2.2.3 노드 API 객체
__2.2.4 웹 애플리케이션과 컨트롤 플레인
2.3 kubectl로 웹 애플리케이션 생성하기
__2.3.1 쿠버네티스 API 서버: kube-apiserver
__2.3.2 쿠버네티스 스케줄러: kube-scheduler
__2.3.3 인프라 컨트롤러
2.4 확장, 고가용성 애플리케이션, 컨트롤 플레인
__2.4.1 자동 확장
__2.4.2 비용 관리
요약
03장: 파드 생성하기
3.1 kind로 쿠버네티스 기본 요소 살펴보기
3.2 리눅스 기본 요소란 무엇인가?
__3.2.1 리눅스 기본 요소는 리소스 관리 도구다
__3.2.2 모든 것은 파일(또는 파일 디스크립터)이다
__3.2.3 파일들은 합성이 가능하다
__3.2.4 kind 설정
3.3 쿠버네티스에서 리눅스 기본 요소 사용하기
__3.3.1 파드 실행을 위한 전제 조건
__3.3.2 간단한 파드 실행하기
__3.3.3 파드의 리눅스 의존성 탐색하기
3.4 처음부터 파드 만들기
__3.4.1 chroot를 사용해 격리 프로세스 생성하기
__3.4.2 마운트를 사용해 작업을 위한 프로세스 데이터 제공하기
__3.4.3 unshare를 통한 프로세스 보안
__3.4.4 네트워크 네임스페이스 생성하기
__3.4.5 프로세스 상태 확인하기
__3.4.6 cgroup을 통한 CPU 조정하기
__3.4.7 리소스 스탠자 생성하기
3.5 현실에서 파드 사용하기
__3.5.1 네트워킹 문제
__3.5.2 iptables를 활용하여 kube-proxy의 쿠버네티스 서비스 구현 방법 이해하기
__3.5.3 kube-dns 파드 사용하기
__3.5.4 기타 문제 고려하기
요약
04장: 파드 내 프로세스에서 cgroups 사용하기
4.1 파드는 준비 작업이 완료될 때까지 유휴 상태다
4.2 리눅스의 프로세스와 스레드
__4.2.1 sytemd와 init 프로세스
__4.2.2 프로세스의 cgroups
__4.2.3 일반 파드에 대한 cgroups 구현
4.3 cgroups 테스트하기
4.4 kubelet의 cgroups 관리 방법
4.5 kubelet의 리소스 관리 방법 자세히 알아보기
__4.5.1 왜 OS는 쿠버네티스에서 스왑을 사용할 수 없는가?
__4.5.2 해킹: 가난한 자의 우선순위 조절 방법
__4.5.3 해킹: init 컨테이너로 HugePages 편집하기
__4.5.4 QoS 클래스가 중요한 이유와 동작 방법
__4.5.5 리소스 설정을 통한 QoS 클래스 생성하기
4.6 프로메테우스, cAdvisor, API 서버로 리눅스 커널 모니터링하기
__4.6.1 메트릭은 게시 비용이 저렴하며 매우 가치가 높다
__4.6.2 프로메테우스가 필요한 이유는 무엇인가?
__4.6.3 로컬 프로메테우스 모니터링 서비스 생성하기
__4.6.4 프로메테우스에서 시스템 장애 특성화하기
요약
05장: 컨테이너 네트워크 인터페이스(CNI), 그리고 네트워크를 통한 파드 제공
5.1 쿠버네티스에 SDN이 필요한 이유
5.2 쿠버네티스 SDN의 서비스 측면 구현하기: kube-proxy
__5.2.1 kube-proxy 데이터 플레인
__5.2.2 NodePort 서비스
5.3 CNI 공급자
5.4 두 개의 CNI 네트워킹 플러그인 살펴보기: Calico와 Antrea
__5.4.1 CNI 플러그인의 아키텍처
__5.4.2 CNI를 사용해 보자
__5.4.3 Calico CNI 공급자 설치
__5.4.4 OVS와 Antrea를 통한 쿠버네티스 네트워킹
__5.4.5 다른 OS상의 CNI 공급자와 kube-proxy에 대한 참고사항
요약
06장: 대규모 네트워크 오류 해결하기
6.1 Sonobuoy - 클러스터 기능 확인을 위한 도구
__6.1.1 실제 클러스터에서 파드의 데이터 경로 추적하기
__6.1.2 Antrea CNI 공급자로 클러스터 설정하기
6.2 arp와 ip 명령어를 통한 다양한 공급자의 CNI 라우팅 검사
__6.2.1 IP 터널이란 무엇이며, 왜 CNI 공급자들이 IP 터널을 이용하는가?
__6.2.2 CNI의 네트워크 인터페이스를 통해 얼마나 많은 패킷이 흐르는가?
__6.2.3 경로
__6.2.4 CNI 특화 도구 - OVS (Open vSwitch)
__6.2.5 tcpdump를 이용한 활성 컨테이너의 데이터 경로 추적
6.3 kube-proxy와 iptables
__6.3.1 iptables-save와 diff 도구
__6.3.2 네트워크 정책이 CNI 규칙을 수정하는 방법 살펴보기
__6.3.3 이러한 정책들은 어떻게 구현되는가?
6.4 인그레스 컨트롤러
6.4 인그레스 컨트롤러
__6.4.1 인그레스 컨트롤러를 탐색하기 위한 Contour와 kind 설정
__6.4.2 간단한 웹 서버 파드 설정하기
요약
07장: 파드 스토리지와 CSI
7.1 빠른 우회 방법: 리눅스의 가상 파일시스템(VFS)
7.2 세 가지 스토리지 유형에 대한 쿠버네스트 요구사항
7.3 kind 클러스터에 PVC 생성하기
7.4 컨테이너 스토리지 인터페이스(CSI)
__7.4.1 인트리 공급자 문제
__7.4.2 쿠버네티스 내부에서 동작하는 명세로서의 CSI
__7.4.3 CSI - 스토리지 드라이버 작동 방식
__7.4.4 바인드 마운팅
7.5 몇 가지 실행 중인 CSI 드라이버에 대한 간략한 개요
__7.5.1 컨트롤러
__7.5.2 노드 인터페이스
__7.5.3 리눅스가 아닌 OS의 CSI
요약
08장: 스토리지 구현과 모델링
8.1 더 넓은 쿠버네티스 생태계의 축소판 - 동적 스토리지
__8.1.1 즉각적인 스토리지 관리 - 동적 프로비저닝
__8.1.2 로컬 스토리지와 emptyDir 비교
__8.1.3 PersistentVolume
__8.1.4 컨테이너 스토리지 인터페이스(CSI)
8.2 동적 프로비저닝은 CSI에서 혜택을 얻지만 직교적이다
__8.2.1 StorageClasses
__8.2.2 데이터 센터 항목으로 되돌아가기
8.3 스토리지에 대한 쿠버네티스 유스케이스
__8.3.1 시크릿 - 임시적인 파일 공유
8.4 동적 스토리지 공급자는 일반적으로 어떻게 보이는가?
8.5 시스템 제어와/또는 데이터 액세스를 위한 hostPath
__8.5.1 hostPath, CSI 및 CNI: 표준 유스케이스
__8.5.2 카산드라: 실제 쿠버네티스 애플리케이션 스토리지의 예
__8.5.3 고급 스토리지 기능과 쿠버네티스 스토리지 모델
8.6 더 읽을거리
요약
09장: 파드 실행: kubelet의 동작 방법
9.1 kubelet과 노드
9.2 kubelet의 핵심
__9.2.1 컨테이너 런타임: 표준과 규약
__9.2.2 kubelet 구성과 API
9.3 파드를 생성하고 실제 동작 살펴보기
__9.3.1 kubelet 바이너리 시작하기
__9.3.2 시작 이후: 노드 수명주기
__9.3.3 etcd의 임대와 잠금, 그리고 노드 임대의 진화
__9.3.4 kubelet의 파드 수명주기 관리
__9.3.5 CRI, 컨테이너, 이미지: 서로 어떻게 관련되어 있는가
__9.3.6 kubelet은 컨테이너를 실행하지 않는다: 그것은 CRI의 일이다
__9.3.7 Pause 컨테이너: 깨달음의 순간
9.4 컨테이너 런타임 인터페이스(CRI)
__9.4.1 컨테이너 런타임의 위치를 쿠버네티스에 알려주기
__9.4.2 CRI 루틴
__9.4.3 CRI와 관련된 kubelet의 추상화: GenericRuntimeManager
__9.4.4 CRI는 어떻게 호출되는가?
9.5 kubelet의 인터페이스
__9.5.1 Runtime 내부 인터페이스
__9.5.2 kubelet이 이미지를 가져오는 방법 - ImageService 인터페이스
__9.5.3 kubelet에 ImagePullSecrets 제공하기
9.6 더 읽을거리
요약
10장: 쿠버네티스의 DNS
10.1 DNS(그리고 CoreDNS)의 간략한 소개
__10.1.1 NXDOMAIN, 레코드, CNAME 레코드
__10.1.2 파드는 내부 DNS를 필요로 한다
10.2 왜 디플로이먼트 대신 스테이트풀셋을 사용하는가?
__10.2.1 헤드리스 서비스를 갖는 DNS
__10.2.2 스테이트풀셋 내의 영구적인 DNS 레코드
__10.2.3 파드의 DNS 속성 탐색을 위해 폴리글랏 디플로이먼트 사용하기
10.3 resolv.conf 파일
__10.3.1 간단한 라우팅 관련 참고사항
__10.3.2 CoreDNS: ClusterFirst 파드 DNS의 업스트림 해석기
__10.3.3 CoreDNS 플러그인 구성 해킹하기
요약
11장: 컨트롤 플레인의 핵심
11.1 컨트롤 플레인 살펴보기
11.2 API 서버 세부사항
__11.2.1 API 객체와 사용자 정의 API 객체
__11.2.2 사용자 정의 리소스 정의(CRD)
__11.2.3 스케줄러 세부사항
__11.2.4 스케줄링 다시 살펴보기
11.3 컨트롤러 매니저
__11.3.1 스토리지
__11.3.2 서비스 계정과 토큰
11.4 쿠버네티스 클라우드 컨트롤러 매니저(CCM)
11.5 더 읽을거리
요약
12장. etcd와 컨트롤 플레인
12.1 참을성 없는 사람들을 위한 참고사항
__12.1.1 프로메테우스를 통한 etcd 성능의 시각화
__12.1.2 etcd 튜닝 시점 파악하기
__12.1.3 예제: etcd의 빠른 상태 점검
__12.1.4 etcd v3 vs. v2
12.2 데이터 저장소로서의 etcd
__12.2.1 감시: 다른 데이터베이스에서 쿠버네티스를 실행할 수 있는가?
__12.2.2 엄격한 일관성
__12.2.3 fsync 오퍼레이션은 etcd를 일관성 있게 만든다
12.3 쿠버네티스를 위한 etcd 인터페이스 살펴보기
12.4 etcd는 사실을 정확하게 유지한다
__12.4.1 etcd 사전 기록 로그
__12.4.2 쿠버네티스에 미치는 영향
12.5 CAP 정리
12.6 클라이언트 수준의 로드 밸런싱과 etcd
__12.6.1 크기 제한: 걱정해야(하지 말아야) 하는 사항
12.7 eted 암호화
12.8 글로벌 규모에서 etcd의 성능 및 내결함성
12.9 고도로 분산된 etcd의 하트비트 시간
12.10 kind 클러스터에 etcd 클라이언트 설정하기
__12.10.1 리눅스가 아닌 환경에서 etcd 실행하기
요약
13장: 컨테이너와 파드 보안
13.1 폭발 반경
__13.1.1 취약점
__13.1.2 침입
13.2 컨테이너 보안
__13.2.1 컨테이너와 사용자 정의 소프트웨어 업데이트 계획
__13.2.2 컨테이너 심사
__13.2.3 컨테이너 사용자 - 루트 사용자로 실행하지 마라
__13.2.4 가장 작은 컨테이너를 사용하라
__13.2.5 컨테이너 출처
__13.2.6 컨테이너를 위한 린터
13.3 파드 보안
__13.3.1 보안 컨텍스트
__13.3.2 에스컬레이션된 권한과 기능
__13.3.3 파드 보안 정책(PSP)
__13.3.4 자동으로 서비스 계정 토큰을 마운트하지 마라
__13.3.5 유사 루트 파드
__13.3.6 보안 외곽
요약
14장: 노드와 쿠버네티스 보안
14.1 노드 보안
__14.1.1 TLS 인증서
__14.1.2 불변 OS 대 노드 패치하기
__14.1.3 격리된 컨테이너 런타임
__14.1.4 리소스 공격
__14.1.5 CPU 단위
__14.1.6 메모리 단위
__14.1.7 스토리지 단위
__14.1.8 호스트 네트워크 vs. 파드 네트워크
__14.1.9 파드 예제
14.2 API 서버 보안
__14.2.1 역할 기반 액세스 제어(RBAC)
__14.2.2 RBAC API 정의
__14.2.3 리소스와 하위 리소스
__14.2.4 Subjects와 RBAC
__14.2.5 RBAC 디버깅
14.3 Authn, Authz, Secret
__14.3.1 IAM 서비스 계정: 클라우드 API 보안
__14.3.2 클라우드 리소스 액세스
__14.3.3 전용 API 서버
14.4 네트워크 보안
__14.4.1 네트워크 정책
__14.4.2 로드 밸런서
__14.4.3 OPA(Open Policy Agent)
__14.4.4 멀티테넌시
14.5 쿠버네티스 팁
요약
15장: 애플리케이션 설치하기
15.1 쿠버네티스 앱에 대한 생각
__15.1.1 애플리케이션의 범위는 사용하는 도구에 영향을 미친다
15.2 마이크로서비스 앱들은 수천 라인의 구성 코드가 필요하다
15.3 실제 환경의 Guestbook 앱 설치에 대한 재고
15.4 Carvel 툴킷 설치
__15.4.1 1부: 리소스를 별도 파일로 모듈화
__15.4.2 2부: ytt를 이용한 애플리케이션 파일 패치
__15.4.3 3부: Guestbook을 단일 애플리케이션으로 관리하고 배치하기
__15.4.4 4부: 애플리케이션 패키징 및 관리를 위한 kapp 오퍼레이터 구성
15.5 쿠버네티스 오퍼레이터 다시 살펴보기
15.6 Tanzu 커뮤니티 에디션: Carvel 툴킷의 전체 예제
요약
Author
크리스 러브,제이 비아스,김영기
제이 비아스는 VMware의 스태프 엔지니어로서 OpenShift, VMware Tanzu, Black Duck의 내부 다각화 쿠버네티스 설치 플랫폼을 비롯해 자신이 운영하는 컨설팅 회사 Rocket Rudolf, LLC의 고객을 위한 맞춤형 쿠버네티스 설치를 포함하는 여러 상용 및 오픈소스 쿠버네티스 배포판과 플랫폼과 관련된 작업을 해왔다. 쿠버네티스가 출시된 이후에는 다양한 역량을 발휘하며 현재는 SIG-Windows 및 SIG-network 커뮤니티에서 대부분의 시간을 보내고 있다.
제이 비아스는 VMware의 스태프 엔지니어로서 OpenShift, VMware Tanzu, Black Duck의 내부 다각화 쿠버네티스 설치 플랫폼을 비롯해 자신이 운영하는 컨설팅 회사 Rocket Rudolf, LLC의 고객을 위한 맞춤형 쿠버네티스 설치를 포함하는 여러 상용 및 오픈소스 쿠버네티스 배포판과 플랫폼과 관련된 작업을 해왔다. 쿠버네티스가 출시된 이후에는 다양한 역량을 발휘하며 현재는 SIG-Windows 및 SIG-network 커뮤니티에서 대부분의 시간을 보내고 있다.