책 소개
요약
쿠버네티스를 이용해 애플리케이션을 효과적으로 개발하고 운영할 수 있는 방법을 초보자도 쉽게 이해할 수 있도록 설명한다. 쿠버네티스 아키텍처와 각 객체의 개념을 명확히 정립할 수 있도록 예제와 그림을 곁들였다. 후반부에는 쿠버네티스의 내부 구조 및 동작 원리도 쉽게 설명하고 있어 쿠버네티스의 안팎을 모두 살필 수 있다.
추천의 글
“권위 있고 철저하다. 분산되고 확장 가능한 애플케이션의 전체 라이프사이클을 관리하는 방법을 실습 위주로 설명한다.”
- 안토니오 마그나히(Antonio Magnaghi), 시스템1
“특히 실제 사례를 다룬 부분이 좋다. 단지 개념만 적용하는 것이 아니라 실제 테스트를 해본다.”
- 파올로 안티노리(Paolo Antinori), 레드햇
“쿠버네티스와 관련 있는 기술들의 깊이 있는 토론이다. 반드시 소장해야 하는 책이다.”
- 알 크린커(Al Krinker), USPTO
“쿠버네티스 전문가가 되기 위한 필독서로, 모든 것이 담겨 있다."
- 차바 사리(Csaba Sari), 키메라 엔터테인먼트
이 책에서 다루는 내용
■ 쿠버네티스 내부 구조
■ 클러스터상에서 컨테이너 배포
■ 클러스터 보안
■ 중단 없이 애플리케이션 갱신
이 책의 대상 독자
도커나 컨테이너 오케스트레이션 시스템에 익숙하지 않은 초, 중급 소프트웨어 개발자를 대상으로 한다.
주로 애플리케이션 개발자를 대상으로 설명하지만, 운영 관점에서 애플리케이션 관리 개요도 제공한다. 이는 다수 서버 환경에서 컨테이너화된 애플리케이션을 실행하고 관리하는 데 관심이 있는 모든 사용자에게 적합하다. 컨테이너 기술을 배우고 여러 개의 관련된 컨테이너를 규모에 맞게 조정하고자 하는 입문자나 고급 소프트웨어 엔지니어들은 쿠버네티스 환경에서 애플리케이션을 개발하고 컨테이너화하며 실행하는 데 필요한 전문 지식을 얻게 될 것이다.
이전의 컨테이너 기술이나 쿠버네티스 관련 경험을 필요로 하진 않는다. 주제를 점진적으로 상세히 설명하고 있으며, 비전문가 개발자가 이해하기에 어려운 애플리케이션 소스 코드는 사용하지 않았다. 그러나 최소한 프로그래밍, 컴퓨터 네트워킹, 리눅스의 기본 명령 실행과 같은 기본적인 지식과 HTTP처럼 잘 알려진 프로토콜에 관해 이해하고 있어야 한다.
이 책의 구성
이 책은 18장을 세 부분으로 나눠 설명한다.
1부는 도커와 쿠버네티스를 간략하게 소개하고, 쿠버네티스 클러스터를 설치하는 방법과 간단한 애플리케이션을 실행하는 방법 등을 소개한다. 1부에는 두 개의 장이 있다.
1장에서는 쿠버네티스가 무엇이고 어떻게 생겨났으며 규모에 맞게 애플리케이션을 관리해야 하는 오늘날의 문제를 해결하는 데 어떻게 도움이 되는지 설명한다.
2장에서는 컨테이너 이미지를 빌드해 쿠버네티스 클러스터에서 실행하는 방법의 실습 튜토리얼을 제공한다. 또한 로컬에서 단일 노드 쿠버네티스 클러스터를 실행하는 방법과 클라우드에서 다중 노드 클러스터를 실행하는 방법을 설명한다.
2부에서는 쿠버네티스에서 애플리케이션을 실행하기 위해 반드시 이해해야 하는 핵심 개념을 소개한다. 2부의 각 장은 다음과 같다.
3장에서는 쿠버네티스의 기본 구성 블록인 파드(Pod)를 소개하고, 레이블(label)을 통해 파드와 기타 쿠버네티스의 오브젝트를 정리하는 방법을 설명한다.
4장에서는 컨테이너를 자동으로 다시 시작해 쿠버네티스가 애플리케이션을 정상적으로 유지하는 방법을 알려준다. 또한 관리되는 파드(managed pod)를 적절히 실행하고, 수평 확장하며, 클러스터 노드 장애에 내성을 갖게 하고 사전 정의된 시간 또는 주기적으로 실행하는 방법을 알아본다.
5장에서는 파드가 제공하는 서비스를 클러스터 내외부 클라이언트에게 노출시키는 방법을 보여준다. 또한 클러스터에서 실행 중인 파드가 클러스터 내부나 외부에 상주하는지에 관계없이 서비스를 검색하고 액세스하는 방법을 보여준다.
6장에서는 같은 파드에서 실행되는 여러 개의 컨테이너가 파일을 공유하는 방법과 퍼시스턴트 스토리지(persistent storage)를 관리하고 파드가 접근할 수 있게 하는 방법을 설명한다.
7장에서는 설정 데이터와 자격증명과 같은 중요 정보를 파드 내부에서 실행되는 애플리케이션에 전달하는 방법을 보여준다.
8장에서는 애플리케이션이 실행 중인 쿠버네티스 환경 관련 정보를 얻는 방법과 클러스터 상태를 변경하기 위해 쿠버네티스와 통신하는 방법을 설명한다.
9장에서는 디플로이먼트(Deployment) 개념을 소개하고 쿠버네티스 환경에서 애플리케이션을 실행하고 업데이트하는 적절한 방법을 안내한다.
10장에서는 안정적인 아이덴티티와 상태를 필요로 하는 스테이트풀(stateful) 애플리케이션을 실행하는 방법을 소개한다.
3부는 쿠버네티스 클러스터의 내부를 깊이 들여다보며 몇 가지 추가적인 개념을 소개하고 1, 2부에서 배운 것을 좀 더 높은 수준에서 살펴본다. 마지막 부의 구성은 다음과 같다.
11장은 쿠버네티스 클러스터를 구성하는 모든 구성 요소와 각 요소의 역할을 설명한다. 또한 파드가 네트워크를 이용해 통신하는 법과 서비스가 여러 파드를 로드 밸런싱하는 방법을 설명한다.
12장에서는 인증(authentication)과 인가(authorization)를 사용해 쿠버네티스 API 서버를 안전하게 보호하는 방법을 설명한다.
13장에서는 파드가 노드의 리소스에 접근하는 방법과 클러스터 관리자가 파드의 리소스 접근을 막는 방법을 설명한다.
14장에서는 애플리케이션이 사용할 수 있는 컴퓨팅 리소스를 제약하고, 애플리케이션의 서비스 품질(QoS, Quality of Service) 보증을 구성하고, 개별 애플리케이션의 리소스 사용량을 모니터링하는 방법을 다룬다. 또한 사용자가 너무 많은 리소스를 사용하는 것을 방지하는 방법을 알려준다.
15장에서는 애플리케이션에서 실행 중인 레플리카(replicas) 수를 자동으로 확장하도록 쿠버네티스를 설정하는 방법과 현재 클러스터 노드 수 이상으로 애플리케이션을 수용하기 위해 클러스터 크기를 늘리는 방법을 설명한다.
16장에서는 특정 노드에만 파드가 스케줄링되게 하거나 파드가 다른 노드로 예약되지 않게 하는 방법을 알려준다. 또한 파드가 함께 스케줄링되거나 함께 스케줄링되지 않게 하는 방법을 살펴본다.
17장에서는 애플리케이션을 쿠버네티스 클러스터에 알맞게 개발하는 방법을 알려준다. 또한 개발 중 마찰을 줄이기 위해 개발 및 테스트 workflow를 설정하는 방법 관련 지침을 몇 가지 제공한다.
18장에서는 사용자 정의 오브젝트(custom objects)로 쿠버네티스를 확장할 수 있는 방법과 다른 사람들이 어떤 방식으로 엔터프라이즈급 애플리케이션 플랫폼을 만들었는지를 보여준다.
위 내용을 통해 쿠버네티스의 각 구성 요소를 알게 되고 점차적으로 kubectl 명령줄 도구를 사용하는 법을 배우게 될 것이다.
목차
목차
- 1부. 쿠버네티스 개요
- 1장. 쿠버네티스 소개
- 1.1 쿠버네티스와 같은 시스템이 필요한 이유
- 1.1.1 모놀리스 애플리케이션에서 마이크로서비스로 전환
- 1.1.2 애플리케이션에 일관된 환경 제공
- 1.1.3 지속적인 배포로 전환: 데브옵스와 노옵스
- 1.2 컨테이너 기술 소개
- 1.2.1 컨테이너 이해
- 1.2.2 도커 컨테이너 플랫폼 소개
- 1.2.3 도커의 대안으로 rkt 소개
- 1.3 쿠버네티스 소개
- 1.3.1 쿠버네티스의 기원
- 1.3.2 넓은 시각으로 쿠버네티스 바라보기
- 1.3.3 쿠버네티스 클러스터 아키텍처 이해
- 1.3.4 쿠버네티스에서 애플리케이션 실행
- 1.3.5 쿠버네티스 사용의 장점
- 1.4 요약
- 2장. 도커와 쿠버네티스 첫걸음
- 2.1 도커를 사용한 컨테이너 이미지 생성, 실행, 공유하기
- 2.1.1 도커 설치와 Hello World 컨테이너 실행하기
- 2.1.2 간단한 node.js 애플리케이션 생성하기
- 2.1.3 이미지를 위한 Dockerfile 생성
- 2.1.4 컨테이너 이미지 생성
- 2.1.5 컨테이너 이미지 실행
- 2.1.6 실행 중인 컨테이너 내부 탐색하기
- 2.1.7 컨테이너 중지와 삭제
- 2.1.8 이미지 레지스트리에 이미지 푸시
- 2.2 쿠버네티스 클러스터 설치
- 2.2.1 Minikube를 활용한 단일 노드 쿠버네티스 클러스터 실행하기
- 2.2.2 구글 쿠버네티스 엔진을 활용한 관리형 쿠버네티스 클러스터 사용하기
- 2.2.3 kubectl의 alias와 명령줄 자동완성 설정하기
- 2.3 쿠버네티스에 첫 번째 애플리케이션 실행하기
- 2.3.1 Node.js 애플리케이션 구동하기
- 2.3.2 웹 애플리케이션에 접근하기
- 2.3.3 시스템의 논리적인 부분
- 2.3.4 애플리케이션 수평 확장
- 2.3.5 애플리케이션이 실행 중인 노드 검사하기
- 2.3.6 쿠버네티스 대시보드 소개
- 2.4 요약
- 2부. 쿠버네티스 핵심 개념
- 3장. 파드: 쿠버네티스에서 컨테이너 실행
- 3.1 파드 소개
- 3.1.1 파드가 필요한 이유
- 3.1.2 파드 이해하기
- 3.1.3 파드에서 컨테이너의 적절한 구성
- 3.2 YAML 또는 JSON 디스크립터로 파드 생성
- 3.2.1 기존 파드의 YAML 디스크립터 살펴보기
- 3.2.2 파드를 정의하는 간단한 YAML 정의 작성하기
- 3.2.3 kubectl create 명령으로 파드 만들기
- 3.2.4 애플리케이션 로그 보기
- 3.2.5 파드에 요청 보내기
- 3.3 레이블을 이용한 파드 구성
- 3.3.1 레이블 소개
- 3.3.2 파드를 생성할 때 레이블 지정
- 3.3.3 기존 파드 레이블 수정
- 3.4 레이블 셀렉터를 이용해 파드 부분 집합 나열
- 3.4.1 레이블 셀렉터를 사용한 파드 나열
- 3.4.2 레이블 셀렉터에서 여러 조건 사용
- 3.5 레이블과 셀렉터를 이용해 파드 스케줄링 제한
- 3.5.1 워커 노드 분류에 레이블 사용
- 3.5.2 특정 노드에 파드 스케줄링
- 3.5.3 하나의 특정 노드로 스케줄링
- 3.6 파드에 어노테이션 달기
- 3.6.1 오브젝트의 어노테이션 조회
- 3.6.2 어노테이션 추가 및 수정
- 3.7 네임스페이스를 사용한 리소스 그룹화
- 3.7.1 네임스페이스의 필요성
- 3.7.2 다른 네임스페이스와 파드 살펴보기
- 3.7.3 네임스페이스 생성
- 3.7.4 다른 네임스페이스의 오브젝트 관리
- 3.7.5 네임스페이스가 제공하는 격리 이해
- 3.8 파드 중지와 제거
- 3.8.1 이름으로 파드 삭제
- 3.8.2 레이블 셀렉터를 이용한 파드 삭제
- 3.8.3 네임스페이스를 삭제한 파드 제거
- 3.8.4 네임스페이스를 유지하면서 네임스페이스 안에 있는 모든 파드 삭제
- 3.8.5 네임스페이스에서 (거의) 모든 리소스 삭제
- 3.9 요약
- 4장. 레플리케이션과 그 밖의 컨트롤러: 관리되는 파드 배포
- 4.1 파드를 안정적으로 유지하기
- 4.1.1 라이브니스 프로브 소개
- 4.1.2 HTTP 기반 라이브니스 프로브 생성
- 4.1.3 동작 중인 라이브니스 프로브 확인
- 4.1.4 라이브니스 프로브의 추가 속성 설정
- 4.1.5 효과적인 라이브니스 프로브 생성
- 4.2 레플리케이션컨트롤러 소개
- 4.2.1 레플리케이션컨트롤러의 동작
- 4.2.2 레플리케이션컨트롤러 생성
- 4.2.3 레플리케이션컨트롤러 작동 확인
- 4.2.4 레플리케이션컨트롤러의 범위 안팎으로 파드 이동하기
- 4.2.5 파드 템플릿 변경
- 4.2.6 수평 파드 스케일링
- 4.2.7 레플리케이션컨트롤러 삭제
- 4.3 레플리케이션컨트롤러 대신 레플리카셋 사용하기
- 4.3.1 레플리카셋과 레플리케이션컨트롤러 비교
- 4.3.2 레플리카셋 정의하기
- 4.3.3 레플리카셋 생성 및 검사
- 4.3.4 레플리카셋의 더욱 표현적인 레이블 셀렉터 사용하기
- 4.3.5 레플리카셋 정리
- 4.4 데몬셋을 사용해 각 노드에서 정확히 한 개의 파드 실행하기
- 4.4.1 데몬셋으로 모든 노드에 파드 실행하기
- 4.4.2 데몬셋을 사용해 특정 노드에서만 파드를 실행하기
- 4.5 완료 가능한 단일 태스크를 수행하는 파드 실행
- 4.5.1 잡 리소스 소개
- 4.5.2 잡 리소스 정의
- 4.5.3 파드를 실행한 잡 보기
- 4.5.4 잡에서 여러 파드 인스턴스 실행하기
- 4.5.5 잡 파드가 완료되는 데 걸리는 시간 제한하기
- 4.6 잡을 주기적으로 또는 한 번 실행되도록 스케줄링하기
- 4.6.1 크론잡 생성하기
- 4.6.2 스케줄된 잡의 실행 방법 이해
- 4.7 요약
- 5장. 서비스: 클라이언트가 파드를 검색하고 통신을 가능하게 함
- 5.1 서비스 소개
- 5.1.1 서비스 생성
- 5.1.2 서비스 검색
- 5.2 클러스터 외부에 있는 서비스 연결
- 5.2.1 서비스 엔드포인트 소개
- 5.2.2 서비스 엔드포인트 수동 구성
- 5.2.3 외부 서비스를 위한 별칭 생성
- 5.3 외부 클라이언트에 서비스 노출
- 5.3.1 노드포트 서비스 사용
- 5.3.2 외부 로드밸런서로 서비스 노출
- 5.3.3 외부 연결의 특성 이해
- 5.4 인그레스 리소스로 서비스 외부 노출
- 5.4.1 인그레스 리소스 생성
- 5.4.2 인그레스로 서비스 액세스
- 5.4.3 하나의 인그레스로 여러 서비스 노출
- 5.4.4 TLS 트래픽을 처리하도록 인그레스 구성
- 5.5 파드가 연결을 수락할 준비가 됐을 때 신호 보내기
- 5.5.1 레디니스 프로브 소개
- 5.5.2 파드에 레디니스 프로브 추가
- 5.5.3 실제 환경에서 레디니스 프로브가 수행해야 하는 기능
- 5.6 헤드리스 서비스로 개별 파드 찾기
- 5.6.1 헤드리스 서비스 생성
- 5.6.2 DNS로 파드 찾기
- 5.6.3 모든 파드 검색 - 준비되지 않은 파드도 포함
- 5.7 서비스 문제 해결
- 5.8 요약
- 6장. 볼륨: 컨테이너에 디스크 스토리지 연결
- 6.1 볼륨 소개
- 6.1.1 예제의 볼륨 설명
- 6.1.2 사용 가능한 볼륨 유형 소개
- 6.2 볼륨을 사용한 컨테이너 간 데이터 공유
- 6.2.1 emptyDir 볼륨 사용
- 6.2.2 깃 리포지터리를 볼륨으로 사용하기
- 6.3 워커 노드 파일시스템의 파일 접근
- 6.3.1 hostPath 볼륨 소개
- 6.3.2 hostPath 볼륨을 사용하는 시스템 파드 검사하기
- 6.4 퍼시스턴트 스토리지 사용
- 6.4.1 GCE 퍼시스턴트 디스크를 파드 볼륨으로 사용하기
- 6.4.2 기반 퍼시스턴트 스토리지로 다른 유형의 볼륨 사용하기
- 6.5 기반 스토리지 기술과 파드 분리
- 6.5.1 퍼시스턴트볼륨과 퍼시스턴트볼륨클레임 소개
- 6.5.2 퍼시스턴트볼륨 생성
- 6.5.3 퍼시스턴트볼륨클레임 생성을 통한 퍼시스턴트볼륨 요청
- 6.5.4 파드에서 퍼시스턴트볼륨클레임 사용하기
- 6.5.5 퍼시스턴트볼륨과 퍼시스턴트볼륨클레임 사용의 장점 이해하기
- 6.5.6 퍼시스턴트볼륨 재사용
- 6.6 퍼시스턴트볼륨의 동적 프로비저닝
- 6.6.1 스토리지클래스 리소스를 통한 사용 가능한 스토리지 유형 정의하기
- 6.6.2 퍼시스턴트볼륨클레임에서 스토리지 클래스 요청하기
- 6.6.3 스토리지 클래스를 지정하지 않은 동적 프로비저닝
- 6.7 요약
- 7장. 컨피그맵과 시크릿: 애플리케이션 설정
- 7.1 컨테이너화된 애플리케이션 설정
- 7.2 컨테이너에 명령줄 인자 전달
- 7.2.1 도커에서 명령어와 인자 정의
- 7.2.2 쿠버네티스에서 명령과 인자 재정의
- 7.3 컨테이너의 환경변수 설정
- 7.3.1 컨테이너 정의에 환경변수 지정
- 7.3.2 변숫값에서 다른 환경변수 참조
- 7.3.3 하드코딩된 환경변수의 단점
- 7.4 컨피그맵으로 설정 분리
- 7.4.1 컨피그맵 소개
- 7.4.2 컨피그맵 생성
- 7.4.3 컨피그맵 항목을 환경변수로 컨테이너에 전달
- 7.4.4 컨피그맵의 모든 항목을 한 번에 환경변수로 전달
- 7.4.5 컨피그맵 항목을 명령줄 인자로 전달
- 7.4.6 컨피그맵 볼륨을 사용해 컨피그맵 항목을 파일로 노출
- 7.4.7 애플리케이션을 재시작하지 않고 애플리케이션 설정 업데이트
- 7.5 시크릿으로 민감한 데이터를 컨테이너에 전달
- 7.5.1 시크릿 소개
- 7.5.2 기본 토큰 시크릿 소개
- 7.5.3 시크릿 생성
- 7.5.4 컨피그맵과 시크릿 비교
- 7.5.5 파드에서 시크릿 사용
- 7.5.6 이미지를 가져올 때 사용하는 시크릿 이해
- 7.6 요약
- 8장. 애플리케이션에서 파드 메타데이터와 그 외의 리소스에 액세스하기
- 8.1 Downward API로 메타데이터 전달
- 8.1.1 사용 가능한 메타데이터 이해
- 8.1.2 환경변수로 메타데이터 노출하기
- 8.1.3 downwardAPI 볼륨에 파일로 메타데이터 전달
- 8.2 쿠버네티스 API 서버와 통신하기
- 8.2.1 쿠버네티스 REST API 살펴보기
- 8.2.2 파드 내에서 API 서버와 통신
- 8.2.3 앰배서더 컨테이너를 이용한 API 서버 통신 간소화
- 8.2.4 클라이언트 라이브러리를 사용해 API 서버와 통신
- 8.3 요약
- 9장. 디플로이먼트: 선언적 애플리케이션 업데이트
- 9.1 파드에서 실행 중인 애플리케이션 업데이트
- 9.1.1 오래된 파드를 삭제하고 새 파드로 교체
- 9.1.2 새 파드 기동과 이전 파드 삭제
- 9.2 레플리케이션컨트롤러로 자동 롤링 업데이트 수행
- 9.2.1 애플리케이션의 초기 버전 실행
- 9.2.2 kubectl을 이용한 롤링 업데이트
- 9.2.3 kubectl rolling-update를 더 이상 사용하지 않는 이유
- 9.3 애플리케이션을 선언적으로 업데이트하기 위한 디플로이먼트 사용하기
- 9.3.1 디플로이먼트 생성
- 9.3.2 디플로이먼트 업데이트
- 9.3.3 디플로이먼트 롤백
- 9.3.4 롤아웃 속도 제어
- 9.3.5 롤아웃 프로세스 일시 중지
- 9.3.6 잘못된 버전의 롤아웃 방지
- 9.4 요약
- 10장. 스테이트풀셋: 복제된 스테이트풀 애플리케이션 배포하기
- 10.1 스테이트풀 파드 복제하기
- 10.1.1 개별 스토리지를 갖는 레플리카 여러 개 실행하기
- 10.1.2 각 파드에 안정적인 아이덴티티 제공하기
- 10.2 스테이트풀셋 이해하기
- 10.2.1 스테이트풀셋과 레플리카셋 비교하기
- 10.2.2 안정적인 네트워크 아이덴티티 제공하기
- 10.2.3 각 스테이트풀 인스턴스에 안정적인 전용 스토리지 제공하기
- 10.2.4 스테이트풀셋 보장 이해하기
- 10.3 스테이트풀셋 사용하기
- 10.3.1 애플리케이션과 컨테이너 이미지 생성하기
- 10.3.2 스테이트풀셋을 통한 애플리케이션 배포하기
- 10.3.3 파드 가지고 놀기
- 10.4 스테이트풀셋의 피어 디스커버리
- 10.4.1 DNS를 통한 피어 디스커버리
- 10.4.2 스테이트풀셋 업데이트
- 10.4.3 클러스터된 데이터 저장소 사용하기
- 10.5 스테이트풀셋이 노드 실패를 처리하는 과정 이해하기
- 10.5.1 노드의 네트워크 연결 해제 시뮬레이션
- 10.5.2 수동으로 파드 삭제하기
- 10.6 요약
- 3부. 쿠버네티스 심화
- 11장. 쿠버네티스 내부 이해
- 11.1 아키텍처 이해
- 11.1.1 쿠버네티스 구성 요소의 분산 특성
- 11.1.2 쿠버네티스가 etcd를 사용하는 방법
- 11.1.3 API 서버의 기능
- 11.1.4 API 서버가 리소스 변경을 클라이언트에 통보하는 방법 이해
- 11.1.5 스케줄러 이해
- 11.1.6 컨트롤러 매니저에서 실행되는 컨트롤러 소개
- 11.1.7 Kubelet이 하는 일
- 11.1.8 쿠버네티스 서비스 프록시의 역할
- 11.1.9 쿠버네티스 애드온 소개
- 11.1.10 모든 것을 함께 가져오기
- 11.2 컨트롤러가 협업하는 방법
- 11.2.1 관련된 구성 요소 이해
- 11.2.2 이벤트 체인
- 11.2.3 클러스터 이벤트 관찰
- 11.3 실행 중인 파드에 관한 이해
- 11.4 파드 간 네트워킹
- 11.4.1 네트워크는 어떤 모습이어야 하는가
- 11.4.2 네트워킹 동작 방식 자세히 알아보기
- 11.4.3 컨테이너 네트워크 인터페이스 소개
- 11.5 서비스 구현 방식
- 11.5.1 kube-proxy 소개
- 11.5.2 kube-proxy가 iptables를 사용하는 방법
- 11.6 고가용성 클러스터 실행
- 11.6.1 애플리케이션 가용성 높이기
- 11.6.2 쿠버네티스 컨트롤 플레인 구성 요소의 가용성 향상
- 11.7 요약
- 12장. 쿠버네티스 API 서버 보안
- 12.1 인증 이해
- 12.1.1 사용자와 그룹
- 12.1.2 서비스어카운트 소개
- 12.1.3 서비스어카운트 생성
- 12.1.4 파드에 서비스어카운트 할당
- 12.2 역할 기반 액세스 제어로 클러스터 보안
- 12.2.1 RBAC 인가 플러그인 소개
- 12.2.2 RBAC 리소스 소개
- 12.2.3 롤과 롤바인딩 사용
- 12.2.4 클러스터롤과 클러스터롤바인딩 사용하기
- 12.2.5 디폴트 클러스터롤과 클러스터롤바인딩의 이해
- 12.2.6 인가 권한을 현명하게 부여하기
- 12.3 요약
- 13장. 클러스터 노드와 네트워크 보안
- 13.1 파드에서 호스트 노드의 네임스페이스 사용
- 13.1.1 파드에서 노드의 네트워크 네임스페이스 사용
- 13.1.2 호스트 네트워크 네임스페이스를 사용하지 않고 호스트 포트에 바인딩
- 13.1.3 노드의 PID와 IPC 네임스페이스 사용
- 13.2 컨테이너의 보안 컨텍스트 구성
- 13.2.1 컨테이너를 특정 사용자로 실행
- 13.2.2 컨테이너가 루트로 실행되는 것 방지
- 13.2.3 특권 모드에서 파드 실행
- 13.2.4 컨테이너에 개별 커널 기능 추가
- 13.2.5 컨테이너에서 기능 제거
- 13.2.6 프로세스가 컨테이너의 파일시스템에 쓰는 것 방지
- 13.2.7 컨테이너가 다른 사용자로 실행될 때 볼륨 공유
- 13.3 파드의 보안 관련 기능 사용 제한
- 13.3.1 PodSecurityPolicy 리소스 소개
- 13.3.2 runAsUser, fsGroup, supplementalGroups 정책
- 13.3.3 allowed, default, disallowed 기능 구성
- 13.3.4 파드가 사용할 수 있는 볼륨 유형 제한
- 13.3.5 각각의 사용자와 그룹에 다른 PodSecurityPolicies 할당
- 13.4 파드 네트워크 격리
- 13.4.1 네임스페이스에서 네트워크 격리 사용
- 13.4.2 네임스페이스의 일부 클라이언트 파드만 서버 파드에 연결하도록 허용
- 13.4.3 쿠버네티스 네임스페이스 간 네트워크 격리
- 13.4.4 CIDR 표기법으로 격리
- 13.4.5 파드의 아웃바운드 트래픽 제한
- 13.5 요약
- 14장. 파드의 컴퓨팅 리소스 관리
- 14.1 파드 컨테이너의 리소스 요청
- 14.1.1 리소스 요청을 갖는 파드 생성하기
- 14.1.2 리소스 요청이 스케줄링에 미치는 영향
- 14.1.3 CPU 요청이 CPU 시간 공유에 미치는 영향
- 14.1.4 사용자 정의 리소스의 정의와 요청
- 14.2 컨테이너에 사용 가능한 리소스 제한
- 14.2.1 컨테이너가 사용 가능한 리소스 양을 엄격한 제한으로 설정
- 14.2.2 리소스 제한 초과
- 14.2.3 컨테이너의 애플리케이션이 제한을 바라보는 방법
- 14.3 파드 QoS 클래스 이해
- 14.3.1 파드의 QoS 클래스 정의
- 14.3.2 메모리가 부족할 때 어떤 프로세스가 종료되는지 이해
- 14.4 네임스페이스별 파드에 대한 기본 요청과 제한 설정
- 14.4.1 LimitRange 리소스 소개
- 14.4.2 LimitRange 오브젝트 생성하기
- 14.4.3 강제 리소스 제한
- 14.4.4 기본 리소스 요청과 제한 적용
- 14.5 네임스페이스의 사용 가능한 총 리소스 제한하기
- 14.5.1 리소스쿼터 오브젝트 소개
- 14.5.2 퍼시스턴트 스토리지에 관한 쿼터 지정하기
- 14.5.3 생성 가능한 오브젝트 수 제한
- 14.5.4 특정 파드 상태나 QoS 클래스에 대한 쿼터 지정
- 14.6 파드 리소스 사용량 모니터링
- 14.6.1 실제 리소스 사용량 수집과 검색
- 14.6.2 기간별 리소스 사용량 통계 저장 및 분석
- 14.7 요약
- 15장. 파드와 클러스터 노드의 오토스케일링
- 15.1 수평적 파드 오토스케일링
- 15.1.1 오토스케일링 프로세스 이해
- 15.1.2 CPU 사용률 기반 스케일링
- 15.1.3 메모리 소비량에 기반을 둔 스케일링
- 15.1.4 기타 및 사용자 정의 메트릭 기반 스케일링
- 15.1.5 오토스케일링에 적합한 메트릭 결정
- 15.1.6 레플리카를 0으로 감소
- 15.2 수직적 파드 오토스케일링
- 15.2.1 리소스 요청 자동 설정
- 15.2.2 파드가 실행되는 동안 리소스 요청 수정
- 15.3 수평적 클러스터 노드 확장
- 15.3.1 클러스터 오토스케일러 소개
- 15.3.2 클러스터 오토스케일러 활성화
- 15.3.3 클러스터 스케일 다운 동안에 서비스 중단 제한
- 15.4 요약
- 16장. 고급 스케줄링
- 16.1 테인트와 톨러레이션을 사용해 특정 노드에서 파드 실행 제한
- 16.1.1 테인트와 톨러레이션 소개
- 16.1.2 노드에 사용자 정의 테인트 추가하기
- 16.1.3 파드에 톨러레이션 추가
- 16.1.4 테이트와 톨러레이션의 활용 방안 이해
- 16.2 노드 어피니티를 사용해 파드를 특정 노드로 유인하기
- 16.2.1 하드 노드 어피니티 규칙 지정
- 16.2.2 파드의 스케줄링 시점에 노드 우선순위 지정
- 16.3 파드 어피니티와 안티-어피니티를 이용해 파드 함께 배치하기
- 16.3.1 파드 간 어피니티를 사용해 같은 노드에 파드 배포하기
- 16.3.2 동일한 랙, 가용 영역 또는 리전에 파드 배포
- 16.3.3 필수 요구 사항 대신 파드 어피니티 선호도 표현하기
- 16.3.4 파드 안티-어피니티를 사용해 파드들이 서로 떨어지게 스케줄링하기
- 16.4 요약
- 17장. 애플리케이션 개발을 위한 모범 사례
- 17.1 모든 것을 하나로 모아 보기
- 17.2 파드 라이프사이클 이해
- 17.2.1 애플리케이션이 종료되고 파드 재 배치 예상하기
- 17.2.2 종료된 파드 또는 부분적으로 종료된 파드를 다시 스케줄링하기
- 17.2.3 원하는 순서로 파드 시작
- 17.2.4 라이프사이클 훅 추가
- 17.2.5 파드 셧다운 이해하기
- 17.3 모든 클라이언트 요청의 적절한 처리 보장
- 17.3.1 파드가 시작될 때 클라이언트 연결 끊기 방지
- 17.3.2 파드 셧다운 동안 연결 끊어짐 방지
- 17.4 쿠버네티스에서 애플리케이션을 쉽게 실행하고 관리할 수 있게 만들기
- 17.4.1 관리 가능한 컨테이너 이미지 만들기
- 17.4.2 이미지에 적절한 태그를 지정하고 imagePullPolicy를 현명하게 사용
- 17.4.3 일차원 레이블 대신 다차원 레이블 사용
- 17.4.4 어노테이션으로 각 리소스 설명
- 17.4.5 프로세스가 종료된 원인에 대한 정보 제공
- 17.4.6 애플리케이션 로깅 처리
- 17.5 개발 및 테스트 모범사례
- 17.5.1 개발 중 쿠버네티스 외부에서 애플리케이션 실행
- 17.5.2 개발 중 Minikube 사용
- 17.5.3 버전 관리 및 자동 배포 리소스 매니페스트
- 17.5.4 YAML/JSON 매니페스트 대안으로 Ksonnet 소개
- 17.5.5 지속적 통합과 지속적 배포
- 17.6 요약
- 18장. 쿠버네티스의 확장
- 18.1 사용자 정의 API 오브젝트 정의
- 18.1.1 CustomResourceDefinition 소개
- 18.1.2 사용자 정의 컨트롤러로 사용자 정의 리소스 자동화
- 18.1.3 사용자 정의 오브젝트 유효성 검증
- 18.1.4 사용자 정의 오브젝트를 위한 사용자 정의 API 서버 제공
- 18.2 쿠버네티스 서비스 카탈로그를 통한 쿠버네티스 확장
- 18.2.1 서비스 카탈로그 소개
- 18.2.2 서비스 카탈로그 API 서버 및 컨트롤러 매니저 소개
- 18.2.3 Service Broker와 OpenServiceBroker API 소개
- 18.2.4 프로비저닝과 서비스 사용
- 18.2.5 바인딩 해제와 프로비저닝 해제
- 18.2.6 서비스 카탈로그의 이점 이해
- 18.3 쿠버네티스 기반 플랫폼
- 18.3.1 레드햇 오픈시프트 컨테이너 플랫폼
- 18.3.2 Deis Workflow and Helm
- 18.4 요약
- 부록 A. 다중 클러스터 환경에서 kubectl 사용하기
- 부록 B. kubeadm을 사용한 다중 노드 클러스터 설정하기
- 부록 C. 다른 컨테이너 런타임 사용하기
- 부록 D. 클러스터 페더레이션
- 책에서 다루는 쿠버네티스 리소스
도서 오류 신고
정오표
정오표
[p.118 : 아래서 10행]
같은 파드에 있다며,
->
같은 파드에 있다면,
[p.274 : 코드 1행]
$ kubectl get pod s
->
$ kubectl get pods
[p.421 : 그림 9.13]
maxUnavailable=0
->
maxUnavailable=1