arrow_back

서비스 및 인그레스 리소스 만들기

로그인 가입
700개 이상의 실습 및 과정 이용하기

서비스 및 인그레스 리소스 만들기

실습 1시간 universal_currency_alt 크레딧 5개 show_chart 입문
info 이 실습에는 학습을 지원하는 AI 도구가 통합되어 있을 수 있습니다.
700개 이상의 실습 및 과정 이용하기

개요

이 실습에서는 두 개의 포드 배포를 만들고 인그레스 리소스를 비롯해 세 가지 유형의 서비스로 작업을 수행합니다. 또한 GKE의 Kubernetes 서비스가 Google Cloud 네트워크 부하 분산기와 연결되는 방식을 알아봅니다.

목표

이 실습에서는 다음 작업을 수행하는 방법을 알아봅니다.

  • Kubernetes DNS의 실제 작동 방식을 알아봅니다.
  • 매니페스트에서 라벨 선택기와 함께 다양한 서비스 유형(ClusterIP, NodePort, LoadBalancer)을 정의하여 라벨이 지정된 기존 포드 및 배포에 연결하고 이를 클러스터에 배포하며 연결을 테스트합니다.
  • 입력한 URL 경로를 기반으로 클라이언트를 두 개의 다른 서비스에 연결하는 인그레스 리소스를 배포합니다.
  • LoadBalancer 유형의 서비스에 대한 Google Cloud 네트워크 부하 분산기 생성을 확인합니다.

실습 설정

Qwiklabs에 액세스

각 실습에서는 정해진 기간 동안 새 Google Cloud 프로젝트와 리소스 집합이 무료로 제공됩니다.

  1. 시크릿 창을 사용하여 Qwiklabs에 로그인합니다.

  2. 실습 사용 가능 시간(예: 1:15:00)을 참고하여 해당 시간 내에 완료합니다.
    일시중지 기능은 없습니다. 필요한 경우 다시 시작할 수 있지만 처음부터 시작해야 합니다.

  3. 준비가 되면 실습 시작을 클릭합니다.

  4. 실습 사용자 인증 정보(사용자 이름비밀번호)를 기록해 두세요. Google Cloud Console에 로그인합니다.

  5. Google Console 열기를 클릭합니다.

  6. 다른 계정 사용을 클릭한 다음, 안내 메시지에 실습에 대한 사용자 인증 정보를 복사하여 붙여넣습니다.
    다른 사용자 인증 정보를 사용하는 경우 오류가 발생하거나 요금이 부과됩니다.

  7. 약관에 동의하고 리소스 복구 페이지를 건너뜁니다.

초기 로그인 단계를 완료하면 프로젝트 대시보드가 표시됩니다.

Cloud Shell 열기

이 실습에서는 대부분의 작업을 Cloud Shell에서 수행하게 됩니다.

  1. Google Cloud 콘솔 제목 표시줄에서 Cloud Shell 활성화(Cloud Shell 활성화 아이콘)를 클릭합니다.
  2. 계속을 클릭합니다.

프로비저닝이 완료되면 Cloud Shell 프롬프트가 표시됩니다.

작업 1. 실습용 GKE 클러스터에 연결 및 DNS 테스트

이 작업에서는 실습용 GKE 클러스터에 연결하고 클러스터 내의 여러 포드에 배포 매니페스트를 만든 다음, 이를 포드 및 서비스 이름의 DNS 변환을 테스트하는 데 사용합니다.

실습 GKE 클러스터에 연결

  1. Cloud Shell에서 다음 명령어를 입력하여 이 실습을 위한 클러스터를 만들 때 사용하게 될 Google Cloud 영역 및 클러스터 이름의 환경 변수를 생성합니다.
export my_zone={{{project_0.default_zone | ZONE}}} export my_cluster=standard-cluster-1
  1. kubectl 명령줄 도구의 명령줄 자동 완성 기능을 구성합니다.
source <(kubectl completion bash)
  1. 다음과 같이 kubectl의 클러스터에 대한 액세스 권한을 구성합니다.
gcloud container clusters get-credentials $my_cluster --zone $my_zone

작업 2. DNS 변환을 테스트하기 위해 포드 및 서비스 만들기

dns-demo-1dns-demo-2라는 두 개의 샘플 애플리케이션 포드가 있는 서비스인 dns-demo를 만듭니다.

소스 파일 저장소 클론 및 샘플 애플리케이션 포드 배포

