Google Kubernetes Engine(GKE) 클러스터는 제어 영역과 노드라고 부르는 작업자 머신으로 구성됩니다. GKE 클러스터에서 컨테이너화된 Kubernetes 워크로드를 실행할 수 있습니다. 노드는 컨테이너화된 애플리케이션 및 기타 워크로드를 실행하는 작업자 머신이고, 제어 영역은 클러스터의 통합 엔드포인트입니다. 자세한 내용은 GKE 클러스터 아키텍처를 참조하세요.
Kubernetes API 서버는 제어 영역에서 실행되며 Kubernetes API 호출을 통해 클러스터의 Kubernetes 객체와 상호작용할 수 있게 해줍니다. 객체는 Kubernetes 시스템에 있는 영구 항목이며 클러스터 상태를 나타냅니다. 자세한 내용은 Kubernetes 문서에서 Kubernetes 객체와 "Kubernetes API 참조" 페이지로 연결되는 API 개요를 참조하세요.
이 문서에서는 워크플로에서 Kubernetes API 커넥터를 사용하여 GKE 클러스터의 제어 영역에 호스팅되는 Kubernetes 서비스 엔드포인트를 요청하는 방법을 보여줍니다. 예를 들어 커넥터를 사용해서 Kubernetes 배포를 만들고, 작업을 실행하고, 포드를 관리하고, 프록시를 통해 배포된 앱에 액세스할 수 있습니다. 자세한 내용은 Kubernetes API 커넥터 개요를 참조하세요.
시작하기 전에
이 문서의 작업을 진행하려면 특정 기본 요건이 완료되었는지 확인합니다.
API 사용 설정
Kubernetes API 커넥터를 사용하여 Kubernetes API 객체에 액세스할 수 있으려면 먼저 다음 API를 사용 설정해야 합니다.
- Google Kubernetes Engine API: GKE를 사용하여 컨테이너 기반 애플리케이션을 빌드 및 관리합니다.
Workflows API: 워크플로 정의 및 실행을 관리합니다. Workflows API를 사용 설정하면 Workflow Executions API가 자동으로 사용 설정됩니다.
콘솔
API를 사용 설정합니다.
gcloud
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
API를 사용 설정합니다.
gcloud services enable container.googleapis.com workflows.googleapis.com
서비스 계정 만들기
워크플로 ID로 작동하는 사용자 관리 서비스 계정을 만들고 워크플로가 클러스터 내부의 Kubernetes API 객체에 액세스할 수 있도록 여기에 Kubernetes Engine Developer(roles/container.developer
) 역할을 부여합니다.
콘솔
Google Cloud 콘솔에서 서비스 계정 페이지로 이동합니다.
프로젝트를 선택한 후 서비스 계정 만들기를 클릭합니다.
서비스 계정 이름 필드에 이름을 입력합니다. Google Cloud 콘솔은 이 이름을 기반으로 서비스 계정 ID 필드를 채웁니다.
서비스 계정 설명 필드에 설명을 입력합니다. 예를 들면
Service account for Kubernetes API
입니다.만들고 계속하기를 클릭합니다.
역할 선택 목록에서 Kubernetes Engine Developer 역할을 필터링하고 선택합니다.
계속을 클릭합니다.
계정 만들기를 마치려면 완료를 클릭합니다.
gcloud
서비스 계정을 만듭니다.
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME
을 서비스 계정 이름으로 바꿉니다.서비스 계정에
container.developer
역할을 부여합니다.gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/container.developer
PROJECT_ID
를 Google Cloud 프로젝트 ID로 바꿉니다.
IAM 및 Kubernetes 역할 기반 액세스 제어(RBAC)를 모두 사용해서 GKE 클러스터에 대한 액세스를 제어할 수 있습니다.
IAM은 Kubernetes에 국한되지 않습니다. 다양한 Google Cloud 제품의 ID 관리 기능을 제공하며 주로 Google Cloud 프로젝트 수준에서 작동합니다.
Kubernetes RBAC는 Kubernetes의 핵심 구성요소로, 클러스터에 속한 객체 또는 객체 유형에 대한 역할(권한 집합)을 만들고 부여할 수 있습니다. 주로 GKE를 사용하고 클러스터 내 모든 객체 및 작업에 세분화된 권한이 필요한 경우 Kubernetes RBAC를 사용하는 것이 가장 좋습니다.
자세한 내용은 액세스 제어를 참조하세요.
GKE 클러스터 만들기
Kubernetes API 커넥터를 사용하려면 공개 또는 비공개 GKE 클러스터가 이미 생성되어 있어야 합니다. 비공개 클러스터의 노드에는 내부 IP 주소만 있습니다. 즉, 노드와 포드는 기본적으로 인터넷에서 격리되어 있습니다. 자세한 내용은 비공개 클러스터를 참조하세요.
또한 다른 수준의 유연성, 책임, 제어를 부여하는 작업 모드를 지정할 수 있습니다. 예를 들어 노드, 확장, 보안, 기타 사전 구성된 설정을 포함하여 Google이 클러스터 구성을 관리하는 GKE의 작업 모드인 Autopilot 클러스터를 만들 수 있습니다. 자세한 내용은 GKE 작업 모드 선택을 참조하세요.
GKE 클러스터를 아직 만들지 않았으면 GKE 클러스터에 웹 서버 컨테이너화된 애플리케이션을 배포할 수 있습니다. 또는 이 문서의 안내를 시도하기 위해 다음을 수행하여 Autopilot 클러스터를 만들 수 있습니다.
콘솔
Google Cloud 콘솔에서 Kubernetes 클러스터 페이지로 이동합니다.
add_box만들기를 클릭합니다.
클러스터 모드를 선택하라는 메시지가 표시되면 Autopilot을 선택합니다.
클러스터 기본사항 섹션에서 다음을 완료합니다.
- 클러스터의 이름을 입력합니다(예:
hello-cluster
). - 클러스터에 사용할 리전(예:
us-central1
)을 선택합니다.
- 클러스터의 이름을 입력합니다(예:
다음: 네트워킹을 클릭합니다.
IPv4 네트워크 액세스 섹션에서 공개적으로 액세스할 수 있는 엔드포인트로 클러스터를 만들려면 공개 클러스터를 선택합니다.
다른 모든 설정은 기본값을 그대로 사용합니다.
만들기를 클릭합니다.
클러스터 생성이 완료되는 데 몇 분이 걸릴 수 있습니다. 클러스터가 생성되었으면 실행 중임을 나타내는
체크표시가 나타납니다.gcloud
다음 명령어를 실행합니다.
gcloud container clusters create-auto CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID
다음을 바꿉니다.
CLUSTER_NAME
: GKE 클러스터의 이름입니다(예:hello-cluster
).LOCATION
: 클러스터에 사용할 리전입니다(예:us-central1
).PROJECT_ID
: Google Cloud 프로젝트 ID입니다.
클러스터 생성이 완료되는 데 몇 분이 걸릴 수 있습니다. 클러스터가 생성되면 다음과 유사한 출력이 표시됩니다.
Creating cluster hello-cluster...done.
Created [https://container.googleapis.com/v1/projects/MY_PROJECT
/zones/us-central1/clusters/hello-cluster].
[...]
STATUS: RUNNING
커넥터를 사용하여 HTTP 요청 전송
Kubernetes API 커넥터를 사용하여 GKE 클러스터 제어 영역에 HTTP 요청을 전송할 수 있습니다. 예를 들어 다음 워크플로는 지정된 Kubernetes 클러스터에 nginx-deployment
라는 배포를 만듭니다. 배포는 필요한 상태를 설명합니다. 여기에서는 nginx:1.14.2
이미지로 3개 포드를 실행하고 서비스를 포트 80으로 노출합니다. project
및 location
을 지정하지 않으면 해당 워크플로의 기본값으로 지정됩니다.
자세한 내용은 Kubernetes API 커넥터 함수 gke.request의 참조 페이지를 확인하세요.
다음에 유의하세요.
path
필드는 Kubernetes API 메서드 경로에 해당합니다. 자세한 내용은 Kubernetes 문서에서 "Kubernetes API 참조" 페이지로 연결되는 API 개요를 참조하세요.- 워크플로에서 HTTP 요청 오류를 파악하고 처리할 수 있습니다. 자세한 내용은 워크플로 오류를 참조하세요.
워크플로 배포
워크플로를 실행하기 전에 이를 만들고 배포해야 합니다.
콘솔
Google Cloud 콘솔에서 Workflows 페이지로 이동합니다.
만들기를 클릭합니다.
새 워크플로의 이름을 입력합니다(예:
kubernetes-api-request
).리전 목록에서 us-central1을 선택합니다.
이전에 만든 서비스 계정을 선택합니다.
다음을 클릭합니다.
워크플로 편집기에서 다음 워크플로 정의를 입력합니다.
YAML
JSON
다음을 바꿉니다.
CLUSTER_NAME
: GKE 클러스터의 이름입니다(예:hello-cluster
).PROJECT_ID
: Google Cloud 프로젝트 ID입니다.LOCATION
: 클러스터에 사용할 리전입니다(예:us-central1
).
배포를 클릭합니다.
gcloud
워크플로의 소스 코드 파일을 만듭니다.
touch kubernetes-api-request.JSON_OR_YAML
워크플로 형식에 따라
JSON_OR_YAML
을yaml
또는json
으로 바꿉니다.텍스트 편집기에서 다음 워크플로를 소스 코드 파일에 복사합니다.
YAML
JSON
다음을 바꿉니다.
CLUSTER_NAME
: GKE 클러스터의 이름입니다(예:hello-cluster
).LOCATION
: 클러스터에 사용할 리전입니다(예:us-central1
).
워크플로를 배포합니다.
gcloud workflows deploy kubernetes-api-request \ --source=kubernetes-api-request.
JSON_OR_YAML
\ --location=LOCATION
\ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
워크플로 실행
워크플로를 성공적으로 배포한 후 이를 실행할 수 있습니다. 워크플로를 실행하면 워크플로와 연결된 현재 워크플로 정의가 실행됩니다.
콘솔
Google Cloud 콘솔에서 Workflows 페이지로 이동합니다.
Workflows 페이지에서 워크플로를 선택하여 세부정보 페이지로 이동합니다.
Workflows 세부정보 페이지에서 play_arrow 실행을 클릭합니다.
실행을 다시 클릭합니다.
출력 창에서 워크플로 결과를 확인합니다.
성공하면 실행 상태가
Succeeded
로 표시되고 응답 본문이 반환됩니다.
gcloud
워크플로를 실행합니다.
gcloud workflows run kubernetes-api-request \ --location=LOCATION
성공하면 상태가 SUCCEEDED
로 표시되고 응답 본문이 반환됩니다.
커넥터를 사용하여 Kubernetes 작업 실행
Kubernetes API 커넥터를 사용하여 GKE 클러스터에서 Kubernetes 작업을 배포하고 실행할 수 있습니다. 다음 워크플로는 일련의 숫자를 반복 처리하는 Bash 스크립트를 실행하는 Kubernetes 작업을 만듭니다. 이 워크플로는 Kubernetes 작업이 완료될 때까지 최대 90초 동안 기다립니다. 그렇지 않으면 오류가 발생합니다. 작업이 완료된 다음에는 삭제됩니다.
상태에 Complete
유형의 조건이 포함되면 작업이 완료된 것으로 간주됩니다. 예를 들면 다음과 같습니다.
"status": { "conditions": [ { "type": "Complete", "status": "True" } ] }
작업이 실패하면 FailedJobError
태그가 반환됩니다. 예를 들면 다음과 같습니다.
{ "tags": ["FailedJobError"] "job": {...} "message":"Kubernetes job failed" }
자세한 내용은 다음 Kubernetes API 커넥터 함수에 대한 참조 페이지를 확인하세요.
워크플로 배포
워크플로를 실행하기 전에 이를 만들고 배포해야 합니다.
콘솔
Google Cloud 콘솔에서 Workflows 페이지로 이동합니다.
만들기를 클릭합니다.
새 워크플로의 이름을 입력합니다(예:
kubernetes-api-job
).리전 목록에서 us-central1을 선택합니다.
이전에 만든 서비스 계정을 선택합니다.
다음을 클릭합니다.
워크플로 편집기에서 다음 워크플로 정의를 입력합니다.
YAML
JSON
다음을 바꿉니다.
LOCATION
: 클러스터에 사용할 리전입니다(예:us-central1
).CLUSTER_NAME
: GKE 클러스터의 이름입니다(예:hello-cluster
).JOB_NAME
: Kubernetes 작업의 이름입니다(예:hello-job
).
배포를 클릭합니다.
gcloud
워크플로의 소스 코드 파일을 만듭니다.
touch kubernetes-api-job.JSON_OR_YAML
워크플로 형식에 따라
JSON_OR_YAML
을yaml
또는json
으로 바꿉니다.텍스트 편집기에서 다음 워크플로를 소스 코드 파일에 복사합니다.
YAML
JSON
다음을 바꿉니다.
LOCATION
: 클러스터에 사용할 리전입니다(예:us-central1
).CLUSTER_NAME
: GKE 클러스터의 이름입니다(예:hello-cluster
).JOB_NAME
: Kubernetes 작업의 이름입니다(예:hello-job
).
워크플로를 배포합니다.
gcloud workflows deploy kubernetes-api-job \ --source=kubernetes-api-job.
JSON_OR_YAML
\ --location=LOCATION
\ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
워크플로 실행
워크플로를 성공적으로 배포한 후 이를 실행할 수 있습니다. 워크플로를 실행하면 워크플로와 연결된 현재 워크플로 정의가 실행됩니다.
콘솔
Google Cloud 콘솔에서 Workflows 페이지로 이동합니다.
Workflows 페이지에서 워크플로를 선택하여 세부정보 페이지로 이동합니다.
Workflows 세부정보 페이지에서 play_arrow 실행을 클릭합니다.
실행을 다시 클릭합니다.
워크플로를 실행하는 데 몇 분 정도 걸릴 수 있습니다.
출력 창에서 워크플로 결과를 확인합니다.
결과는 다음과 비슷하게 표시됩니다.
{ ... }, "status": { "completionTime": "2023-10-31T17:04:32Z", "conditions": [ { "lastProbeTime": "2023-10-31T17:04:33Z", "lastTransitionTime": "2023-10-31T17:04:33Z", "status": "True", "type": "Complete" } ], "ready": 0, "startTime": "2023-10-31T17:04:28Z", "succeeded": 1, "uncountedTerminatedPods": {} } }
gcloud
워크플로를 실행합니다.
gcloud workflows run kubernetes-api-job \ --location=LOCATION
워크플로를 실행하는 데 몇 분 정도 걸릴 수 있습니다. 결과는 다음과 비슷하게 표시됩니다.
{
...
},
"status": {
"completionTime": "2023-10-31T17:04:32Z",
"conditions": [
{
"lastProbeTime": "2023-10-31T17:04:33Z",
"lastTransitionTime": "2023-10-31T17:04:33Z",
"status": "True",
"type": "Complete"
}
],
"ready": 0,
"startTime": "2023-10-31T17:04:28Z",
"succeeded": 1,
"uncountedTerminatedPods": {}
}
}