▣ 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 툴킷의 전체 예제 요약