Kubernetes 서비스를 통해 네트워크 연결을 테스트하는 데 사용할 포드는 소스 저장소에 제공된 dns-demo.yaml 매니페스트 파일을 사용하여 배포됩니다. 나중에 이러한 포드를 사용하여 Kubernetes 클러스터 내 시스템의 다양한 서비스를 통해 연결을 테스트하게 됩니다.

또한 Cloud Shell을 사용하여 외부 주소로부터의 연결도 테스트하게 됩니다. 이 작업에 Cloud Shell을 사용할 수 있는 이유는 Cloud Shell이 Kubernetes 클러스터 네트워크와 완전히 분리된 네트워크에 있기 때문입니다.

apiVersion: v1 kind: Service metadata: name: dns-demo spec: selector: name: dns-demo clusterIP: None ports: - name: dns-demo port: 1234 targetPort: 1234 --- apiVersion: v1 kind: pod metadata: name: dns-demo-1 labels: name: dns-demo spec: hostname: dns-demo-1 subdomain: dns-demo containers: - name: nginx image: nginx --- apiVersion: v1 kind: pod metadata: name: dns-demo-2 labels: name: dns-demo spec: hostname: dns-demo-2 subdomain: dns-demo containers: - name: nginx image: nginx
  1. Cloud Shell에서 다음 명령어를 입력하여 실습 Cloud Shell에 저장소를 클론합니다.
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
  1. 작업 디렉터리로 연결되는 바로가기, 즉 소프트 링크를 생성합니다.
ln -s ~/training-data-analyst/courses/ak8s/v1.1 ~/ak8s
  1. 이 실습의 샘플 파일이 포함된 디렉터리로 이동합니다.
cd ~/ak8s/GKE_Services/
  1. 다음과 같이 서비스와 포드를 만듭니다.
kubectl apply -f dns-demo.yaml
  1. 다음과 같이 포드가 실행되는지 확인합니다.
kubectl get pods

출력은 다음 예시와 같이 표시됩니다.

출력:

NAME READY STATUS RESTARTS AGE dns-demo-1 1/1 Running 0 8s dns-demo-2 1/1 Running 0 8s

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. DNS 변환을 테스트하기 위해 포드 및 서비스 만들기

  1. 클러스터 내부에서 실행하기 위해 dns-demo-1에서 실행되는 bash에 대한 대화형 세션을 엽니다.
kubectl exec -it dns-demo-1 -- /bin/bash

이제 클러스터의 컨테이너 내에 있으므로 후속 명령어는 해당 컨텍스트에서 실행되며, 이후 작업에서 이 컨텍스트를 사용하여 다양한 대상을 핑함으로써 네트워크 연결을 테스트하게 됩니다. 그러나 이 컨테이너에는 핑할 도구가 없으므로 먼저 ping 명령어를 설치해야 합니다.

  1. apt-get을 업데이트하고 ping 도구를 설치합니다.
apt-get update apt-get install -y iputils-ping
  1. 다음과 같이 dns-demo-2를 핑합니다.
ping dns-demo-2.dns-demo.default.svc.cluster.local

이 핑은 성공적으로 실행되며, dns-demo-2 포드에 대해 이전에 찾은 IP 주소가 대상에 포함되었음이 보고됩니다.

  1. Ctrl+C를 눌러 ping 명령어를 취소합니다.
  2. 서비스 내부의 특정 포드 대신 다음과 같이 dns-demo 서비스의 FQDN을 핑합니다.
ping dns-demo.default.svc.cluster.local

이 핑도 성공적으로 실행되지만, 두 개의 demo-dns 포드 중 하나의 FQDN에서 응답이 반환됩니다. 응답을 반환하는 포드는 demo-dns-1일 수도 있고 demo-dns-2일 수도 있습니다.

  1. Ctrl+C를 눌러 ping 명령어를 취소합니다.

애플리케이션을 배포하는 경우 애플리케이션 코드가 클러스터의 컨테이너 내에서 실행되므로 해당 클러스터 내에서 관련 서비스의 FQDN을 사용하면 동일 코드를 이용해 다른 서비스에 액세스할 수 있습니다. 이 방식은 IP 주소는 물론 포드 이름을 사용하는 것보다도 더 간단한데, IP 주소나 포드 이름은 변경될 가능성이 높기 때문입니다.

  1. dns-demo-1에서 실행 중인 대화형 셸을 종료합니다.

작업 3. 샘플 워크로드 및 ClusterIP 서비스 배포

이 작업에서는 클러스터 내의 포드 집합에 배포 매니페스트를 만든 다음 ClusterIP 서비스를 사용하여 이를 노출합니다.

