타사 서비스의 클러스터 알림 구성


이 튜토리얼에서는 Google Kubernetes Engine(GKE) 클러스터 알림을 수신하도록 타사 메시지 서비스를 구성하는 방법을 보여줍니다.

Slack 같은 서비스는 앱의 메시지를 Slack에 게시하는 간단한 방법인 수신 웹훅을 제공합니다. Cloud Run Functions는 경량형 Compute Engine 솔루션으로, 서버 또는 런타임 환경을 관리할 필요 없이 Google Cloud 이벤트(예: 클러스터 알림)에 응답하는 것이 유일한 목적인 독립형 함수를 만드는 데 사용됩니다. GKE가 Pub/Sub를 사용하여 클러스터 알림을 전송하면 트리거가 Slack 알림 전송 등의 작업을 실행하여 응답합니다.

IFTTT와 같은 애플리케이션 간 메시지 기능으로 구축된 많은 타사 서비스가 있습니다. 이 튜토리얼을 이러한 서비스와 연결하는 템플릿으로 사용할 수 있습니다.

이 튜토리얼에서는 Cloud Run Functions와 Pub/Sub를 사용하여 GKE 클러스터 이벤트에 대한 알림을 Slack으로 전송합니다.

목표

  • GKE에서 오는 외부 알림을 수신하도록 Slack 애플리케이션을 배포합니다.
  • Pub/Sub 알림을 Slack으로 전송하는 Cloud Run 함수를 작성합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE, Cloud Run functions, Cloud Build, Eventarc and Pub/Sub APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. Update and install gcloud components:

    gcloud components update
    gcloud components install alpha beta
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the GKE, Cloud Run functions, Cloud Build, Eventarc and Pub/Sub APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.
  12. To initialize the gcloud CLI, run the following command:

    gcloud init
  13. Update and install gcloud components:

    gcloud components update
    gcloud components install alpha beta
  14. GKE 클러스터 알림을 사용 설정합니다.

필요한 역할

클러스터 알림에 대한 Slack 알림을 설정하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

Compute Engine 기본 서비스 계정에 Cloud Run 함수를 호출하는 데 필요한 권한이 있도록 하려면 관리자에게 Compute Engine 기본 서비스 계정에 프로젝트에 대한 Cloud Functions 호출자(roles/cloudfunctions.invoker) IAM 역할을 부여해 달라고 요청하세요.

Slack 알림

Slack 알림을 설정하려면 Slack 애플리케이션을 만들고, 이 애플리케이션에 대한 수신 웹훅을 활성화한 다음 Slack 작업공간에 애플리케이션을 설치해야 합니다.

Slack 애플리케이션 만들기

  1. 이메일로 등록하거나 작업공간 관리자가 보낸 초대를 사용하여 Slack 작업공간에 가입합니다.

  2. 작업공간 이름과 Slack 계정 사용자 인증 정보를 사용하여 Slack에 로그인합니다.

  3. 새 Slack 앱 만들기

    1. Create an app(앱 만들기) 대화상자에서 From scratch(처음부터)를 클릭합니다.
    2. App Name(앱 이름)을 지정하고 Slack 작업공간을 선택합니다.
    3. Create App을 클릭합니다.
    4. Add features and functionality(특징 및 기능 추가)에서 Incoming Webhooks(수신 웹훅)를 클릭합니다.
    5. Activate Incoming Webhooks(수신 웹훅 활성화) 전환 버튼을 클릭합니다.
    6. Webhook URLs for Your Workspace(작업공간의 웹훅 URL) 섹션에서 Add New Webhook to Workspace(작업공간에 새 웹훅 추가)를 클릭합니다.
    7. 승인 페이지가 열리면 알림을 수신할 채널을 선택합니다.
    8. 허용을 클릭합니다.
    9. Slack 애플리케이션의 웹훅이 Webhook URLs for Your Workspace(작업공간의 웹훅 URL) 섹션에 표시됩니다. 나중을 위해 이 URL을 저장합니다.

Cloud Run 함수 작성

