GKE는 완전 관리형 쿠버네티스 엔진으로서, 마스터노드에 대한 고가용성을 보장하고 클러스터에 대한 오토 스케일링과 오토 힐링, Stackdriver를 통한 로깅/모니터링, GPU/TPU지원, 워크로드 및 네트워크 보안 제공 등 쿠버네티스를 운용하기에 편리한 기능들을 제공한다. 

GKE의 생성은 클러스터를 생성하여 클러스터의 네트워크, 보안을 설정하고 Worker노드 풀을 정의하여 실제 Pod가 구동될 노드의 사양을 정의한다. 

 

1. 클러스터 생성


실제 Pod가 구동될 Worker Node를 정의하고 클러스터를 구성한다.

좌상단 메뉴 →  Kubernetes Engine →  Clusters →  Create Cluster

 

1.1. Cluster Basics

Location Type/Master Version 선택

GKE 클러스터는 Zone/Region단위로 배포가 가능하다. 가용성을 고려하여 선택한다. (공식적으로 Regional Cluster 선호)

Kubernetes 엔진 버전을 선택한다. Release Channel을 선택하면 추후에 자동으로 Node에 대한 업데이트가 진행되며, Static을 선택하면 유저가 수동으로 노드 업데이트를 진행해야 한다. Release Channel은 베타 서비스 이므로 안정성을 고려하여 선택한다. 

  • 최신 Kubernetes 버전: 1.17.2(2020년 2월 25일 현재)
  • Release Channel (Beta)
    Rapid(1.16.5) Regular(1.15.7) Stable(1.14.10)
  • Static Version
    GKE Master Node 지원 최신 버전(Static): 1.15.9-gke.9
    GKE Worker Node 지원 최신 버전: 1.15.9-gke.9(Master Node의 버전과 같거나 낮은 버전만 선택 가능) 

 

2. Node Pools 정의


GKE는 여러개의 Node Pool을 정의하여 사용할 수 있다. 각각의 Pool 마다 인스턴스 타입, size, 오토스케일링, 라벨링 등의 설정을 통해 pod 배포 전략을 수립할 수 있다. 

 

2.1. Node 기본 정의

Size

Pool을 추가할 때 기본적으로 기동할 Worker Node 수를 정의할 수 있다. Enable Autoscaling을 통해 오토스케일링 설정이 가능하다. 

Regional을 선택한 경우, Zone마다 생성할 Node 숫자를 입력하게 되므로, zone 수 만큼 곱한 Node가 생성됨을 유의한다. 

Automation

위에서 Kubernetes의 버전을 Release Channel을 통해 선택하면, 자동적으로 auto-upgrade/auto-repair가 선택되어있다. 이 옵션들은 쿠버네티스의 새 버전이 나오면 자동으로 Node Pool에 속한 워커의 버전을 업그레이드 해 주며, Node의 health를 체크하여 상태를 회복시켜준다. 

Enable Surge Upgrade를 선택하면 Node의 업그레이드가 진행되는 동안, 가용성을 위해 추가적인 노드(Max Surge 한계)가 일시적으로 생성되어 Max Unavailable 이상의 활성 Node를 확보해준다. 

 

2.2. Nodes 옵션

Nodes

Worker Node의 VM 타입 선택할 수 있다. Boot Disk/VM Security/Management 등을 설정 가능하다.

Machine Configuration

Node의 OS Image로 Container-Optimized OS와 Ubuntu 옵션이 있으며, 추가적으로 containerd 런타임을 선택 가능하다. 

Node의 Machine Type을 지정할 수 있으며, Compute Engine과 동일하게 지정 가능하다. 필요한 목적에 맞게 Configuration을 진행한다. 

CPU Platform으로 Intel의 platform 중 선택이 가능하다. 추가적으로 NVIDIA Tesla 모델 중 GPU선택이 가능하다. 

Boot Disk의 type(ssd/pv)과 size를 선택할 수 있다. Preemptible nodes는 가용성이 보장되지 않는 저렴한 node 옵션이다. 

Networking

Maximum pods per node를 지정할 수 있다. Kubernetes default로 110으로 지정되어 있으며, Node의 성능 문제(주로 Memory)로 스케쥴링 제한을 위해 설정할 수 있다. Node 안에서 Pod의 address range가 /24로 지정되어 있으므로 8-110 사이의 pod 수만 제한할 수 있다. 