Kubernetes Engine 클러스터에 샘플 웹 애플리케이션 배포

이 작업에서는 다음과 같이 hello-v1.yaml 매니페스트 파일에 이미 생성된 매니페스트를 사용하여 포트 8080의 HTTP 서버에서 수신 대기하는 샘플 웹 애플리케이션 컨테이너 이미지를 배포합니다.

apiVersion: apps/v1 kind: Deployment metadata: name: hello-v1 spec: replicas: 3 selector: matchLabels: run: hello-v1 template: metadata: labels: run: hello-v1 name: hello-v1 spec: containers: - image: gcr.io/google-samples/hello-app:1.0 name: hello-v1 ports: - containerPort: 8080 protocol: TCP
  1. Cloud Shell 메뉴 바에서 더하기 기호(아이콘 추가) 아이콘을 클릭하여 새 Cloud Shell 세션을 시작합니다.

Cloud Shell 창의 두 번째 Cloud Shell 세션

두 번째 Cloud Shell 세션이 Cloud Shell 창에 표시됩니다. 메뉴 바에서 세션을 클릭하여 전환할 수 있습니다.

  1. 두 번째 Cloud Shell 탭에서 이 실습의 샘플 파일이 포함된 디렉터리로 이동합니다.
cd ~/ak8s/GKE_Services/
  1. hello-v1.yaml 파일에서 배포를 만들려면 다음 명령어를 실행합니다.
kubectl create -f hello-v1.yaml
  1. 배포 목록을 보려면 다음 명령어를 실행합니다.
kubectl get deployments

출력은 다음 예시와 같이 표시됩니다.

출력:

NAME READY UP-TO-DATE AVAILABLE AGE hello-v1 3/3 3 3 14s

매니페스트에서 서비스 유형 정의

이 작업에서는 이미 만들어진 hello-svc.yaml 샘플 매니페스트를 통해 ClusterIP를 사용하는 서비스를 배포합니다.

apiVersion: v1 kind: Service metadata: name: hello-svc spec: type: ClusterIP selector: name: hello-v1 ports: - protocol: TCP port: 80 targetPort: 8080
  1. ClusterIP 서비스를 배포하려면 다음 명령어를 실행합니다.
kubectl apply -f ./hello-svc.yaml

이 매니페스트는 ClusterIP 서비스를 정의하고 해당 선택기와 대응하는 포드에 이를 적용합니다. 이 경우 배포한 hello-v1 포드에 매니페스트가 적용됩니다. name: hello-v1 라벨이 포함된 모든 배포에 이 서비스가 자동으로 적용됩니다.

  1. 서비스가 만들어지고 클러스터 IP가 할당되었는지 다음 명령어를 사용해 확인합니다.
kubectl get service hello-svc

IP 주소는 출력 예시와 다를 수 있습니다.

출력:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-svc ClusterIP 10.11.253.203 80/TCP 20s

이 서비스에 할당된 외부 IP가 없습니다. Kubernetes 클러스터 IP 주소는 기본적으로 외부에서 액세스할 수 없으므로 이 서비스를 만들어도 클러스터 외부에서 애플리케이션에 액세스할 수 없습니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 샘플 워크로드 및 ClusterIP 서비스 배포

애플리케이션 테스트

  1. Cloud Shell에서 다음 명령어를 사용하여 새 서비스에 연결하는 HTTP 세션을 열어봅니다.
curl hello-svc.default.svc.cluster.local

해당 서비스는 클러스터 외부에 노출되지 않기 때문에 연결에 실패합니다.

출력:

curl: (6) Could not resolve host: hello-svc.default.svc.cluster.local

이제 dns-demo-1 포드에서 실행 중인 대화형 셸을 사용하여 클러스터 내부에서 서비스를 테스트합니다.

  1. 현재 dns-demo-1 포드의 stdin 및 stdout을 리디렉션하고 있는 첫 번째 Cloud Shell 창으로 돌아갑니다.
  2. curl을 설치하면 명령줄에서 웹 서비스를 호출할 수 있습니다.
apt-get install -y curl
  1. 다음 명령어를 사용하여 포드 간의 HTTP 연결을 테스트합니다.
curl hello-svc.default.svc.cluster.local

연결이 성공적으로 실행되고 아래 출력과 비슷한 응답이 표시됩니다. 호스트 이름은 출력 예시와 다를 수 있습니다.

출력:

root@dns-demo-1:/# curl hello-svc.default.svc.cluster.local Hello, world! Version: 1.0.0 Hostname: hello-v1-85b99869f-mp4vd root@dns-demo-1:/#

