Steady Seller

[그림과 상세한 설명으로 명확하게 이해하는]
쿠버네티스 인 액션 (재출간판)

  • 원서명Kubernetes in Action (ISBN 9781617293726)
  • 지은이마르코 룩샤(Marko Lukša)
  • 옮긴이강인호, 황주필, 이원기, 임찬식
  • ISBN : 9791161754048
  • 45,000원
  • 2020년 03월 31일 펴냄
  • 페이퍼백 | 844쪽 | 188*235mm
  • 시리즈 : 소프트웨어 아키텍처, 오픈소스 프로그래밍

책 소개

요약

쿠버네티스를 이용해 애플리케이션을 효과적으로 개발하고 운영할 수 있는 방법을 초보자도 쉽게 이해할 수 있도록 설명한다. 쿠버네티스 아키텍처와 각 객체의 개념을 명확히 정립할 수 있도록 예제와 그림을 곁들였다. 후반부에는 쿠버네티스의 내부 구조 및 동작 원리도 쉽게 설명하고 있어 쿠버네티스의 안팎을 모두 살필 수 있다.

추천의 글

“권위 있고 철저하다. 분산되고 확장 가능한 애플케이션의 전체 라이프사이클을 관리하는 방법을 실습 위주로 설명한다.”
- 안토니오 마그나히(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 명령줄 도구를 사용하는 법을 배우게 될 것이다.

저자/역자 소개

지은이의 말

레드햇에서 몇 년 동안 근무하다 2014년 말 새로 생긴 클라우드 지원(Cloud Enablement) 팀에 배정됐다. 임무는 회사의 미들웨어 제품군을 쿠버네티스상에서 개발된 오픈시프트(OpenShift) 컨테이너 플랫폼으로 변경하는 것이었다. 당시 쿠버네티스는 정식으로 발표되지 않은 초기 버전(1.0)이었다.
소프트웨어의 적절한 방향을 설정하고 쿠버네티스가 제공하는 기능을 이용하려면 쿠버네티스의 모든 기능을 신속하게 파악해야 했다. 문제가 발생하면 우리가 잘못한 건지 아니면 쿠버네티스 초기 버전의 버그인지를 구분하기가 어려웠다.
그 후 쿠버네티스는 눈부시게 발전했고 나도 쿠버네티스를 많이 이해하게 됐다. 나는 쿠버네티스라는 말조차 생소할 때부터 쿠버네티스를 사용하기 시작했다. 지금은 클라우드와 온프레미스(on-premises) 데이터 센터에서 애플리케이션을 실행하는 데 가장 빠르게 성장하고 가장 많이 사용하는 방법으로, 소프트웨어 엔지니어라면 모르는 사람이 없을 정도다.
쿠버네티스를 접한 지 한 달쯤 뒤 오픈시프트/쿠버네티스에서 JBoss 와일드플라이(WildFly) 애플리케이션 서버 클러스터를 실행하는 방법을 두 개의 글로 작성해 블로그에 올렸다. 당시 블로그 글을 보고 매닝출판사 담당자가 쿠버네티스에 관한 책을 써 달라고 연락하리라고는 상상도 못했다. 내가 아니더라도 책을 쓸 만한 누군가에게 연락했을 그 제안을 나는 거절하지 않았다.
그렇게 이 책을 쓰게 됐다. 1년 반 넘게 글쓰기와 연구에 매진한 끝에 마침표를 찍었다. 굉장히 값진 경험이었다. 그저 사용자로서 배울 때보다 책을 쓰면서 쿠버네티스를 훨씬 더 자세히 알 수 있었다. 이 과정에서 쿠버네티스에 관한 지식이 확장됐고, 쿠버네티스도 진화했으므로 이전에 썼던 내용을 고치고 다듬어야 했다. 나는 완벽주의자다. 이 책에 만족하지 않는다. 그럼에도 MEAP(Manning Early Access Program) 프로그램의 수많은 독자가 이 책을 쿠버네티스를 향한 훌륭한 안내서로 평가해줘서 기쁘다.
내 목표는 독자가 기술 자체를 이해하고 도구를 사용해 쿠버네티스 클러스터에 효과적이고 효율적으로 애플리케이션을 개발해 배포하는 방법을 가르치는 데 있다. 이 책은 실제로 적정 수준의 가용성을 갖는 쿠버네티스 클러스터를 구성하거나 운영하는 것에 중점을 두지 않는다. 그러나 마지막 3부에서는 클러스터의 상세 구성과 클러스터를 다루는 추가 리소스를 독자들이 이해하기 쉽게 작성했다.
쿠버네티스라는 굉장한 시스템으로 최대한의 결과를 얻는 방법을 알아가면서 즐거움을 느끼길 바란다.

지은이 소개

마르코 룩샤(Marko Lukša)

간단한 웹 애플리케이션에서부터 전체 ERP 시스템, 프레임워크, 미들웨어 소프트웨어에 이르기까지 개발 경력만 20년 이상인 전문 소프트웨어 엔지니어다. 1985년 여섯 살 때 아버지가 사준 중고 ZX 스펙트럼 컴퓨터로 프로그래밍에 첫발을 내디뎠다. 초등학교에서는 로고 프로그래밍 대회에서 전국 챔피언이 됐고 여름 코딩 캠프에 참석해 파스칼 프로그래밍을 배웠다. 이후 다양한 프로그래밍 언어를 사용해 소프트웨어를 개발했다.
웹이 상대적으로 성숙하지 않았던 고등학생 때 동적 웹사이트를 만들기 시작했다. 그 후 슬로베니아 류블랴나대학교(University of Ljubljana)에서 컴퓨터 과학을 공부하면서 지역 기업의 의료와 통신 산업용 소프트웨어 개발로 분야를 옮겼다. 마침내 JBoss 미들웨어 제품을 기반으로 한 구글 앱 엔진 API를 오픈소스로 구현하면서 레드햇에서 일하게 됐다. 아울러 CDI/Weld, Infinispan/JBoss Data-Grid 등의 프로젝트에도 참여했다.
2014년 말부터 레드햇의 클라우드 지원 팀에서 근무하고 있다. 쿠버네티스의 새로운 개발 관련 기술에 대한 최신 정보를 유지하고, 회사의 미들웨어 소프트웨어가 쿠버네티스와 오픈시프트의 기능을 최대한 활용할 수 있도록 보장하는 업무를 맡고 있다.

옮긴이의 말

2014년 구글이 쿠버네티스를 발표한 이래 쿠버네티스는 빠른 속도로 가장 인기 있는 기술 가운데 하나로 떠올랐다.
비즈니스 민첩성이 점점 더 강조되는 컴퓨팅 환경에서 마이크로서비스 아키텍처(MSA)는 사실상(de facto) 표준이 됐고 MSA 환경을 구현하기에 가장 적합한 기술로써 쿠버네티스가 최근 각광을 받고 있다.
이뿐만 아니라 쿠버네티스는 IoT 환경에서의 에지 컴퓨팅 영역, 데이터 과학 분야에서 머신러닝 workflow 배포(kubeflow) 지원 영역, 5G에서 통신 인프라의 가상화(VNF, Virtual Network Function) 영역, 나아가 하이브리드 또는 멀티 클라우드를 지원하기 위한 핵심 기술로 다양한 분야에서 도입, 활용되고 있다.
이런 뜨거운 열기를 반영하듯 꽤 많은 책이 출간, 번역되고 있음에도 조금은 때가 지난 것 같은 이 책의 재출간판 작업을 맡게 된 이유는 우선 저자의 적절한 시각화와 은유를 섞은 개념 설명에 매료됐고, 여러 사례를 기반한 상황 설정과 설명을 뒷받침하는 실습 그리고 쿠버네티스의 내부 구조에 대한 상세한 설명과 멀티 클라우드와 쿠버네티스 확장까지 아우르는 탄탄한 구성 등으로 가히 쿠버네티스 분야의 바이블이라 할 만한 책이기 때문이다. 이 책의 번역자들은 ‘Kubernetes Korea Group’에서 이 책을 기반으로 한 스터디 모임인 ‘100일간의 kubernetes architecture 여행’의 스터디 멤버들로 구성됐으며, 재출간판에 맞춰 최대한 독자의 입장에서 쉽고 부드럽게 읽히도록 노력했다. 용어는 최대한 쿠버네티스 한글화 팀의 용어집을 따르려 노력했고, 예제가 최신 버전의 쿠버네티스에서 실행하는 데 문제가 없는지 확인했으며, 독자의 이해를 돕기 위해 다양한 주석을 추가했다.
원서가 전체적으로 매끄럽게 구성돼 있지만, 개념을 설명하는 부분에서 번역으로 전달하기 어려운 미묘한 부분이 많았고 이런 부분을 우리말로 전달하기 위해 꽤나 많은 공을 들였다. 부디 부드럽고 매끄럽게 읽을 수 있었다는 평을 들을 수 있다면 번역자로서 더할 나위 없이 보람 있을 것 같다.

옮긴이 소개

강인호

개발자로 IT 경력을 시작해 EnSOA와 티맥스소프트를 거치면서 CBD & SOA 방법론 컨설팅을 했다. 오라클에서는 클라우드 네이티브, 컨테이너 네이티브 애플리케이션 개발과 운영을 도우며 개발자 생태계를 지원하고 소통하는 역할을 하고 있다. 최근 머신러닝에도 많은 관심을 갖고 있다.

황주필

개발자로 시작해 BEA Systems, Oracle 등에서 소프트웨어 아키텍트, 엔지니어로 일했다. 수많은 기업에서 기업용 소프트웨어 지원과 비즈니스 적용을 도왔다. 컨테이너에 관심이 많아 쿠버네티스 생태계에 참여하고 있으며 클라우드 네이티브 애플리케이션 개발과 운영을 돕고 있다. 현재 피보탈(Pivotal Software)에서 플랫폼 아키텍트로 일하며, 수많은 고객이 클라우드와 마이크로서비스 아키텍처로 디지털 트랜스포메이션을 성공적으로 하도록 돕고 있다. 주요 번역서는 『코틀린 마이크로서비스 개발』(에이콘, 2019)과 『쿠버네티스로 만나는 손안의 마이크로서비스』(에이콘, 2020)가 있다.

이원기

여러 삼성 관계사 웹 기반 서비스를 구현하기 위한 인프라 엔지니어로 시작해 H/W, O/S, 미들웨어 등 인프라 전반을 아우르는 경험을 쌓았다. 이후 SDS 클라우드 서비스의 쿠버네티스 기반 시스템을 운영하며 컨테이너와 쿠버네티스에 관심을 갖게 됐다. 현재 클라우드 기술 전문 조직에서 장애 지원과 기술 전문가 역할을 하고 있다. 업계의 변화를 지각하며 클라우드 네이티브를 위한 다양한 기술 분야에 관심을 갖고 있다.

임찬식

백엔드 개발자다. 주로 시스템 인프라를 모니터링하는 서비스 개발 및 데이터 분석 관련 프로젝트를 진행해왔다. 머신러닝 기반 서비스를 효율적으로 제공하기 위해 쿠버네티스와 컨테이너를 적극 도입하고, 프로메테우스와 그라파나를 이용한 통합 모니터링 환경을 구축했다. 쿠버네티스 클러스터를 리눅스 환경에서 직접 구축하며 경험했던 문제점과 해결 방법을 다양한 밋업에서 공유했다. 현재 넥스클라우드에서 쿠버네티스와 프로메테우스를 활용한 모니터링 프로젝트를 진행하고 있다.

목차

목차
  • 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.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

[p.118 : 아래서 10행]
같은 파드에 있다며,
->
같은 파드에 있다면,

[p.274 : 코드 1행]
$ kubectl get pod s
->
$ kubectl get pods

[p.421 : 그림 9.13]
maxUnavailable=0
->
maxUnavailable=1