GCP에서는 다음과 같은 방법으로 Google Cloud 서비스에 인증할 수 있다.
Workload Identity란, GKE에서 Google Cloud 서비스에 인증하는 데 권장되는 방식이다. 이 인증 방법이 사용 사례에 적합한 경우 가장 먼저 이 옵션을 선택해야 하나, 이 예시는 적합하지 않은 사용 사례를 다룬다.
GKE 클러스터의 각 노드는 Compute Engine 인스턴스이기 때문에 클러스터에서 실행되는 애플리케이션은 기본적으로 Compute Engine 기본 서비스 계정을 사용하여 인증을 시도하며, 연결된 범위가 상속된다.
기본 서비스 계정의 경우 구글 클라우드 서비스를 사용하기 위해 필요한 권한이 없을 수도 있다. 원한다면 권한을 확장할 순 있지만, 이는 보안상 추천되는 방법이 아니다.
애플리케이션의 서비스 계정을 만들고 인증 키를 Secrets에 넣을 수 있다. 이 가이드에서 중점을 두는 옵션이다.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/cloud-pubsub/deployment
gcloud 명령줄 도구에 프로젝트 ID와 Compute Engine 영역 옵션 입력 시간을 절약하기 위해 기본값 설정
gcloud config set project [project-id]
gcloud config set compute/zone [compute-zone]
Pub/Sub API 및 Resource Manager API 사용 설정
gcloud services enable cloudresourcemanager.googleapis.com pubsub.googleapis.com
pubsub-test라는 이름을 가진 컨테이너 클러스터를 만들어 Pub/Sub 구독자 애플리케이션 배포
gcloud container clusters create pubsub-test
샘플 애플리케이션은 echo
라는 Pub/Sub Topic에서 echo-read
라는 subscription을 사용한다.
gcloud pubsub topics create echo
gcloud pubsub subscriptions create echo-read --topic=echo
다음 명령어를 입력하여 애플리케이션 컨테이너 파일 배포
kubectl apply -f pubsub.yaml
cloud-pubsub/deployment/pubsub.yaml 파일의 내용은 다음과 같다.
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: apps/v1
kind: Deployment
metadata:
name: pubsub
spec:
selector:
matchLabels:
app: pubsub
template:
metadata:
labels:
app: pubsub
spec:
containers:
- name: subscriber
image: gcr.io/google-samples/pubsub-sample:v1
app: pubsub
레이블이 붙은 pubsub
이라는 이름의 Deployment가 생성된다.
다음 명령어를 입력하여 app: pubsub
레이블이 설정된 pod를 확인한다.
kubectl get pods -l app=pubsub
컨테이너가 시작되지 않고 CrashLoopBackOff
상태에 있는 것이 보인다.
이는 컨테이너가 다시 시작 후 반복적으로 비정상 종료됨을 나타낸다.
컨테이너는 다양한 원인으로 인해 비정상 종료 될 수 있는데, Pod의 로그를 확인하면 근본 원인을 해결할 수 있다.
다음 명령어를 실행하여 로그를 조사한다.
kubectl logs -l app=pubsub
애플리케이션에 Pub/Sub 서비스 쿼리 권한이 없다는 오류 메시지가 표시 된다.
GKE에서 실행되는 애플리케이션에 Google Cloud 서비스 액세스 권한을 부여하려면 서비스 계정을 사용해야 한다. 서비스 계정 사용시 애플리케이션과 연결된 IAM 권한 집합을 정의할 수 있다.
gcloud iam service-accounts create [SERVICE_ACCOUNT_ID] \
--display-name="[DISPLAY_NAME]"
gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member="serviceAccount:[SERVICE_ACCOUNT_ID]@[PROJECT_ID].iam.gserviceaccount.com" \
--role="[ROLE_NAME]"
다른 플랫폼이나 온프레미스와 같이 Google Cloud 외부에서 서비스 계정을 안전하게 사용하려면 공개, 비공개 키 쌍을 통한 서비스 계정 ID 설정이 필요하다. (서비스 계정은 최대 10개의 키를 가질 수 있다.)
gcloud iam service-accounts keys create ~/key.json \
--iam-account [sa-name]@[project-id].iam.gserviceaccount.com
이제 서비스 계정 키 파일이 현재 위치에 다운로드된다.
키 파일는 다시 다운로드할 수 없으며, 서비스 계정으로 인증하는 데 사용될 수 있으므로 안전하게 저장해야 한다.
현재 위치에 key.json
파일이 있다는 것을 알 수 있다.
이제 서비스 계정 키를 갖고 있으므로 이를 컨테이너에 로드 할 방법이 필요하다.
우선 이전에 생성된 key.json
파일 이름을 pubsub-key
라는 Secrets로 바꾸기 위해 다음 명령어를 실행한다.
kubectl create secret generic pubsub-key --from-file=key.json=[PATH-TO-KEY-FILE].json
Secrets 생성 후에는 현재 위치에서 이전 키 파일을 삭제한다.
rm -rf key.json
애플리케이션에서 pubsub-key
Secrets를 사용하려면 배포 사양을 다음과 같이 수정한다.
GOOGLE_APPLICATION_CREDENTIALS
환경 변수 설정다음 명령어를 입력하여 pubsub-with-secret.yaml 매니페스트 배포
kubectl apply -f ~/kubernetes-engine-samples/cloud-pubsub/deployment/pubsub-with-secret.yaml
cloud-pubsub/deployment/pubsub-with-secret.yaml 파일의 내용은 다음과 같다.
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: apps/v1
kind: Deployment
metadata:
name: pubsub
spec:
selector:
matchLabels:
app: pubsub
template:
metadata:
labels:
app: pubsub
spec:
volumes:
- name: google-cloud-key
secret:
secretName: pubsub-key
containers:
- name: subscriber
image: gcr.io/google-samples/pubsub-sample:v1
volumeMounts:
- name: google-cloud-key
mountPath: /var/secrets/google
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /var/secrets/google/key.json
pubsub-key
라는 Secret을 사용하는 google-cloud-key
라는 볼륨 정의/var/secrets/google
위치에서 google-cloud-key
를 사용할 수 있게 해주는 볼륨 마운트 정의/var/secrets/google/key.json
으로 설정된 GOOGLE_APPLICATION_CREDENTIALS
환경 변수 정의. Secret이 컨테이너에 마운트 된 후 사용자 인증 정보를 포함한다.다음 명령어를 입력하여 pod 상태가 Running인지 확인한다.
kubectl get pods -l app=pubsub
애플리케이션이 구성이 끝났으므로 echo
라는 다음 명령어를 입력하여 Pub/Sub Topic에 메시지를 게시한다.
gcloud pubsub topics publish echo --message="Hello, world!"
입력 결과, 애플리케이션에서 메시지가 선택되고 출력 스트림으로 출력 되는 것을 알 수 있다.
배포된 Pod의 로그를 조사하려면 다음 명령어를 입력한다.
kubectl logs -l app=pubsub
서비스 계정 사용자 인증 정보를 사용하여 Pub/Sub API에 인증을 수행하도록 GKE에서 애플리케이션을 성공적으로 구성하였다.
이 가이드에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 개별 리소스를 삭제해야 한다.
gcloud pubsub subscriptions delete echo-read
gcloud pubsub topics delete echo
gcloud container clusters delete pubsub-test