Kubernetes Engine 클러스터 내에서 내부 DNS를 사용하여 clusterIP를 확인할 수 있기 때문에 연결이 실행됩니다.

작업 4. NodePort 사용을 위한 서비스 변환

이 작업에서는 기존 ClusterIP 서비스를 NodePort 서비스로 변환한 다음 클러스터 내부 및 외부에서 서비스에 대한 액세스를 다시 테스트합니다.

서비스 유형을 NodePort로 변경하는 hello-nodeport-svc.yaml이라는 hello-svc.yaml 파일의 수정 버전은 이미 생성되어 있습니다.

apiVersion: v1 kind: Service metadata: name: hello-svc spec: type: NodePort selector: name: hello-v1 ports: - protocol: TCP port: 80 targetPort: 8080 nodePort: 30100
  1. 두 번째 Cloud Shell 창으로 돌아갑니다. 이 창은 dns-test 포드의 stdin 및 stdout에 연결되어 있지 않습니다.
  2. hello-svc의 서비스 유형을 NodePort로 변경하는 매니페스트를 배포하기 위해 다음 명령어를 실행합니다.
kubectl apply -f ./hello-nodeport-svc.yaml

이 매니페스트는 hello-svc를 NodePort 서비스로 재정의하고 해당 서비스에 대한 클러스터의 각 노드에 서비스 포트 30100을 할당합니다.

  1. 다음 명령어를 입력하여 서비스 유형이 NodePort로 변경되었는지 확인합니다.
kubectl get service hello-svc

IP 주소는 출력 예시와 다를 수 있습니다.

출력:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-svc NodePort 10.11.253.203 80:30100/TCP 59m 참고: 아직 이 서비스에 할당된 외부 IP가 없습니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. NodePort 사용을 위한 서비스 변환

애플리케이션 테스트

  1. Cloud Shell에서 다음 명령어를 사용하여 새 서비스에 연결하는 HTTP 세션을 열어봅니다.
curl hello-svc.default.svc.cluster.local

해당 서비스는 클러스터 외부에 노출되지 않기 때문에 연결에 실패합니다.

출력:

curl: (6) Could not resolve host: hello-svc.default.svc.cluster.local

이제 다른 포드에서 서비스를 테스트합니다.

  1. 현재 dns-test 포드의 stdin 및 stdout을 리디렉션하고 있는 첫 번째 Cloud Shell 창으로 돌아갑니다.
  2. 다음 명령어를 사용하여 포드 간의 HTTP 연결을 테스트합니다.
curl hello-svc.default.svc.cluster.local

연결이 성공적으로 실행되고 아래 출력과 비슷한 응답이 표시됩니다. 호스트 이름은 출력 예시와 다를 수 있습니다.

출력:

root@dns-demo-1:/# curl hello-svc.default.svc.cluster.local Hello, world! Version: 1.0.0 Hostname: hello-v1-85b99869f-mp4vd root@dns-demo-1:/#

GKE 클러스터 내에서 내부 DNS를 사용하여 clusterIP를 확인할 수 있기 때문에 연결이 실행됩니다.

작업 5. Google Cloud 네트워킹을 사용하여 고정 공개 IP 주소 만들기

Google Cloud 네트워킹 고정 IP 주소 예약

  1. Google Cloud 콘솔 탐색 메뉴에서 네트워킹 > VPC 네트워크 > IP 주소로 이동합니다.

  2. 외부 고정 주소 예약을 클릭합니다.

  3. 이름regional-loadbalancer를 입력합니다.

  4. 옵션을 탐색하되 나머지 설정은 기본값으로 둡니다. 기본 유형은 리전입니다.

참고: 기본 리전은 GKE 클러스터를 배포한 리전과 일치해야 합니다. 일치하지 않는다면 클러스터를 생성하는 데 사용한 리전과 일치하도록 여기에서 리전을 변경합니다. 실습 기본값을 수락한 경우 리전이어야 합니다.
  1. 예약을 클릭합니다.

  2. regional-loadbalancer라는 외부 IP 주소를 기록해 둡니다. 이후 작업에서 이 주소를 사용하게 됩니다.

  3. 외부 고정 주소 예약을 클릭합니다.

  4. 이름global-ingress를 입력합니다.

  5. 유형을 전역으로 변경합니다.

  6. 나머지 설정은 기본값으로 둡니다.

  7. 예약을 클릭합니다.

  8. global-ingress라는 외부 IP 주소를 기록해 둡니다. 이후 작업에서 이 주소를 사용하게 됩니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. Google Cloud 네트워킹을 사용하여 고정 공개 IP 주소 만들기