Network Tag를 설정하여 VPC/Subnet 단위에서 firewall rules를 적용할 수 있다. 필요한 tag를 부착한다. 

 

2.3. Node Security

Service Account

GKE에 사용할 서비스 계정을 선택한다. 지정한 서비스 계정이 Node의 서비스 계정이 된다. 

Integrity Monitoring(무결성 모니터링)

무결성 모니터링을 사용하면 Stackdriver 보고서를 사용하여 보안 노드의 런타임 부팅 무결성을 모니터링및 확인 가능

Secure Booting(안전한 부팅)

보안 부팅을 사용하면 부팅 수준 및 커널 수준의 멀웨어와 루트킷으로부터 노드를 보호

 

2.4. Node Metadata

Kubernetes Labels

kubernetes labels는 key-value 구조로, 이 Node Pool에 존재하는 모든 Node에 label이 적용된다.

Node Taints(beta)

Taint를 적용하면 Node에 스케쥴링 옵션을 지정할 수 있다. 적용한 key-value에 대한 Toleration이 없는 경우 아래의 옵션에 따라 스케쥴링이 제한된다.

  • No_EXECUTE
    Pod가 이미 실행중이면 Pod가 제거되고, 아직 노드에서 실행되지 않는 경우 노드에 예약되지 않음
  • NO_SCHEDULE
    Toleration이 없는 경우 Pod가 노드에서 예약되지 않음
  • PREFER_NO_SCHEDULE
    이 Taint를 허용하지 않는 Pod가 예약되지 않음

GCE Instance Metadata

Node로 동작하는 GCE Instance의 metadata GKE 1.12버전부터 GCE 메타데이터의 엔드포인트가 사용 불가하다.

 

3. Cluster 정의


3.1. Automation

클러스터 단위의 자동화에 대해 정의한다.

Enable Maintenance Window

사용 설정 하면 정해진 시간에만 Node의 변경을 수행한다. Maintenance exclusions를 설정하여 Maintenence Window에서 제외할 시점을 설정할 수 있다.

Enable Vertical Pod Autoscaling

활성화 시 Node에 구동중인 컨테이너의 CPU와 Memory 사용량을 분석하여 Node에서 자동으로 컨테이너의 CPU/Memory Request를 조정한다.

Enable node auto-provisioning

활성화하면 자동으로 새로운 Node Pool을 프로비저닝 한다. 하단에서 리소스를 정의할 수 있다. 비활성화 하면 사용자가 생성한 Node Pool 집합에서만 새로운 Node를 생성한다.

Availability/Networking/Security and Additional Features

Availability

리전 안에서 추가로 노드를 배포할 존 선택 가능

Networking

GKE가 위치할 VPC 및 네트워크 선택이 가능하다. 

Pod에 부여할 Cluster IP 대역과 Node의 최대 Pod 수, Service에 부여할 IP 주소 범위를 설정할 수 있다.

 

3.2. Networking

Public Cluster

기본 설정으로, 네트워크 안에 있다면 Node에 접근이 가능하다. 

Private Cluster(영구)

클러스터를 비공개로 전환하여 엑세스를 제한하는 옵션이다. 

  • 노드에 공개 IP가 없고 마스터에 엑세스 불가하다. 
  • Cloud NAT/사설 NAT Gateway 관리 필요
  • LB부착 또는 NodePort를 통해 외부에서 파드로 port/api로 접근 가능하다. 

Network/Node subnet

Cluster가 생성될 네트워크/서브넷을 지정한다. 

Access master using its external IP address(영구)

비공개 클러스터에서 마스터에 엑세스 하기 위해 접근 가능한 IP 대역을 설정할 수 있다. CloudShell을 통해 접근하기 위해서는 CloudShell의 IP대역 또한 추가해야 한다. 

  • 마스터 IP 범위: 마스터 VPC의 비공개 RFC 1918 범위
  • 클러스터 외부의 접근 가능한 IP대역을 지정하는 것이므로 마스터 IP 범위가 클러스터 VPC의 서브넷과 중복 불가
  • 마스터와 클러스터가 VPC 피어링을 사용하여 비공개로 통신