GKE가 클러스터 알림을 Pub/Sub 주제에 게시하면 이벤트가 Slack 알림을 전송하도록 Cloud Run Functions를 트리거합니다.

  1. gke_slack이라는 새 디렉터리를 만든 후 디렉터리를 다음으로 변경합니다.

    mkdir ~/gke_slack && cd $_
    
  2. gke_slack 디렉터리에 다음 파일을 만듭니다.

    index.js

    const functions = require('@google-cloud/functions-framework');
    const { IncomingWebhook } = require('@slack/webhook');
    
    const url = process.env.SLACK_WEBHOOK;
    
    const webhook = new IncomingWebhook(url);
    
    // Optionally filter what notification types to forward to Slack.
    // If empty, all types will be allowed.
    const allowedTypeURLs = [];
    
    // Register a CloudEvent callback with the Functions Framework that will
    // be executed when the Pub/Sub trigger topic receives a message.
    functions.cloudEvent('slackNotifier', pubSubEvent => {
        const data = decode(pubSubEvent.data.message.data);
    
        // Send message to Slack.
        if (isAllowedType(pubSubEvent.data.message.attributes)) {
            const message = createSlackMessage(data, pubSubEvent.data.message.attributes);
            webhook.send(message);
        }
    });
    
    // decode decodes a pubsub event message from base64.
    const decode = (data) => {
        return Buffer.from(data, 'base64').toString();
    }
    
    // isAllowedType can be used to filter out messages that don't match the
    // allowed type URLs. If allowedTypeURLs is empty, it allows all types.
    const isAllowedType = (attributes) => {
        if (allowedTypeURLs.length == 0) {
            return true;
        }
        for (var x in allowedTypeURLs) {
            if (attributes['type_url'] == allowedTypeURLs[x]) {
                return true;
            }
        }
        return false;
    }
    
    // createSlackMessage creates a message from a data object.
    const createSlackMessage = (data, attributes) => {
        // Write the message data and attributes.
        text = `${data}`
        for (var key in attributes) {
            if (attributes.hasOwnProperty(key)) {
                text = text + `\n\t\`${key}: ${attributes[key]}\``
            }
        }
        const message = {
            text: text,
            mrkdwn: true,
        };
        return message;
    }
    

    SLACK_WEBHOOK은 Slack 애플리케이션에서 생성된 웹훅 URL을 지정하는 Cloud Run Functions 환경 변수입니다. 함수를 배포할 때 환경 변수를 정의합니다.

    웹훅은 Cloud Run Functions의 메시지를 리슨하고 수신합니다. GKE가 Pub/Sub로 클러스터 알림을 전송(이벤트)하면 이 함수는 웹훅 URL로 메시지를 전송(트리거)하고 웹훅 URL은 구성된 Slack 작업공간으로 메시지를 전송합니다.

    텍스트 형식, 이미지 등 더 많은 내용을 포함하도록 createSlackMessage 함수에서 메시지를 확장할 수 있습니다. isAllowedType 함수는 유형 URL에 따라 알림에 대한 기본 필터링을 사용 설정하기 위해 제공됩니다. allowedTypeURLs에서 허용할 유형 URL을 지정할 수 있습니다. GKE 또는 Pub/Sub 구독에서 이미 알림을 필터링한 경우에는 이 함수가 필요하지 않습니다.

    package.json

    {
      "name": "gke-slack",
      "version": "0.0.1",
      "description": "Slack integration for GKE, using Cloud Run functions",
      "main": "index.js",
      "dependencies": {
        "@slack/webhook": "6.1.0",
        "@google-cloud/functions-framework": "^3.0.0"
      }
    }
    

    package.json은 프로그램의 다음 속성을 설명합니다.

    • 이름, 버전, 설명
    • 기본 런타임 파일
    • 종속 항목

    필요에 따라 종속 항목, 요구사항, 기타 정보를 더 추가할 수 있습니다.

이제 gke_slack 디렉터리에 index.jspackage.json 파일이 표시됩니다.

Cloud Run 함수 배포

Google Cloud CLI 또는 Google Cloud 콘솔을 사용하여 Cloud Run 함수를 배포할 수 있습니다.

gcloud

함수를 배포하려면 gke_slack 디렉터리에서 다음 명령어를 실행하세요.

gcloud functions deploy slackNotifier \
  --gen2 \
  --trigger-topic=TOPIC_NAME \
  --runtime=nodejs14 \
  --entry-point=slackNotifier \
  --region=REGION \
  --source=. \
  --set-env-vars="SLACK_WEBHOOK=WEBHOOK_URL"

다음을 바꿉니다.

출력은 다음과 비슷합니다.

