샘플 코드 가져오기 GitHub 저장소를 복제한 후 실습에 필요한 디렉터리로 변경하고 작업 중인 항목을 확인
deployment : 배포 매니페스트
ngix : nginx 구성 파일
pods : 포드 매니페스트
services : 서비스 매니페스트
tls : TLS 인증서
cleanup.sh : 정리 스크립트
GitHub 저장소 복제실습에 필요한 디렉터리로 변경하고 작업 중인 항목 확인
Quick Kubernetes Demo
Kubernetes는 kubectl 실행 및 노출 명령을 사용해 즉시 사용하기 쉬운 워크플로우를 지원
kubectl create 명령을 사용해 nginx 컨테이너의 단일 인스턴스를 시작해 배포 Deployment 생성
배포 Deployment 생성
Kubernetes에서 모든 컨테이너는 포드에서 실행되므로 포드에서 실행 중인 nginx 컨테이너 보기
실행 중인 nginx 컨테이너
nginx 컨테이너를 Kubernetes 외부에 노출하기 Kubernetes는 공개 IP 주소가 연결된 외부 로드 밸런서를 생성하고 해당 공용 IP 주소에 도달한 모든 클라이언트는 서비스 뒤의 nginx 포드로 라우팅되게 됨
외부 로드 밸런서 생성
서비스 나열하기
Kubernetes 클러슽와 ngix 로드밸런서 서비스
외부 IP를 추가하여 ngix 컨테이너를 원격으로 실행하기
원격으로 실행
Pods
Kubernetes의 핵심에는 Pod가 존재하며, Pod는 하나 이상의 컨테이너 컬렉션을 나타내고 보유함 일반적으로 서로에 대한 종속성이 강한 여러 컨테이너가 있는 경우 컨테이너를 단일 포드 안에 패키징함
Pod에는 Volumes도 있으며 볼륨은 포드가 살아있는 동안 지속되는 데이터 디스크이며 해당 포드의 컨테이너에서 사용 포드는 콘텐츠에 대한 공유 네임 스페이스를 제공하므로 포드 내부의 두 컨테이너는 서로 통신하며 연결된 볼륨 공유도 가능
예) monolith와 nginx가 포함된 포드 monolith와 nginx가 포함된 포드는 하나의 IP를 가지며, monolith와 ngix는 공유 네임 스페이스를 가지므로 서로 통신할 수 있고 연결된 볼륨인 GCE, iSCSI, NFS 도 공유 가능
Creating pods
포드 구성 파일을 사용해서 포드를 생성하기 위해 모놀리스 포드 구성 파일 살펴보기 monolith 포드 구성 파일을 사용하며 이 파일을 살펴봄 포드는 하나의 컨테이너로 구성되며 컨테이너가 시작될 때 몇 가지 파라미터를 컨테이너에 전달함 또한 http 트래픽을 위해 포트 80을 열음
포드 구성 파일을 사용해 모놀리스 포드 생성
포드 구성 파일 확인 후 모놀리스 포드 생성
포드를 검사 기본 네임스페이스에서 실행 중인 모든 포드를 나열함
방금 생성된 모놀리스 포드 확인 가능
모노리스 포드에 대한 자세한 정보 살펴보기 Pod IP 주소 및 이벤트 로그를 포함해 모놀리스 Pod에 대한 많은 정보를 얻을 수 있음
모놀리스 포드 정보
Interacting with pods
기본적으로 포드에는 사설 IP 주소가 할당되며 클러스터 외부에서 연결할 수 없음
두 번째 터미널에서 로컬 포트를 모놀리스 포드 내부의 포트에 매핑 두 번째 터미널에서 kubectl port-forward 명령을 실행해 포트 전달을 설정하여 로컬 포트를 모놀리스 포드 내부의 포트에 매핑
로컬 포트를 모놀리스 포드 내부의 포트에 매핑 (10080 -> 80)
첫 번째 터미널에서 포드와 대화 시작 첫 번째 터미널에서 curl 명령을 실행해 포드와 대화를 시작
포드와 대화 (80 -> 10080)
보안 엔드포인트에 도달해보기
보안 엔드포인트 도달 실패
로그인을 시도하여 모놀리스에서 인증 토큰 다시 발급받기 위해 로그인 프롬프트에서 비밀번호 "password"를 사용해 로그인 로그인하면 JWT 토큰이 인쇄됨
로그인 및 인증 보안 토큰을 발급 받음
긴 문자열 복사 처리를 위해 토큰에 대한 환경 변수를 생성하기 위해 호스트 암호에 "password"를 입력하기
토큰에 대한 환경 변수 생성
토큰을 사용해 보안 엔드포인트에 도달하기
보안 엔드포인트 도달 성공
모놀리스 포드의 로그 살펴보기
모놀리스 포드의 로그
세 번째 터미널을 열고 실시간으로 발생하는 로그 스트림 가져오기
실시간으로 발생하는 로그 스트림
첫 번째 터미널에서 모놀리스와 상호 작용하는 경우, 세 번째 터미널에서 로그가 업데이트 되는 것 살펴보기
첫 번째 터미널에서 모놀리스와 상호 작용업데이트된 로그
모놀리스 포드 내에서 대화형 셸 실행하기 컨테이너 내에서 문제를 해결할 때 유용함 예) 모놀리스 컨테이너에 셸이 있으면 ping 명령을 사용해 외부 연결 테스트 가능
대화형 셸 실행
대화형 셸 로그아웃
로그아웃
Services
포드는 영구적이지 않고 활성 상태, 준비 상태 확인 실패같은 여러 가지 이유로 중지되거나 시작될 수 있으며 이로 인해 문제 발생 이로 인해 다시 시작할 때 다른 IP 주소를 가지므로 포드 집합과 통신하려고 할 때 문제가 발생 이때 서비스는 포드에 안정적인 엔드포인트를 제공
서비스는 레이블을 사용해 작동하는 포드를 결정하므로 포드에 올바른 레이블이 있으면 자동으로 선택되어 서비스에 노출됨
서비스가 포드 세트에 제공하는 액세스 수준은 서비스 유형에 따라 다름
Cluster IP (내부) : 기본 유형은 이 서비스가 클러스터 내부에서만 볼 수 있음을 의미
NodePort : 클러스터의 각 노드에 외부에서 액세스할 수 있는 IP를 제공
LoadBalancer : 서비스에서 서비스 내의 노드로 트래픽을 전달하는 클라우드 공급자의 로드 밸런서 제공
Creating a service
서비스 생성 전 https 트래픽을 처리할 수 있는 보안 포드 생성 디렉터리를 변경한 후 모놀리스 서비스 구성 파일을 탐색하고 보안 모놀리스 포드 및 해당 구성 데이터를 작성함
디렉터리를 변경한 후 모놀리스 서비스 구성 파일을 탐색보안 모놀리스 포드 및 해당 구성 데이터를 작성
보안 모놀리스 포드를 외부에 노출하기 모놀리스 서비스 구성 파일을 탐색한 후 모놀리식 서비스 구성 파일에서 모놀리식 서비스 생성 모놀리스 서비스 구성 파일의 app:monolith와 secure:enabled는 레이블이 있는 모든 포드를 자동으로 찾고 노출되는데 사용 또한 이 파일은 포트 31000에서 ngix(포트 443)로 외부 트래픽을 전달하는 방법이므로 노드 포드를 노출해야 함
모놀리스 서비스 구성 파일 탐색 후 모놀리식 서비스 생성
노출된 노드 포트에서 모놀리스 서비스에 대한 트래픽을 허용 31000 포트에서 TCP 트래픽을 허용하는 방화벽 규칙을 생성
31000 포트에서 TCP 트래픽을 허용하는 방화벽 규칙 생성
포트 전달을 사용하지 않고 클러스터 외부에서 보안 모놀리스 서비스에 접속하기 노드 중 하나에 대한 외부 IP 주소를 가져온 후 모놀리스 서비스를 시도할 수 있으나 시간이 초과되게 되며 이를 뒤에서 해결
노드 중 하나에 대한 외부 IP 주소를 가져와 모놀리스 서비스 접속 시도
Adding labels to pods
모놀리스 서비스에 끝점이 없으므로 레이블 쿼리와 함께 kubectl get pods 명령 사용해 위의 문제 해결하기 모놀리스 레이블로 실행 중인 포드를 확인한 후 app:monolith 및 secure=enabled를 사용해 모놀리스 레이블로 실행 중인 포드를 확인하면 결과가 나타나지 않음 그러므로 레이블 쿼리를 사용해 누락된 레이블을 추가한 후 다시 위의 secure=enable을 살펴보아 레이블 업데이트 확인
secure=enabled 레이블 추가
포드에 올바른 레이블이 지정되었으므로 모놀리스 서비스에서 엔드포인트 목록을 확인
엔드포인트 목록 확인
노드를 하나 선택해 테스트하기
노드를 하나 선택해 테스트
Deploying applications with Kubernetes
프로덕션 환경에서 컨테이너를 확장하고 관리하기 위해서는 배포가 필요
배포는 실행 중인 포드 수가 사용자가 원하는 포드 수와 동일하도록 선언하는 방법
배포의 주요 이점은 포드 관리의 낮은 수준 세부 정보를 추상하하는 것이므로 이후에 배포는 복제본 세트를 사용해 포드 시작 및 중지를 관리할 수 있으며 포드를 업데이트하거나 확장해야 하는 경우에도 배포에서 처리하고 중단된 경우에도 배포에서 포드를 다시 시작하도록 처리
hello 앱, 복제본 3개
예) 포드는 생성된 노드의 수명과 연결되므로 Node3이 다운되면 새 포드를 수동으로 생성하고 노드를 찾는 대신, 배포에서 새 포드를 생성하고 Node2에서 시작
Creating deployments
모놀리스 앱을 세 개의 개별 조각으로 나눈 후, 각 서비스에 대해 하나씩 배포를 만들고 auth 및 hello 배포를 위한 내부 서비스와 frontend 배포를 위한 외부 서비스를 정의하며 마이크로 서비스와 상호 작용하도록 하여 각 부분을 독립적으로 확장하고 배포하도록 함
auth : 인증된 사용자에 대한 JWT 토큰을 생성
hello : 인증된 사용자를 환영함
frontend : auth 및 hello 서비스로 트래픽을 라우팅
auth 배포 구성 파일을 검사하고 시작 auth 배포 구성 파일은 1개의 복제본이 생성되고 인증 컨테이너 버전 2.0.0을 사용하고 있음 auth 배포를 생성하기 위해 kubectl create 명령을 실행하면 배포 매니패스트의 데이터를 준수하는 하나의 포드가 생성됨 즉, 복제본(replicas) 필드에 지정된 수를 변경하여 포드 수를 확장할 수 있음