Advanced networking options

Enable VPC-native traffic routing(영구)

Alias IP를 활용하여 GCP 서비스와 통합되며, 더욱 안전한 네트워킹을 지원한다. 비공개 클러스터를 사용 설정 한 경우 자동으로 활성화된다. 

Automatically create secondary ranges

Cluster에 의해 사용될 IP 대역을 GKE가 추가적으로 설정하는 옵션이다. Pod의 IP 대역과, 서비스로 노출될 IP 대역을 지정할 수 있다. 지정한 서브넷이 충분한 IP 대역을 가지고 있지 않으면 자동으로 활성화된다. 

Enable Intranode Visibility

활성화하면 Pod-to-Pod 트래픽에 가시성이 생긴다. 이를 통해 VPC flow logging 또는 다른 트래픽 관련 VPC 기능을 사용할 수 있다. 

Enable HTTP Load Balancing

HTTP 부하 분산을 하기 위해 GKE에 Ingress를 설정하고 Google Cloud Load Balancer를 반드시 사용해야 한다. 활성화하면 Node에 Ingress Controller가 설치된다. 

Enable master authorized networks

활성화하면 신뢰할 수 없는 GCP 외부 IP로부터 클러스터에 접근이 불가해진다. Authorized network를 추가적으로 설정하여 접근 가능한 IP 대역을 설정할 수 있다. 

Enable Network Policy

클러스터 관리자가 Pod 레벨에서 네트워크 권한을 지정할 수 있다. 사용하기 위해서 Calico가 강제된다.

 

3.3. Security

기본 설정

Binary Authorization 사용 설정

Kubernetes 클러스터에 배포되는 이미지에 대해 Policy Control을 할 수 있다. 

  • 클러스터의 Binary Authorization을 구성하려면 우선 Binary Authorization API 를 사용 설정 필요

Enable Shilded GKE Nodes

클러스터에 join하는 Node에 대해 암호화를 적용한다. 1.18버전부터 디폴트로 설정된다. 

Enable Workload Identity

작업 부하 ID(Workload Identity) 사용설정(베타)

  • Kubernetes 서비스 계정으로 실행되는 모든 Pod -> Google API에 안전하게 연결 가능
  • GCE 기본 서비스 계정 사용 불가
  • 작업 부하 ID를 사용하면 Kubernetes Engine 작업 부하에서 Google API에 안전하게 연결 가능
    작업 부하 ID는 여러 클러스터에서 ID를 집계하기 위해 ID 네임스페이스를 사용
    ID 네임스페이스에서 IAM은 동일한 이름과 Kubernetes 네임스페이스를 공유하는 Kubernetes 서비스 계정을 동일한 주 구성원으로 취급

Enable Google Groups for RBAC

RBAC용 Google 그룹스 사용 설정(베타)

  • GKE용 Google 그룹스를 사용하면 G Suite Google 그룹의 구성원에게 역할을 부여 가능
  • G Suite 관리자가 K8s또는 Cloud Console과 무관한 외부에서 사용자와 그룹 관리

Legacy Security Options

Enable legacy authorization

이전 승인 사용 설정

  • 기존 클러스터나 워크플로를 지원하는 클러스터 내 권한에 대한 이전 승인이 사용 설정
  • 클러스터 내 권한의 전체 RBAC 지원에 대한 이전 승인은 사용 중지

Enable Application-layer Secrets Encryption

애플리케이션 레이어의 쿠버네티스 시크릿에 대한 암호화 설정

  • KMS 관리 키로 etcd의 비밀번호 보호 -> 비활성화 하더라도 이미 암호화 되어있음(추가 보안 레이어 제공)

Enable basic authentication

기본 인증 사용 설정

  • 기본 인증을 사용하면 사용자가 사용자 이름 및 비밀번호로 클러스터에 인증가능
  • 사용 중지하면 클라이언트 인증서 또는 IAM으로 계속 클러스터에 인증가능
  • 기본인증 활성화 -> ID/PW 클러스터 접속 불가 -> 클라이언트 인증서/IAM
  • 클러스터의 보안을 극대화하려면 이 옵션을 사용 중지한 상태로 두세요. 기본 인증은 전송된 사용자 인증 정보에 대한 기밀 보호를 제공하지 않으므로 권장되지 않습니다.