작업 6. 새로운 포드 집합 및 LoadBalancer 서비스 배포

이제 두 서비스를 쉽게 구별할 수 있도록 다른 버전의 애플리케이션을 실행하는 새로운 포드 집합을 배포합니다. 그런 다음 LoadBalancer 서비스로 새 포드를 노출하고 클러스터 외부에서 서비스에 액세스합니다.

포트 8080에 샘플 hello 애플리케이션의 버전 2를 실행하는 새 배포를 만드는 hello-v2.yaml이라는 두 번째 배포 매니페스트가 생성되었습니다.

apiVersion: apps/v1 kind: Deployment metadata: name: hello-v2 spec: replicas: 3 selector: matchLabels: run: hello-v2 template: metadata: labels: run: hello-v2 name: hello-v2 spec: containers: - image: gcr.io/google-samples/hello-app:2.0 name: hello-v2 ports: - containerPort: 8080 protocol: TCP
  1. 두 번째 Cloud Shell 창으로 돌아갑니다. 이 창은 dns-test 포드의 stdin 및 stdout에 연결되어 있지 않습니다.
  2. hello-v2 배포를 만드는 매니페스트를 배포하려면 다음 명령어를 실행합니다.
kubectl create -f hello-v2.yaml
  1. 배포 목록을 보려면 다음 명령어를 실행합니다.
kubectl get deployments

출력은 다음 예시와 같이 표시됩니다.

출력:

NAME READY UP-TO-DATE AVAILABLE AGE hello-v1 3/3 3 3 18m hello-v2 3/3 3 3 7s

매니페스트에서 서비스 유형 정의

이 작업에서는 이미 생성된 hello-lb-svc.yaml 샘플 매니페스트를 사용하여 LoadBalancer 서비스를 배포합니다.

sed 명령어를 사용하여 부하 분산기 yaml 파일의 10.10.10.10 자리표시자 주소를 이전에 부하 분산기에 예약한 고정 주소로 바꿉니다.

apiVersion: v1 kind: Service metadata: name: hello-lb-svc spec: type: LoadBalancer loadBalancerIP: 10.10.10.10 selector: name: hello-v2 ports: - protocol: TCP port: 80 targetPort: 8080
  1. 작업을 두 번째 Cloud Shell 창에서 실행 중인지 확인합니다. 이 창은 dns-test 포드의 stdin 및 stdout에 연결되어 있지 않습니다.

  2. Cloud Shell에 다음 명령어를 입력하여 이전에 만든 리전 고정 IP 주소를 환경 변수에 저장합니다.

    export STATIC_LB=$(gcloud compute addresses describe regional-loadbalancer --region {{{project_0.default_region | REGION}}} --format json | jq -r '.address')
  3. Cloud Shell에 다음 명령어를 입력하여 자리표시자 주소를 해당 리전 고정 IP 주소로 바꿉니다.

sed -i "s/10\.10\.10\.10/$STATIC_LB/g" hello-lb-svc.yaml
  1. 외부 IP 주소가 올바르게 바뀌었는지 확인하기 위해 Cloud Shell에 다음 명령어를 입력합니다.
cat hello-lb-svc.yaml

loadBalancerIP는 이전에 regional-loadbalancer의 예약된 고정 IP 주소에 기록된 주소와 일치해야 합니다.

  1. LoadBalancer 서비스 매니페스트를 배포하려면 다음 명령어를 실행합니다.
kubectl apply -f ./hello-lb-svc.yaml

이 매니페스트는 외부에서 서비스에 액세스하도록 Google Cloud 네트워크 부하 분산기를 배포하는 LoadBalancer 서비스를 정의합니다. 이 서비스는 name: hello-v2 선택기가 포함된 포드에만 적용됩니다.

  1. 서비스가 만들어지고 노드 포트가 할당되었는지 다음 명령어로 확인합니다.
kubectl get services

IP 주소는 출력 예시와 다를 수 있습니다.

출력:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dns-demo ClusterIP None 1234/TCP 1h hello-lb-svc LoadBalancer 10.11.253.48 35.184.45.240 80:30103/TCP 2m hello-svc NodePort 10.11.253.203 80:30100/TCP 1h kubernetes ClusterIP 10.11.240.1 443/TCP 2h

