본문 바로가기

Personal/Cloud

구글 클라우드 스터디잼 쿠버네티스 입문 - 3. Kubernetes를 통한 클라우드 조정

[실습3 - Kubernetes를 통한 클라우드 조정]

[Google Kubernetes Engine]

영역 설정과 클러스터 시작을 해준다.

몇 분 기다렸더니 시작됐다.

[샘플 코드 가져오기]

Cloud Shell에서 GitHub 저장소를 클론한다.

디렉토리를 실습에 필요한 곳으로 변경하고, ls 명령어로 파일을 나열한다.

각 파일 내용 설명

[간략한 Kubernetes 데모]

kubectl create 명령어로 Kubernetes를 시작할 수 있다.

nginx 컨테이너의 단일 인스턴스를 시작시켰다.

K8S의 모든 컨테이너는 포드에서 실행되므로 kubectl get pods 명령어로 실행중인 nginx 컨테이너를 확인할 수 있다.

kubectl expose 명령어를 사용해 Kubernetes 외부로 nginx 컨테이너를 노출시킬 수 있다. 백그라운드에서 공개 IP주소가 첨부된 로드밸런서(외부 부하 분산기)를 만들었다.

kubectl get services 로 서비스를 나열할 수 있다. External-IP 필드가 채워지는 데는 몇 초 정도 소요될 수 있다고 ㅎ나다.

그래서 처음 명령어를 입력했을 때 <pending>으로 나오는 것을 확인 가능하다.

다시 명령어를 실행하면 위와 같이 LoadBalancer의 EXTERNAL-IP가 채워져있는 것을 볼 수 있다.

curl http://<External IP>:80

Nginx 컨테이너를 위와 같은 명령어로 조회 가능하다.

완료하면 25점이 오른다.

[포드]

Kubernetes의 핵심에는 포드가 있다.

포드는 1개 이상의 컨테이너가 포함된 모음을 나타낸다. 일반적으로 상호 의존성이 높은 컨테이너가 여러 개 있으면 이를 하나의 포드에 패키징한다.

실습의 예시에는 모놀리식과 nginx 컨테이너가 포함된 포드가 있다.

볼포드에는 볼륨도 포함되어 있는데, 볼륨은 데이터 디스크이다.

볼륨은 포드에 포함된 컨테이너에 의해 사용될 수 있다. 포드는 콘텐츠에 공유된 네임스페이스를 제공한다.

[포드 만들기]

  • 포드가 1개의 컨테이너(모놀리식)로 구성되어 있습니다.
  • 시작할 때 컨테이너로 몇 가지 인수가 전달됩니다.
  • HTTP 트래픽용 포드 80이 개방됩니다.

위의 3가지는 yaml 파일에서 주목해야 할 부분이다.

kubectl create -f pods/monolith.yaml 모놀리식 포드를 만든다. 위에서는 이미 만들어져있는데, 또 명령어를 실행시켜 Error가 났다.

kubectl get pods 로 실행 중인 모든 포드를 나열한다.

kubectl describe pods monolith 결과

kubectl describe pods monolith 로 모놀리식 포드에 관한 자세한 정보를 출력시킬 수 있다.

[포드와 상호작용하기]

포드에는 기본적으로 비공개 IP 주소가 부여되며 클러스터 밖에서는 접근할 수 없다.

kubectl port-forward 명령어는 로컬 포트를 모놀리식 포드 안의 포트로 매핑할 수 있게 해준다.

두 번째 터미널에서 다음 명령어를 사용해 포드 전달을 설정하라고 했는데, 첫 번째 터미널에서 그냥 했다.

그래서 새로운 터미널 즉, 두 번째 터미널을 열어서 curl을 사용해 pod와 통신하니 'hello'라는 문자열을 볼 수 있었다.

[서비스]

포드는 영구적으로 지속되지 않는다. 활성 여부 또는 준비 상태 검사 오류와 같은 다양한 이유로 중지되거나 시작될 수 있다. 이로 인해 문제가 발생할 수 있다.

포드가 다시 시작되면 IP 주소가 바뀔 수도 있다.

그래서 서비스가 유용하다. 서비스는 포드를 위해 안정적인 엔드포인트를 제공한다.

