이 튜토리얼에서는 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으로 전송합니다.
Slack 알림
Slack 알림을 설정하려면 Slack 애플리케이션을 만들고, 이 애플리케이션에 대한 수신 웹훅을 활성화한 다음 Slack 작업공간에 애플리케이션을 설치해야 합니다.
Slack 애플리케이션 만들기
이메일로 등록하거나 작업공간 관리자가 보낸 초대를 사용하여 Slack 작업공간에 가입합니다.
작업공간 이름과 Slack 계정 사용자 인증 정보를 사용하여 Slack에 로그인합니다.
-
- Create an app(앱 만들기) 대화상자에서 From scratch(처음부터)를 클릭합니다.
- App Name(앱 이름)을 지정하고 Slack 작업공간을 선택합니다.
- Create App을 클릭합니다.
- Add features and functionality(특징 및 기능 추가)에서 Incoming Webhooks(수신 웹훅)를 클릭합니다.
- Activate Incoming Webhooks(수신 웹훅 활성화) 전환 버튼을 클릭합니다.
- Webhook URLs for Your Workspace(작업공간의 웹훅 URL) 섹션에서 Add New Webhook to Workspace(작업공간에 새 웹훅 추가)를 클릭합니다.
- 승인 페이지가 열리면 알림을 수신할 채널을 선택합니다.
- 허용을 클릭합니다.
- Slack 애플리케이션의 웹훅이 Webhook URLs for Your Workspace(작업공간의 웹훅 URL) 섹션에 표시됩니다. 나중을 위해 이 URL을 저장합니다.
Cloud Run 함수 작성
GKE가 클러스터 알림을 Pub/Sub 주제에 게시하면 이벤트가 Slack 알림을 전송하도록 Cloud Run Functions를 트리거합니다.
gke_slack
이라는 새 디렉터리를 만든 후 디렉터리를 다음으로 변경합니다.mkdir ~/gke_slack && cd $_
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.js
및 package.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"
다음을 바꿉니다.
TOPIC_NAME
: 클러스터 알림을 사용 설정할 때 만든 Pub/Sub 주제의 이름입니다.REGION
: 함수의 Compute Engine 리전입니다.WEBHOOK_URL
: Slack 애플리케이션을 만들 때 Slack 애플리케이션에서 생성된 웹훅 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'
콘솔
Google Cloud 콘솔에서 Cloud Run 함수 페이지로 이동합니다.
함수 만들기를 클릭합니다.
구성 페이지에서 다음 단계를 수행하세요.
- 환경 드롭다운 목록에서 2세대를 선택합니다.
- 함수 이름에 slackNotifier를 지정합니다.
- 리전에서 Compute Engine 리전을 지정합니다.
- 트리거 섹션에서 Eventarc 트리거 추가를 클릭합니다.
- 창이 열리면 이벤트 제공자 드롭다운 목록에서 Cloud Pub/Sub를 선택합니다.
- 클러스터 알림을 사용 설정할 때 만든 Pub/Sub 주제를 선택합니다.
- 리전에서 함수와 동일한 Compute Engine 리전을 지정합니다.
- 트리거 저장을 클릭합니다.
- 런타임, 빌드, 연결, 보안 설정 섹션을 확장합니다.
- 런타임 환경 변수에서 변수 추가를 클릭합니다.
- 이름에 SLACK_WEBHOOK을 지정합니다.
- 값에 Slack 애플리케이션 만들기에서 생성한 내부 웹훅의 URL을 지정합니다.
- 다음을 클릭합니다.
코드 페이지에서 다음 단계를 수행하세요.
- 런타임 드롭다운 목록에서 Node.js 14를 선택합니다.
- 진입점에 slackNotifier를 지정합니다.
- 탐색 창에서 index.js를 선택하고 코드를 Cloud 함수 작성의 샘플 코드로 바꿉니다.
- 탐색 창에서 package.json을 선택하고 코드를 Cloud 함수 작성의 샘플 코드로 바꿉니다.
- 배포를 클릭합니다.
Cloud Run 함수의 배포를 완료한 후에는 GKE에서 클러스터 알림을 보낼 때마다 Slack 알림이 수신됩니다.
Slack 알림 확인
Autopilot 클러스터를 사용한 경우 다음과 같이 알림을 확인합니다.
- 제어 영역 업그레이드를 시작합니다.
- GKE가 노드를 새 버전으로 자동으로 업그레이드할 때까지 기다립니다. 소요 시간은 구성된 유지보수 기간 및 제외 항목에 따라 달라집니다.
- GKE에서 노드를 업그레이드한 후 Slack에서 메시지를 확인합니다.
표준 클러스터를 사용한 경우 다음과 같이 알림을 확인합니다.
특정 노드 풀을 새 버전으로 업그레이드합니다. 노드에서 GKE 버전을 변경하지 않으려면 현재 노드에 있는 동일한 버전으로 업그레이드하면 됩니다.
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