Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

Terraform으로 Google Cloud Platform의 GKE 클러스터 생성하기

AWS만 사용해 보다가 GCP(Google Cloud Platform)를 써보기 시작한 게 사실은 Kubernetes를 테스트해보기 위함이다. GCP에서는 구글이 완전히 관리해주는 GKE(Google Kubernetes Engine)를 제공하고 있어서 따로 Kubernetes를 설치하고 관리할 필요 없이 사용할 수 있다. Kubernetes는 이제 막 배우는 단계이지만 인프라를 거의 Terraform으로 관리하고 있어서 GKE 설정도 Terraform을 이용했다. GCP에 대한 기본 설정은 Google Cloud Platform에 Terraform 설정하기를 참고하면 된다.

GKE 클러스터 생성

GKE를 사용하려면 사용할 프로젝트에서 API를 활성화 해야 한다. "API 및 서비스"에서 Compute Engine API, Kubernetes Engine API를 찾아가서 사용 설정을 한다.

Kubernetes Engine API 설정

GKE를 만들려면 google_container_cluster 리소스를 사용하면 된다.

resource "google_container_cluster" "practice" {
  name               = "practice"
  zone               = "${data.google_compute_zones.available.names[0]}"
  initial_node_count = 2

  node_version       = "1.10"
  min_master_version = "1.10"

  additional_zones = [
    "${data.google_compute_zones.available.names[1]}",
  ]

  master_auth {
    username = "${var.username}"
    password = "${var.password}"
  }

  node_config {
    oauth_scopes = [
      "https://www.googleapis.com/auth/compute",
      "https://www.googleapis.com/auth/devstorage.read_only",
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
    ]
  }
}

Terraform 문서를 참고한 기본 설정이다. 클러스터 인스턴스를 실행할 zoneadditional_zones는 리전에서 사용할 수 있는 available zone을 가져오도록 했다. 이 이름을 하드 코딩하지 않으려고 variables.tf파일에서 다음과 같이 data 설정을 추가했다.

data "google_compute_zones" "available" {}

여기서 가져온 availabe zone 배열에서 첫 번째 존을 기본 존으로 설정하고 additional_zones에 다른 존을 추가했다. additional_zones에는 여러 값을 넣어도 되지만 연습이므로 하나만 추가했다. initial_node_count는 클러스터의 노드 개수다. 이 숫자에는 마스터 노드는 포함되지 않는다.(아직 다 파악 못했지만 마스터 노드는 GKE가 따로 관리해 주는 것으로 보인다. 인스턴스 목록에도 나오지 않는다) 그래서 initial_node_count를 2로 설정하면 존마다 2개씩 생성되므로 여기서는 존을 총 2개 설정했으므로 노드는 4개가 실행된다.

node_versionmin_master_version은 노드와 마스터의 Kubernetes 버전이다. GEK의 버전은 문서에서 참고할 수 있는데 1.X, 1.X.Y, 1.X.Y-.*, latest처럼 정의할 수 있고 이후에는 별도로 업데이트 가능한 것 같지만 처음 생성할 때는 node_versionmin_master_version의 버전이 같아야 한다.

master_auth는 마스터에 접근할 인증 정보이다. 여기에 하드 코딩하면 아이디와 비밀번호가 노출되므로 환경변수로 처리하려고 변수로 분리했다. variables.tf에 변수를 추가한다.

variable "username" {}
variable "password" {}

그리고 환경변수로 TF_VAR_usernameTF_VAR_password를 지정하면 Terraform을 사용할 때 이 환경변수의 값이 이 변수에 자동으로 할당되어서 Terraform 설정 파일에서는 이 값을 노출하지 않을 수 있다.

node_config는 아직 자세히 몰라서 Terraform 문서에 나온 대로 설정했다.

