시작하세요! 도커/쿠버네티스

친절한 설명으로 쉽게 이해하는 컨테이너 관리

쿠버네티스와 도커의 기본 사용 방법을 정확히 이해하는 것을 목표로 하고 있습니다!

도커 컨테이너는 애플리케이션을 배포하기 위한 새로운 패러다임을 제시하는 가상화 패러다임입니다. 컨테이너 자체는 사용하기 매우 쉽지만 이를 활용하고 관리하기는 결코 쉽지 않습니다. 이 책은 도커를 처음 접하는 개발자를 위한 도커 컨테이너와 이미지의 기본적인 개념을 먼저 설명한 뒤, 도커 컴포즈와 스웜 모드를 통해 컨테이너 애플리케이션을 YAML 파일로 작성하고 클러스터에서 배포하는 방법을 소개합니다. 나아가 도커 컨테이너, 도커 컴포즈, 스웜 모드에서 학습한 지식을 활용해 쿠버네티스의 기초 사용법, 다양한 쿠버네티스 오브젝트의 사용 방법 및 심화 개념까지 알아봅니다.

 

★ 이 책의 구성 ★

  • 도커의 기본 사용 방법을 익힘으로써 컨테이너의 기본 개념을 학습합니다. (1부 1장, 1부 2장)
  • 도커 스웜 모드를 통해 서버 클러스터링과 오케스트레이션의 기본 개념을 학습합니다. (1부 3장)
  • 도커 컴포즈를 통해 YAML 파일의 사용 방법 및 여러 개의 컨테이너를 다루는 방법을 학습합니다. (1부 4장)
  • 위 내용을 바탕으로 쿠버네티스로 운영 환경을 구축하기 위한 방법을 학습합니다. (2부 이후)

 

도서 상세 이미지

용찬호