서비스는 라벨을 이용하여 어떤 포드에서 작동할지 결정한다.

포드에 라벨이 정확하게 지정되어 있다면 서비스가 이를 자동으로 감지하고 노출시킨다.

 

서비스가 제공하는 포드 집합에 대한 액세스 수준 3가지가 있다.

  • ClusterIP(내부) -- 기본 유형이며 이 서비스는 클러스터 안에서만 볼 수 있습니다.
  • NodePort 클러스터의 각 노드에 외부에서 액세스 가능한 IP 주소를 제공합니다.
  • LoadBalancer는 클라우드 제공업체로부터 부하 분산기를 추가하며 서비스에서 유입되는 트래픽을 내부에 있는 노드로 전달합니다.

[서비스 만들기]

보안이 설정된 모놀리식 포드와 구성 데이터를 만든다.

서비스 yaml 파일을 cat으로 읽어본다.

  1. app: monolith  secure: enabled 라벨이 지정된 포드를 자동으로 찾고 노출시키는 선택기가 있습니다.
  2. 외부 트래픽을 포트 31000에서 포트 443의 nginx로 전달하기 위해 NodePort를 노출시켜야 합니다.

kubectl create 명령어를 사용하여 모놀리식 서비스 yaml 파일에서 모놀리식 서비스를 만듭니다.

점수가 50점으로 오른다.

gcloud compute firewall-rules create allow-monolith-nodeport \
  --allow=tcp:31000

서비스 노출 시에는 pod가 사용된다. 즉, 다른 앱이 서버 중 하나의 포트 31000과 연결을 시도하면 포트 충돌이 발생할 수 있다.

일반적으로 포트 할당은 Kubernetes가 처리한다. gcloud compute firewall-rules 명령어를 사용하여 트래픽을 노출된 NodePort의 모놀리식 서비스로 보낸다.

55점으로 오른다.

이대로 모놀리식 서비스를 클러스터 밖에서 조회하면 시간이 초과된다.

[포드에 라벨 추가하기]

모놀리식 라벨이 지정되어 실행되는 포드를 출력하면 monolith와 secure-monolith가 나온다.

다음으로  'app=monolith'와 'secure=enabled' 라벨이 지정된 포드를 출력하면 아무것도 없다.

kubectl label 명령어를 사용하여 보안이 설정된 모놀리식 포드(secure-monolith)에 누락된 secure=enabled 라벨을 추가한다. 그런 다음 라벨이 업데이트되었는지 --show-labels 옵션으로 확인한다.

점수가 75점으로 오른다.

[Kubernetes로 애플리케이션 배포하기]

디플로이먼트실행 중인 포드의 개수가 사용자가 명시한 포드 개수와 동일하게 만드는 선언 방식이다.

배포의 주요 이점은 pod 관리에 있다. 배포는 백그라운드에서 복제본 집합을 사용하여 pod의 시작 및 중지를 관리한다. Pod를 업데이트하거나 확장해야 하는 경우 배포가 이를 처리한다. 또한 디플로이먼트는 어떤 이유로든 포드가 중지되면 재시작 한다.

예시

포드는 생성 기반 노드의 전체 기간과 연결되어 있다. 위 예시에서 Node3이 중단되면서 포드가 중단되었다. 직접 새로운 포드를 만들고 이를 위한 노드를 찾는 대신, 디플로이먼트가 새로운 포드를 만들고 Node2에서 실행해 준다.

 

[디플로이먼트 만들기]

  • auth - 인증된 사용자를 위한 JWT 토큰을 생성합니다.
  • hello - 인증된 사용자를 안내합니다.
  • frontend - 트래픽을 auth 및 hello 서비스로 전달합니다.

모놀리식 앱을 위의 3가지로 나눈다.

kubectl create 명령어를 실행하여 auth 디플로이먼트를 만든다. 그 후 auth 디플로이먼트용 서비스를 만든다.

hello 디플로이먼트 만들기와 hello 서비스도 만든다.

frontend 디플로이먼트와 서비스를 만들고 kubectl create configmap 명령어를 통해 nginx/frontend.conf 파일의 내용을 ConfigMap으로 만들어 Kubernetes에서 사용할 수 있게 한다.

100점으로 바뀐다.