$ terraform apply
data.google_compute_zones.available: Refreshing state...

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + google_container_cluster.practice
      id:                                    <computed>
      additional_zones.#:                    "1"
      additional_zones.2275771321:           "asia-northeast1-b"
      addons_config.#:                       <computed>
      cluster_ipv4_cidr:                     <computed>
      enable_kubernetes_alpha:               "false"
      enable_legacy_abac:                    "false"
      endpoint:                              <computed>
      initial_node_count:                    "2"
      instance_group_urls.#:                 <computed>
      logging_service:                       <computed>
      master_auth.#:                         "1"
      master_auth.0.client_certificate:      <computed>
      master_auth.0.client_key:              <computed>
      master_auth.0.cluster_ca_certificate:  <computed>
      master_auth.0.password:                <sensitive>
      master_auth.0.username:                "outsider"
      master_version:                        <computed>
      min_master_version:                    "1.10"
      monitoring_service:                    <computed>
      name:                                  "practice"
      network:                               "default"
      network_policy.#:                      <computed>
      node_config.#:                         "1"
      node_config.0.disk_size_gb:            <computed>
      node_config.0.guest_accelerator.#:     <computed>
      node_config.0.image_type:              <computed>
      node_config.0.local_ssd_count:         <computed>
      node_config.0.machine_type:            <computed>
      node_config.0.oauth_scopes.#:          "4"
      node_config.0.oauth_scopes.1277378754: "https://www.googleapis.com/auth/monitoring"
      node_config.0.oauth_scopes.1632638332: "https://www.googleapis.com/auth/devstorage.read_only"
      node_config.0.oauth_scopes.172152165:  "https://www.googleapis.com/auth/logging.write"
      node_config.0.oauth_scopes.299962681:  "https://www.googleapis.com/auth/compute"
      node_config.0.preemptible:             "false"
      node_config.0.service_account:         <computed>
      node_pool.#:                           <computed>
      node_version:                          "1.10"
      private_cluster:                       "false"
      project:                               <computed>
      region:                                <computed>
      zone:                                  "asia-northeast1-a"


Plan: 1 to add, 0 to change, 0 to destroy.

이를 실행하면 GKE 클러스터가 생성된다.

생성된 GKE 클러스터 정보

생성된 GKE 클러스터 상세 정보

클러스터를 만들었으니 제대로 동작하는지 사용해보자.

클러스터 정보를 가져오려면 Google Cloud Shell을 먼저 설치해야 한다. gcloud init으로 로그인한 뒤 클러스터 정보를 가져오기 위해 설정한다.

$ gcloud config set core/project kubernetes-practice-204905
Updated property [core/project].

$ gcloud config set compute/zone asia-northeast1-a
Updated property [compute/zone].

$ gcloud config set container/cluster practice
Updated property [container/cluster].

설정한 정보는 gcloud config list로 확인할 수 있다.

$ gcloud config list
[compute]
region = asia-northeast1
zone = asia-northeast1-a
[container]
cluster = practice
[core]
account = YOUR_EMAIL
disable_usage_reporting = True
project = kubernetes-practice-204905

Your active configuration is: [default]

프로젝트와 생성한 GKE 클러스터 설정을 했으니 클러스터 인증 정보를 gcloud container clusters get-credentials PROJECT_NAME으로 가져올 수 있다.

$ gcloud container clusters get-credentials practice
Fetching cluster endpoint and auth data.
kubeconfig entry generated for practice.

성공적으로 실행되면 Kubenetes에서 사용할 수 있도록 ~/.kube/config에 클러스터 정보가 업데이트된다.

$ kubectl config get-contexts
CURRENT   NAME                                                        CLUSTER                                                     AUTHINFO                                                    NAMESPACE
          docker-for-desktop                                          docker-for-desktop-cluster                                  docker-for-desktop
*         gke_kubernetes-practice-204905_asia-northeast1-a_practice   gke_kubernetes-practice-204905_asia-northeast1-a_practice   gke_kubernetes-practice-204905_asia-northeast1-a_practice

gke_kubernetes-practice-204905_asia-northeast1-a_practice가 추가된 것을 볼 수 있고 현재 컨텍스트로 설정되어 있지 않다면 kubectl config use-context gke_kubernetes-practice-204905_asia-northeast1-a_practice로 변경할 수 있다.

클러스터가 정보를 가져와 보자.

$ kubectl cluster-info
Kubernetes master is running at https://35.200.104.117
GLBCDefaultBackend is running at https://35.200.104.117/api/v1/namespaces/kube-system/services/default-http-backend:http/proxy
Heapster is running at https://35.200.104.117/api/v1/namespaces/kube-system/services/heapster/proxy
KubeDNS is running at https://35.200.104.117/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://35.200.104.117/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

kubectl로 GKE 클러스터에 접속하는 것을 확인할 수 있다. 클러스터 사용에 관해서는 다음에...