새 LoadBalancer 서비스에 외부 IP 주소로 regional-loadbalancer의 예약된 주소가 표시됩니다. GKE 환경에서 LoadBalancer 서비스 유형의 외부 부하 분산기는 Google Cloud 부하 분산기를 사용하여 구현되며, 생성되는 데 몇 분 정도 걸립니다. 이 외부 IP 주소를 사용하면 클러스터 외부에서 서비스에 액세스할 수 있습니다.

리전 Google Cloud 부하 분산기가 생성되었는지 확인

  1. Google Cloud 콘솔에서 네트워킹 > 네트워크 서비스 > 부하 분산으로 이동합니다.

대상 풀 백엔드 1개와 인스턴스 2개가 있는 TCP 부하 분산기가 표시됩니다.

  1. 이름을 클릭하여 세부정보 페이지를 엽니다.

세부정보에는 이 부하 분산기가 앞서 예약했을 때 regional-loadbalancer라는 고정 IP 주소가 할당된 리전 TCP 부하 분산기라는 정보가 표시됩니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 새로운 포드 집합 및 LoadBalancer 서비스 배포

애플리케이션 테스트

  1. Cloud Shell에서 다음 명령어를 사용하여 새 서비스에 연결하는 HTTP 세션을 열어봅니다.
curl hello-lb-svc.default.svc.cluster.local

해당 서비스 이름이 클러스터 외부에 노출되지 않기 때문에 연결에 실패합니다.

출력:

curl: (6) Could not resolve host: hello-lb-svc.default.svc.cluster.local

이 호스트 이름에 등록되어 있지 않은 외부 IP 주소이기 때문입니다.

  1. 리전 부하 분산기 서비스와 연결된 외부 IP 주소를 사용하여 연결을 다시 시도해 봅니다. 다음 명령어를 입력하고 [external_IP]를 서비스의 외부 IP 주소로 대체합니다.
curl [external_IP]

예시:

curl 35.184.45.240

이번에는 Google Cloud 외부에서 LoadBalancer의 외부 IP 주소에 연결할 수 있으므로 연결이 실패하지 않습니다.

참고: 연결되는 데 최대 5분이 소요될 수 있습니다.

출력:

Hello, world! Version: 2.0.0 Hostname: hello-v2-59c99d8b65-jrx2d
  1. 현재 dns-demo-1 포드의 stdin 및 stdout을 리디렉션하고 있는 첫 번째 Cloud Shell 창으로 돌아갑니다.
  2. 다음 명령어를 사용하여 포드 간의 HTTP 연결을 테스트합니다.
curl hello-lb-svc.default.svc.cluster.local

연결이 성공적으로 실행되고 아래 출력과 비슷한 응답이 표시됩니다. 호스트 이름은 출력 예시와 다릅니다.

출력:

root@dns-demo-1:/# curl hello-lb-svc.default.svc.cluster.local Hello, world! Version: 2.0.0 Hostname: hello-v2-59c99d8b65-78ggz root@dns-demo-1:/#

내부 DNS 이름은 포드 내에서 작동하며, 외부 IP 주소를 사용하여 클러스터 외부에서 액세스했던 것과 동일한 v2 버전의 애플리케이션에 액세스하고 있음을 확인할 수 있습니다.

  1. 서비스와 연결된 외부 IP 주소를 사용하여 포드 내에서 다시 연결을 시도합니다. 다음 명령어를 입력하고 [external_IP]를 서비스의 외부 IP 주소로 대체합니다.
curl [external_IP]

예시:

curl 35.184.45.240

출력:

root@dns-demo-1:/# curl 35.184.45.240 Hello, world! Version: 2.0.0 Hostname: hello-v2-59c99d8b65-jrx2d root@dns-demo-1:/#

외부 IP는 클러스터에서 실행되는 포드 내부에서도 작동하며, 동일한 v2 버전의 애플리케이션으로부터 결과를 반환합니다.

  1. 'exit'를 입력하여 포드에 대한 콘솔 리디렉션 세션을 종료합니다.
exit

그러면 Cloud Shell 명령 프롬프트로 돌아갑니다.

작업 7. 인그레스 리소스 배포

hello 애플리케이션의 클러스터에는 두 개의 서비스가 있습니다. 한 서비스는 NodePort 서비스를 통해 버전 1.0을 호스팅하고, 다른 서비스는 LoadBalancer 서비스를 통해 버전 2.0을 호스팅합니다. 이제 사용자가 입력한 URL을 기반으로 트래픽을 두 서비스 모두로 전달하는 인그레스 리소스를 배포합니다.

인그레스 리소스 만들기