Issue a client certificate

클라이언트 인증서 발급 (영구적)

  • 버전 1.12부터 클러스터에 기본 인증이 포함되며 클러스터 인증서 발급이 기본적으로 사용 중지
  • 클라이언트 인증서는 클라이언트에서 클러스터 엔드포인트에 인증하는 데 사용되는 base64로 인코딩된 공개 인증서
  • 클라이언트 인증서 비활성화 -> 기본 인증(권장되지 않음) 또는 IAM으로 계속 클러스터에 인증가능

보안 GKE 노드 사용 설정 (사용 중지 가능/Node 리부팅 필요)

  • 기존 클러스터나 워크플로를 지원하는 클러스터 내 권한에 대한 이전 승인이 사용 설정됨
  • 클러스터 내 권한의 전체 RBAC 지원에 대한 이전 승인은 사용 중지됨
  • GCE 보안 VM 기반 구축
    노드OS 출처 확인
    루트키트/부트키트 보호
    추가비용X/시작 로그 0.5KB 더 생성 - Stackdriver Logging
    보안부팅(Secure Booting) - 타사의 서명되지 않은 커널 모듈 로드 불가: 기본적으로 사용 중지
    무결성 모니터링(Integrity Monitoring)

 

3.4. Metadata

Cluster에 대한 Description/Label을 설정할 수 있다. 

 

3.5. Features

Cluster에 대한 Description/Label을 설정할 수 있다. 

Serverless

Enable Cloud Run for Anthos

Stateless app과 function을 Cloud Run을 통해 배포할 수 있다. 활성화하면 Cloud Run이 배포될 수 있도록 기저의 리소스에 대한 관리와 스케일링을 진행한다. 

활성화 하기 위해서 Machine Type이 2vCPU 이상이어야 한다. 

Telemetry

Stackdriver와 관련된 설정이다. 

Legacy Stackdriver/GKE용 Stackdriver에 대해 선택 가능하다.

  • Legacy Stackdriver: 추후 GKE용 Stackdriver로 전환 필요(버전에 따라 Deprecated)
    콘솔에서 모니터링/로깅 확인 가능
    Stackdriver 모니터링 사용 설정
    Stackdriver 로깅 사용 설정
  • System and Workload Logging and Monitoring: GKE 1.12.7~1.13에서 권장
    GKE용 Stackdriver
    Stackdriver Kubernetes Engine Monitoring Console을 지원
    클러스터 주요 측정항목 확인 가능
    서비스/인프라/워크로드 별로 클러스터 확인 가능
    네임스페이스/노드/작업부하/서비스/pod/컨테이너 검사 가능

기타 Feature에 대한 설정

클라우드 TPU 사용 설정(영구)

머신러닝 가속을 위한 Cloud TPU 사용 설정

Enable Kubernetes alpha features in this cluster

현재 버전의 kubernetes의 alpha feature에 대한 사용 여부 설정

Master의 version이 Release Channel로 설정되어 있는 경우 활성화할 수 없다. 

GKE 사용 미터링 허용

클러스터의 리소스 사용량을 네임스페이스와 라벨에 따라 분류한다. 활성화하기 위해서 BigQuery 데이터셋이 필요하며, GKE에서 해당 데이터셋을 사용할 수 있도록 설정하는 것이 필요하다. Network Egress와 Resource Consumption에 대해 미터링이 가능하다. 

Istio 사용 설정(베타)

쿠버네티스용 서비스 메시, 사용 설정시 클러스터에 자동으로 설치된다. mTLS 설정으로 Permissive와 Strict를 선택할 수 있다. Permissive를 선택할 경우, 서비스가 mTLS와 HTTP 트래픽 모두 수용 가능하다. Strict를 사용한 경우 mTLS통신이 강제된다. 

Enable Application Manager(베타)

애플리케이션의 라이프싸이클을 관리하는 GKE 컨트롤러인 Application Manager를 설정한다. 

GitOps 측면에서 사용이 권장된다. 

Enable GCP Compute Persistent Disk CSI Driver(베타)

Compute Engine Persistent Disk CSI Driver를 자동으로 배포하고 관리한다.