2018/05/22 16:51 2018/05/22 16:51

[Book] The DevOps 2.3 Toolkit: Kubernetes

Docker 유저 그룹에서 Kubernetes 그룹 스터디를 진행해서 참가했다. 재작년인가 인프라 관련 도구에 대해서 살펴보는 스터디도 했었는데 그때는 오케스트레이션 도구가 춘추전국시대였는데 1년 사이에 Kubernets가 완전한 승자가 된 분위기라 Subicura님의 주도로 Kubernetes 스터디를 진행했다. 이 책을 스터디 교재로 진행해서 1월 23일부터 14회 동안 진행하고 지난주에 책을 다 보고 스터디가 끝났다.

인프라 도구들이 대개 그렇듯이 오케스트레이션 도구도 제대로 연습하고 장단점을 느껴보려면 운영할 프로그램이 있어야 해서 서비스의 ping을 검사하는 마이크로 서비스를 같이 만들었다. 굳이 마이크로서비스로 할 필요가 없을 정도로 간단한 애플리케이션이었지만 나한테는 Go 언어도 좀 써보고 재미있었다. 물론 초기 스터디 계획처럼 이 마이크로 서비스가 잘 만들어져서 Kubernetes로 운영해보면서 마이크로서비스를 운영할 때의 장단점을 느껴보는 정도까지는 가지 못했다.

저자인 Viktor Farcic은 데브옵스 책을 계속 쓰고 있는데 2.0 툴킷은 번역서가 출간되었고 The DevOps 2.1 Toolkit: Docker Swarm, The DevOps 2.2 Toolkit: Self-Sufficient Docker Clusters에 이은 버전이다. 이 책을 보기 전에는 글이나 세미나 등에서만 보았을 뿐 Kubernets를 실제로 써본 적은 없었다. 프로덕션뿐만 아니라 로컬에서도 돌려보지 않은 상태로 스터디를 시작했고 취향에 따라 여러 오케스트레이션 도구를 고민해야 했던 1여 년 전과는 달리 이젠 컨테이너로 인프라를 운영하려면 Kubernetes를 반드시 알아야겠다고 생각해서 스터디를 시작했다. 설사 AWS나 Google에서 제공하는 다른 컨테이너 서비스를 쓴다고 하더라도 최소한 Kubernetes의 장단점을 알고 써야겠다는 생각이었다.

보통 그룹스터디를 하면 책을 찬찬히 보지는 못하는데 원서라서 좀 힘들었지만, 이번에는 책을 처음부터 다 읽어보고 예제도 거의 다 따라 해 봤다. 책은 Kubernetes를 처음 사용해보는 사람들을 대상으로 하고 있다. 그래서 Kubernetes의 사용법을 알려주는 데 집중되어 있고 Kubernetes를 운영하는 노하우나 마이크로서비스를 운영하면서 필요한 지식, Kubernetes 내부 등은 많이 다루지 않고 있다. 대신 Kubernetes를 처음 배우기에는 구성이 괜찮다고 생각하고 있다.

Kubernetes를 이해하기 쉽게 가장 작은 단위인 Pod부터 ReplicaSet, Service, Deployment 순으로 살펴보고 운영하는데 필요한 Ingress, Volume, ConfigMap, Secret을 하나씩 다뤄주고 있어서 운영에 필요한 Kubernetes의 리소스와 관계를 이해할 수 있다. 도구 자체가 간단한 도구가 아니라서 책을 읽고 예제를 따라 한 정도로는 Kubernetes를 이해하기 어렵고 직접 운영하거나 자신의 서비스를 Kubernetes를 써보면서 연습을 해봐야 제대로 감을 잡을 수 있었지만, 그 가이드라인을 세워주는 데는 나쁘지 않았다.

뒷부분에서는 실제 프로덕션에 운영과 관련된 내용을 설명한다. Kubernetes 클러스터에 구성을 도와주는 kops와 Namespace, 권한관리 등 Kubernetes를 다 몰라서 빠진 부분이 뭐가 있는지는 모르지만 Kubernetes 클러스터를 운영하려고 할 때 궁금했던 내용 대부분의 방향을 잡아주고 있다.

원서라서 스터디가 아니었으면 못 봤을지도...

2018/05/19 16:32 2018/05/19 16:32