Deploying function…
availableMemoryMb: 256
entryPoint: slackNotifier
environmentVariables:
  SLACK_WEBHOOK: https://hooks.slack.com/services/…
eventTrigger:
  eventType: google.pubsub.topic.publish
  failurePolicy: {}
  resource: projects/PROJECT_ID/topics/TOPIC_NAME
  service: pubsub.googleapis.com
labels:
  deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/us-central1/functions/slackNotifier
runtime: nodejs10
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/…
status: ACTIVE
timeout: 60s
updateTime: 'YYYY-MM-DDThh:mm:ssZ'
versionId: '1'

콘솔

  1. Google Cloud 콘솔에서 Cloud Run 함수 페이지로 이동합니다.

    Cloud Functions로 이동

  2. 함수 만들기를 클릭합니다.

  3. 구성 페이지에서 다음 단계를 수행하세요.

    1. 환경 드롭다운 목록에서 2세대를 선택합니다.
    2. 함수 이름slackNotifier를 지정합니다.
    3. 리전에서 Compute Engine 리전을 지정합니다.
    4. 트리거 섹션에서 Eventarc 트리거 추가를 클릭합니다.
    5. 창이 열리면 이벤트 제공자 드롭다운 목록에서 Cloud Pub/Sub를 선택합니다.
    6. 클러스터 알림을 사용 설정할 때 만든 Pub/Sub 주제를 선택합니다.
    7. 리전에서 함수와 동일한 Compute Engine 리전을 지정합니다.
    8. 트리거 저장을 클릭합니다.
    9. 런타임, 빌드, 연결, 보안 설정 섹션을 확장합니다.
    10. 런타임 환경 변수에서 변수 추가를 클릭합니다.
    11. 이름SLACK_WEBHOOK을 지정합니다.
    12. Slack 애플리케이션 만들기에서 생성한 내부 웹훅의 URL을 지정합니다.
    13. 다음을 클릭합니다.
  4. 코드 페이지에서 다음 단계를 수행하세요.

    1. 런타임 드롭다운 목록에서 Node.js 14를 선택합니다.
    2. 진입점slackNotifier를 지정합니다.
    3. 탐색 창에서 index.js를 선택하고 코드를 Cloud 함수 작성의 샘플 코드로 바꿉니다.
    4. 탐색 창에서 package.json을 선택하고 코드를 Cloud 함수 작성의 샘플 코드로 바꿉니다.
    5. 배포를 클릭합니다.

Cloud Run 함수의 배포를 완료한 후에는 GKE에서 클러스터 알림을 보낼 때마다 Slack 알림이 수신됩니다.

Slack 알림 확인

Autopilot 클러스터를 사용한 경우 다음과 같이 알림을 확인합니다.

  1. 제어 영역 업그레이드를 시작합니다.
  2. GKE가 노드를 새 버전으로 자동으로 업그레이드할 때까지 기다립니다. 소요 시간은 구성된 유지보수 기간 및 제외 항목에 따라 달라집니다.
  3. GKE에서 노드를 업그레이드한 후 Slack에서 메시지를 확인합니다.

표준 클러스터를 사용한 경우 다음과 같이 알림을 확인합니다.

  1. 특정 노드 풀을 새 버전으로 업그레이드합니다. 노드에서 GKE 버전을 변경하지 않으려면 현재 노드에 있는 동일한 버전으로 업그레이드하면 됩니다.

  2. GKE에서 노드를 업그레이드한 후 Slack에서 메시지를 확인합니다.

Slack 알림은 다음과 비슷합니다.

Master is upgrading to version 1.20.10-gke.301.
    cluster_location: us-central1
    cluster_name: pubsub-cluster
    payload: {"resourceType":"MASTER", "operation":"operation-1632775054313-45128f4f", "operationStartTime":"2021-09-27T20:37:34.313742491Z", "currentVersion":"1.20.9-gke.1001", "targetVersion":"1.20.10-gke.301"}
    project_id: 729788050015
    type_url: type.googleapis.com/google.container.v1beta1.UpgradeEvent

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

개별 리소스 삭제

  1. 이 튜토리얼에서 만든 Cloud Run 함수를 삭제합니다.

    gcloud functions delete slackNotifier
    

    Google Cloud 콘솔에서 Cloud Run 함수를 삭제할 수도 있습니다.

  2. Pub/Sub 주제를 삭제합니다.

  3. Slack 앱을 삭제합니다.

다음 단계