인그레스는 외부 HTTP(S) 트래픽을 내부 서비스로 라우팅하기 위한 규칙과 구성의 모음을 캡슐화하는 Kubernetes 리소스입니다.

GKE에서 인그레스는 Cloud Load Balancing을 사용하여 구현됩니다. 클러스터에 인그레스 리소스를 만들면 GKE는 HTTP(S) 부하 분산기를 만들고 트래픽을 애플리케이션으로 라우팅하도록 구성합니다.

인그레스 리소스를 구성할 hello-ingress.yaml이라는 샘플 매니페스트가 생성되어 있습니다.

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / kubernetes.io/ingress.global-static-ip-name: "global-ingress" spec: rules: - http: paths: - path: /v1 pathType: ImplementationSpecific backend: service: name: hello-svc port: number: 80 - path: /v2 pathType: ImplementationSpecific backend: service: name: hello-lb-svc port: number: 80

이 구성 파일은 이전 단계에서 만든 global-ingress 고정 IP 주소에 연결할 인그레스 리소스를 정의합니다. 이 인그레스 리소스는 입력된 경로를 기반으로 트래픽을 웹 서비스로 전달하는 전역 HTTP(S) 부하 분산기를 만듭니다.

kubernetes.io/ingress.global-static-ip-name 주석을 사용하면 Google Cloud 전역 HTTP(S) 부하 분산기를 만들 때 인그레스 리소스가 사용할 수 있도록 인그레스 리소스에 명명된 예약 IP 주소를 지정할 수 있습니다.

  • 이 인그레스 리소스를 배포하기 위해 다음 명령어를 실행합니다.
kubectl apply -f hello-ingress.yaml

이 매니페스트를 배포하면 Kubernetes가 클러스터에 인그레스 리소스를 만듭니다. 클러스터에서 실행되는 인그레스 컨트롤러는 모든 외부 HTTP 트래픽(포트 80)을 노출된 웹 NodePort 서비스 및 LoadBalancer 서비스로 라우팅하는 HTTP(S) 부하 분산기 생성을 담당합니다.

전역 HTTP(S) 부하 분산기가 생성되었는지 확인

  1. Google Cloud 콘솔에서 네트워킹 > 네트워크 서비스 > 부하 분산으로 이동합니다. 이제 HTTP(S) 부하 분산기도 표시됩니다.

  2. 이름을 클릭하여 세부정보 페이지를 엽니다. 세부정보에는 이 부하 분산기가 global-ingress라는 이전에 예약된 고정 IP 주소를 사용하는 전역 HTTP(S) 부하 분산기라는 정보가 표시됩니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 인그레스 리소스 배포

애플리케이션 테스트

  1. 애플리케이션을 제공하는 부하 분산기의 외부 IP 주소를 확인하려면 다음 명령어를 실행합니다.
kubectl describe ingress hello-ingress

부분 출력:

Name: hello-ingress Namespace: default Address: 35.244.173.44 Default backend: default-http-backend:80 (10.8.2.5:8080) Rules: Host Path Backends ---- ---- -------- * /v1 hello-svc:80 () /v2 hello-lb-svc:80 () [...] ingress.kubernetes.io/backends:{"k8s-[...]"HEALTHY"[...]} [...] Events: Type Reason Age From Message ---- ------ --- ---- ------- Normal ADD 5m loadbalancer-controller default/hello-ingress Normal CREATE 5m loadbalancer-controller ip: 35.244.173.44 참고: 외부 주소가 표시되려면 부하 분산기가 활성화되고 상태 점검이 성공할 때까지 몇 분 정도 기다려야 합니다.

인그레스 리소스의 초기화가 완료되었는지 확인하려면 몇 분마다 명령어를 반복합니다. Google Cloud 전역 HTTP(S) 부하 분산기가 생성되고 초기화되면 명령어가 global-ingress라는 이전에 예약된 전역 고정 IP 주소와 일치하는 외부 IP 주소를 보고합니다.

  1. 인그레스 리소스와 연결된 외부 IP 주소를 사용하고 [external_IP]를 인그레스 리소스의 외부 IP 주소로 대체하여 다음 명령어를 입력합니다. 다음과 같이 URL 경로에 /v1을 포함해야 합니다.
curl http://[external_IP]/v1

예시:

curl http://35.201.92.69/v1

출력:

Hello, world! Version: 1.0.0 Hostname: hello-v1-85b99869f-4rmqw

v1 URL이 트래픽을 v1 애플리케이션 포드로 전달하는 hello-svc NodePort 서비스를 가리키도록 hello-ingress.yaml에 구성됩니다.

참고: 인그레스 리소스에 사용되는 전역 부하 분산기가 애플리케이션을 제공할 수 있을 때까지 GKE가 전달 규칙을 설정하는 데 몇 분 정도 걸릴 수 있습니다.

그동안 부하 분산기 구성이 전역에 적용될 때까지 HTTP 404 또는 HTTP 500과 같은 오류가 발생할 수 있습니다.
  1. 이제 Cloud Shell에서 v2 URL 경로를 테스트합니다. 인그레스 리소스와 연결된 외부 IP 주소를 사용하고 [external_IP]를 인그레스 리소스의 외부 IP 주소로 대체하여 다음 명령어를 입력합니다. 다음과 같이 URL 경로에 /v2를 포함해야 합니다.
curl http://[external_IP]/v2

v2 URL이 트래픽을 v2 애플리케이션 포드로 보내는 hello-lb-svc LoadBalancer 서비스를 가리키도록 hello-ingress.yaml에 구성됩니다.

예시:

curl http://35.201.92.69/v2

출력:

Hello, world! Version: 2.0.0 Hostname: hello-v2-59c99d8b65-jrx2d

Google Cloud 콘솔에서 네트워킹 리소스의 변경사항 검사

  1. Google Cloud 콘솔의 탐색 메뉴에서 네트워킹 > 네트워크 서비스> 부하 분산을 클릭합니다.

이제 다음 두 개의 부하 분산기가 표시됩니다.

  • hello-lb-svc 서비스용 초기 리전 부하 분산기는 UID 스타일 이름을 가지며, TCP 포트 80 트래픽을 클러스터 노드로 부하 분산하도록 구성됩니다.

  • 두 번째는 인그레스 객체용으로 생성되었으며, 인그레스 구성과 일치하는 호스트 및 경로 규칙을 포함하는 완전한 HTTP(S) 부하 분산기입니다. 이름에 hello-ingress가 있습니다.

  1. 이름에 hello-ingress가 있는 부하 분산기를 클릭합니다.

그러면 인그레스 리소스용으로 생성된 Google Cloud 전역 HTTP(S) 부하 분산기의 프로토콜, 포트, 경로, 백엔드 서비스에 대한 요약 정보가 표시됩니다.

실습 종료하기

실습을 완료하면 실습 종료를 클릭합니다. Google Cloud Skills Boost에서 사용된 리소스를 자동으로 삭제하고 계정을 지웁니다.

실습 경험을 평가할 수 있습니다. 해당하는 별표 수를 선택하고 의견을 입력한 후 제출을 클릭합니다.

별점의 의미는 다음과 같습니다.

  • 별표 1개 = 매우 불만족
  • 별표 2개 = 불만족
  • 별표 3개 = 중간
  • 별표 4개 = 만족
  • 별표 5개 = 매우 만족

의견을 제공하고 싶지 않다면 대화상자를 닫으면 됩니다.

의견이나 제안 또는 수정할 사항이 있다면 지원 탭을 사용하세요.

Copyright 2020 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.

시작하기 전에

  1. 실습에서는 정해진 기간 동안 Google Cloud 프로젝트와 리소스를 만듭니다.
  2. 실습에는 시간 제한이 있으며 일시중지 기능이 없습니다. 실습을 종료하면 처음부터 다시 시작해야 합니다.
  3. 화면 왼쪽 상단에서 실습 시작을 클릭하여 시작합니다.

시크릿 브라우징 사용

  1. 실습에 입력한 사용자 이름비밀번호를 복사합니다.
  2. 비공개 모드에서 콘솔 열기를 클릭합니다.

콘솔에 로그인

    실습 사용자 인증 정보를 사용하여
  1. 로그인합니다. 다른 사용자 인증 정보를 사용하면 오류가 발생하거나 요금이 부과될 수 있습니다.
  2. 약관에 동의하고 리소스 복구 페이지를 건너뜁니다.
  3. 실습을 완료했거나 다시 시작하려고 하는 경우가 아니면 실습 종료를 클릭하지 마세요. 이 버튼을 클릭하면 작업 내용이 지워지고 프로젝트가 삭제됩니다.

현재 이 콘텐츠를 이용할 수 없습니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.

감사합니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.

한 번에 실습 1개만 가능

모든 기존 실습을 종료하고 이 실습을 시작할지 확인하세요.

시크릿 브라우징을 사용하여 실습 실행하기

이 실습을 실행하려면 시크릿 모드 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학생 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.