데브시스터즈에서 컨테이너 인프라 관리를 맡고 있으며, 다양한 개발 과정에서 얻은 경험들을 공유하기 위해 자그마한 블로그(https://blog.naver.com/alice_k106)를 운영하고 있습니다. 최근에는 클라우드라는 분야에 종속되지 않고 네트워크, 빅데이터, 머신러닝 등 다양한 분야를 융합하기 위해 노력하고 있습니다. 그림, 음악 등에도 관심이 많아 클라우드와 예술 분야를 결합해 보고 싶다는 꿈을 가지고 있습니다.

  • ▣ 01: 도커란?
    • 1.1 가상 머신과 도커 컨테이너
    • 1.2 도커를 시작해야 하는 이유
      • 1.2.1 애플리케이이션의 개발과 배포가 편해집니다.
      • 1.2.2 여러 애플리케이션의 독립성과 확장성이 높아집니다.
    • 1.3 도커 엔진 설치
      • 1.3.1 도커 엔진의 종류 및 버전
      • 1.3.2 리눅스 도커 엔진 설치
      • 1.3.3 윈도우, 맥 OS에 도커 설치
      • 1.3.4 Docker Toolbox와 Docker for Windows/Mac의 차이점
      • 1.3.5 리눅스 환경에 도커 마련하기
    •  
  • ▣ 02: 도커 엔진
    • 2.1 도커 이미지와 컨테이너
      • 2.1.1 도커 이미지
      • 2.1.2 도커 컨테이너
    • 2.2 도커 컨테이너 다루기
      • 2.2.1 컨테이너 생성
      • 2.2.2 컨테이너 목록 확인
      • 2.2.3 컨테이너 삭제
      • 2.2.4 컨테이너를 외부에 노출
      • 2.2.5 컨테이너 애플리케이션 구축
      • 2.2.6 도커 볼륨
      • 2.2.7 도커 네트워크
      • 2.2.8 컨테이너 로깅
      • 2.2.9 컨테이너 자원 할당 제한
    • 2.3 도커 이미지
      • 2.3.1 도커 이미지 생성
      • 2.3.2 이미지 구조 이해
      • 2.3.3 이미지 추출
      • 2.3.4 이미지 배포
    • 2.4 Dockerfile
      • 2.4.1 이미지를 생성하는 방법
      • 2.4.2 Dockerfile 작성
      • 2.4.3 Dockerfile 빌드
      • 2.4.4 기타 Dockerfile 명령어
      • 2.4.5 Dockerfile로 빌드할 때 주의할 점
    • 2.5 도커 데몬
      • 2.5.1 도커의 구조
      • 2.5.2 도커 데몬 실행
      • 2.5.3 도커 데몬 설정
      • 2.5.4 도커 데몬 모니터링
      • 2.5.5 Remote API 라이브러리를 이용한 도커 사용
    •  
  • ▣ 03: 도커 스웜
    • 3.1 도커 스웜을 사용하는 이유
    • 3.2 스웜 클래식과 도커 스웜 모드
    • 3.3 스웜 모드
      • 3.3.1 도커 스웜 모드의 구조
      • 3.3.2 도커 스웜 모드 클러스터 구축
      • 3.3.3 스웜 모드 서비스
      • 3.3.4 도커 스웜 모드 노드 다루기
    •  
  • ▣ 04: 도커 컴포즈
    • 4.1 도커 컴포즈를 사용하는 이유
    • 4.2 도커 컴포즈 설치
    • 4.3 도커 컴포즈 사용
      • 4.3.1 도커 컴포즈 기본 사용법
      • 4.3.2 도커 컴포즈 활용
    •  
  • ▣ 05: 쿠버네티스 설치
    • 5.1 쿠버네티스 설치 환경의 종류
    • 5.2 쿠버네티스 버전 선택
    • 5.3 개발 용도의 쿠버네티스 설치
      • 5.3.1 Docker for Mac / Windows에서 쿠버네티스 사용
      • 5.3.2 Minikube로 쿠버네티스 설치
    • 5.4 여러 서버로 구성된 쿠버네티스 클러스터 설치
      • 5.4.1 kubeadm으로 쿠버네티스 설치
      • 5.4.2 kops로 AWS에서 쿠버네티스 설치
      • 5.4.3 구글 클라우드 플랫폼의 GKE로 쿠버네티스 사용하기
    •  
  • ▣ 06: 쿠버네티스 시작하기
    • 6.1 쿠버네티스를 시작하기 전에
    • 6.2 포드(Pod) : 컨테이너를 다루는 기본 단위
      • 6.2.1 포드 사용하기
      • 6.2.2 포드 vs. 도커 컨테이너
      • 6.2.3 완전한 애플리케이션으로서의 포드
    • 6.3 레플리카셋(Replica Set) : 일정 개수의 포드를 유지하는 컨트롤러
      • 6.3.1 레플리카셋을 사용하는 이유
      • 6.3.2 레플리카셋 사용하기
      • 6.3.3 레플리카셋의 동작 원리
      • 6.3.4 레플리케이션 컨트롤러 vs. 레플리카셋
    • 6.4 디플로이먼트(Deployment) : 레플리카셋, 포드의 배포를 관리
      • 6.4.1 디플로이먼트 사용하기
      • 6.4.2 디플로이먼트를 사용하는 이유
    • 6.5 서비스(Service) : 포드를 연결하고 외부에 노출
      • 6.5.1 서비스(Service)의 종류
      • 6.5.2 ClusterIP 타입의 서비스 - 쿠버네티스 내부에서만 포드에 접근하기
      • 6.5.3 NodePort 타입의 서비스 - 서비스를 이용해 포드를 외부에 노출하기
      • 6.5.4 클라우드 플랫폼의 로드 밸런서와 연동하기 - LoadBalancer 타입의 서비스
      • 6.5.5 트래픽의 분배를 결정하는 서비스 속성 : externalTrafficPolicy
      • 6.5.6 요청을 외부로 리다이렉트하는 서비스 : ExternalName
    •  
  • ▣ 07: 쿠버네티스 리소스의 관리와 설정
    • 7.1 네임스페이스(Namespace) : 리소스를 논리적으로 구분하는 장벽
    • 7.2 컨피그맵(Configmap), 시크릿(Secret) : 설정값을 포드에 전달
      • 7.2.1 컨피그맵(Configmap)
      • 7.2.2 시크릿(Secret)
    •  
  • ▣ 08: 인그레스(Ingress)
    • 8.1 인그레스를 사용하는 이유
    • 8.2 인그레스의 구조
    • 8.3 인그레스의 세부 기능 : annotation을 이용한 설정
    • 8.4 Nginx 인그레스 컨트롤러에 SSL/TLS 보안 연결 적용
    • 8.5 여러 개의 인그레스 컨트롤러 사용하기
    •  
  • ▣ 09: 퍼시스턴트 볼륨(PV)과 퍼시스턴트 볼륨 클레임(PVC)
    • 9.1 로컬 볼륨 : hostPath, emptyDir
      • 9.1.1 워커 노드의 로컬 디렉터리를 볼륨으로 사용 : hostPath
      • 9.1.2 포드 내의 컨테이너 간 임시 데이터 공유 : emptyDir
    • 9.2 네트워크 볼륨
    • 9.3 PV, PVC를 이용한 볼륨 관리
      • 9.3.1 퍼시스턴트 볼륨과 퍼시스턴트 볼륨 클레임을 사용하는 이유
      • 9.3.2 퍼시스턴트 볼륨과 퍼시스턴트 볼륨 클레임 사용하기
      • 9.3.3 퍼시스턴트 볼륨을 선택하기 위한 조건 명시
      • 9.3.4 퍼시스턴트 볼륨의 라이프사이클과 Reclaim Policy
      • 9.3.5 StorageClass와 Dynamic Provisioning
    •  
  • ▣ 10: 보안을 위한 인증과 인가 : ServiceAccount와 RBAC
    • 10.1 쿠버네티스의 권한 인증 과정
    • 10.2 서비스 어카운트와 롤(Role), 클러스터 롤(Cluster Role)
    • 10.3 쿠버네티스 API 서버에 접근
      • 10.3.1 서비스 어카운트의 시크릿을 이용해 쿠버네티스 API 서버에 접근
      • 10.3.2 클러스터 내부에서 kubernetes 서비스를 통해 API 서버에 접근
      • 10.3.3 쿠버네티스 SDK를 이용해 포드 내부에서 API 서버에 접근
    • 10.4 서비스 어카운트에 이미지 레지스트리 접근을 위한 시크릿 설정
    • 10.5 kubeconfig 파일에 서비스 어카운트 인증 정보 설정
    • 10.6 유저(User)와 그룹(Group)의 개념
    • 10.7 x509 인증서를 이용한 사용자 인증
    •  
  • ▣ 11: 애플리케이션 배포를 위한 고급 설정
    • 11.1 포드의 자원 사용량 제한
      • 11.1.1 컨테이너와 포드의 자원 사용량 제한 : Limit
      • 11.1.2 컨테이너와 포드의 자원 사용량 제한하기 : Request
      • 11.1.3 CPU 자원 사용량의 제한 원리
      • 11.1.4 QoS 클래스와 메모리 자원 사용량 제한 원리
      • 11.1.5 ResourceQuota와 LimitRanger
      • 11.1.6 ResourceQuota, LimitRanger의 원리 : Admission Controller
    • 11.2 쿠버네티스 스케줄링
      • 11.2.1 포드가 실제로 노드에 생성되기까지의 과정
      • 11.2.2 포드가 생성될 노드를 선택하는 스케줄링 과정
      • 11.2.3 NodeSelector와 Node Affinity, Pod Affinity
      • 11.2.4 Taints와 Tolerations 사용하기
      • 11.2.5 Cordon, Drain 및 PodDistributionBudget
      • 11.2.6 커스텀 스케줄러 및 스케줄러 확장
    • 11.3 쿠버네티스 애플리케이션 상태와 배포
      • 11.3.1 디플로이먼트를 통해 롤링 업데이트
      • 11.3.2 포드의 생애 주기(Lifecycle)
    •  
  • ▣ 12: 커스텀 리소스와 컨트롤러
    • 12.1 쿠버네티스 컨트롤러의 개념과 동작 방식
    • 12.2 커스텀 리소스에 대한 개념
    • 12.3 커스텀 리소스를 정의하기 위한 CRD(Custom Resource Definition)
    • 12.4 커스텀 리소스와 컨트롤러
    •  
  • ▣ 13: 포드를 사용하는 다른 오브젝트들
    • 13.1 잡(Jobs)
    • 13.2 데몬셋(DaemonSets)
    • 13.3 스테이트풀셋(StatefulSets)
    •  
  • ▣ 부록
    • 부록A: 도커 데몬 시작 옵션 변경하기
    • 부록B: 특정 버전의 도커 설치하기
    • 부록C: gcloud 명령어 설치하기
    • 부록D: AWS CLI 설치하기
  • 5쪽, 본문 2번째 줄

    구동시키는 방식을 모놀리스(Monilith) 애플리케이션이라고 합니다.

    ==>

    구동시키는 방식을 모놀리스(Monolith) 애플리케이션이라고 합니다.

  • 297쪽, 본문 1번째 줄의 아래 문장에 각주 3을 추가

    그중 포드의 IP 항목도 포함돼 있으며, 출력 결과에서 알 수 있듯이 포드의 IP는 172.17.0.4입니다.3


    3 이 IP는 예시이며, 쿠버네티스 설치 방법에 따라 IP 범위가 다를 수 있습니다.

  • 330쪽, 본문 2번째 줄의 아래 문장에 각주 7을 추가

    즉, 클러스터의 모든 노드에 내부 IP 또는 외부 IP를 통해 31514 포트로 접근하면 동일한 서비스에 연결할 수 있습니다.7


    7 아래의 예시처럼 내부 IP(Internal IP)로 접근하기 위해서는 클러스터 내부에 접속한 상태여야 합니다. 클러스터 내부에 접속하는 대신, 적절한 보안 그룹 또는 방화벽 규칙을 추가한 뒤 외부 IP(External IP)로 접속해 테스트할 수도 있습니다.

  • 337쪽, 그림 6.17을 다음 그림으로 교체

    그림 6.17

  • 340쪽, 그림 6.19를 다음 그림으로 교체

    그림 6.19

  • 350쪽, 페이지 중간의 kubectl 명령어 출력 결과를 다음 내용으로 변경

    $ kubectl api-resources --namespaced=false
    NAME                 SHORTNAMES  APIGROUP        NAMESPACED  KIND
    componentstatuses    cs                          false       ComponentStatus
    namespaces           ns                          false       Namespace
    nodes                no                          false       Node
    persistentvolumes    pv                          false       PersistentVolume
    ...
    storageclasses       sc          storage.k8s.io  false       StorageClass
    ...
    
  • 372쪽, 본문 5번째 줄

    앞서 작성한 kustomize.yaml 파일로부터

    ==>

    앞서 작성한 kustomization.yaml 파일로부터

  • 372쪽, 본문 7번째 줄

    kustomize.yaml 파일로부터

    ==>

    kustomization.yaml 파일로부터

  • 520쪽, 본문 밑에서 5번째 줄

    모든 노드의 호스트 이름은 동일하기 때문에

    ==>

    모든 노드의 호스트 이름은 고유하기 때문에