Khi triển khai hệ thống container trên Amazon EKS (Elastic Kubernetes Service), việc giám sát tài nguyên là vô cùng quan trọng để đảm bảo hiệu suất và ổn định của ứng dụng. Với AWS, bạn có thể sử dụng các dịch vụ như CloudWatch, Lambda, SNSSES để tạo ra một hệ thống giám sát tự động cho các tài nguyên EKS như CPU, RAM và Redis Cache. Trong bài viết này, chúng ta sẽ cùng xây dựng một hệ thống giám sát sử dụng AWS CDK (Cloud Development Kit), cung cấp khả năng cảnh báo kịp thời và thông báo qua nhiều kênh như SlackEmail.


Mô Hình Kiến Trúc Hệ Thống Giám Sát

Trước khi đi vào chi tiết cách xây dựng hệ thống, chúng ta hãy cùng nhìn qua mô hình tổng thể của giải pháp giám sát tài nguyên EKS. Mô hình này sẽ giúp bạn hiểu được cách các dịch vụ AWS như CloudWatch, Lambda, SNS, và SES tương tác với nhau để cung cấp hệ thống giám sát tự động.

Các Dịch Vụ AWS Liên Quan

Trước khi bắt tay vào việc xây dựng hệ thống, chúng ta hãy điểm qua các dịch vụ AWS sẽ được sử dụng trong giải pháp giám sát này:

CloudWatch Alarm:

  • CloudWatch Alarm giúp giám sát các chỉ số tài nguyên và gửi cảnh báo khi các ngưỡng chỉ số bị vượt qua. Trong trường hợp này, chúng ta sẽ giám sát các tài nguyên như CPU, RAM và Redis Cache của EKS.

AWS Lambda:

  • Lambda cho phép chúng ta chạy mã mà không cần quản lý server. Lambda sẽ được kích hoạt khi có cảnh báo từ CloudWatch, thực hiện các hành động như gửi tin nhắn đến Slack và gửi email qua SES.

SNS (Simple Notification Service):

  • SNS là dịch vụ thông báo, giúp gửi tin nhắn đến nhiều điểm nhận như email, SMS hoặc các endpoint HTTP/HTTPS. SNS sẽ giúp liên kết CloudWatch Alarm với Lambda.

SES (Simple Email Service):

  • SES là dịch vụ gửi email của AWS. SES sẽ được sử dụng để gửi thông báo qua email đến đội giám sát khi có cảnh báo CRITICAL.

1. Cấu Hình Container Insights Cho EKS

Để bắt đầu giám sát, bạn cần bật Container Insights cho EKS. Dịch vụ này cung cấp chỉ số hiệu suất cho các container và giúp CloudWatch thu thập dữ liệu.

Cấu hình trong CDK để bật Container Insights cho EKS như sau:

import * as cdk from 'aws-cdk-lib';
import * as eks from 'aws-cdk-lib/aws-eks';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

const vpc = new ec2.Vpc(this, 'EKS-VPC');
const cluster = new eks.Cluster(this, 'EKS-Cluster', {
   vpc,
   version: eks.KubernetesVersion.V1_21,
});

cluster.addAutoScalingGroupCapacity('ExtraCapacity', {
   instanceType: new ec2.InstanceType('t3.medium'),
   minCapacity: 2,
});

2. Tạo CloudWatch Alarm Cho Tài Nguyên Quan Trọng

Chúng ta sẽ tạo các CloudWatch Alarms cho tài nguyên CPU và RAM của EKS. Các ngưỡng alarm sẽ được thiết lập là:

  • WARNING (75%): Cảnh báo tài nguyên đang gần đạt ngưỡng.
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';

const cpuWarningAlarm = new cloudwatch.Alarm(this, 'CPUWarningAlarm', {
   metric: cluster.metricCpuUtilization(),
   threshold: 75,
   evaluationPeriods: 2,
   alarmName: 'Warning CPU Utilization',
   alarmDescription: 'Cảnh báo CPU đạt ngưỡng 75%',
   actionsEnabled: true,
});
  • CRITICAL (90%): Cảnh báo tài nguyên đã vượt ngưỡng và cần hành động ngay.
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';

const cpuCriticalAlarm = new cloudwatch.Alarm(this, 'CPUCriticalAlarm', {
   metric: cluster.metricCpuUtilization(),
   threshold: 90,
   evaluationPeriods: 2,
   alarmName: 'Critical CPU Utilization',
   alarmDescription: 'Cảnh báo CPU đạt ngưỡng 90%',
   actionsEnabled: true,
});

3. Thiết Lập SNS Và Lambda Để Gửi Thông Báo

Khi có cảnh báo từ CloudWatch, SNS sẽ kích hoạt Lambda để gửi thông báo đến Slack và email qua SES.

Tạo SNS Topic

import * as sns from 'aws-cdk-lib/aws-sns';
import * as snsSubscriptions from 'aws-cdk-lib/aws-sns-subscriptions';

const alertTopic = new sns.Topic(this, 'AlertTopic');

// Đăng ký Lambda với SNS Topic
alertTopic.addSubscription(new snsSubscriptions.LambdaSubscription(alertFunction));

Tạo Lambda Function

Lambda function sẽ gửi thông báo cảnh báo qua SlackSES (email) tới đội giám sát.

import * as lambda from 'aws-cdk-lib/aws-lambda';

const alertFunction = new lambda.Function(this, 'AlertFunction', {
   runtime: lambda.Runtime.NODEJS_14_X,
   handler: 'index.handler',
   code: lambda.Code.fromAsset('path/to/lambda'),
   environment: {
      SLACK_WEBHOOK_URL: 'https://hooks.slack.com/services/xxxx/xxxx/xxxx',
      SES_RECIPIENT: 'monitoring-team@example.com'
   },
});

Lambda Function Code (Node.js)

const https = require('https');
const aws = require('aws-sdk');
const ses = new aws.SES();

exports.handler = async (event) => {
   const alarmMessage = JSON.parse(event.Records[0].Sns.Message);
   const message = `Alert: ${alarmMessage.AlarmName}\nStatus: ${alarmMessage.NewStateValue}`;

   // Gửi thông báo đến Slack
   const slackWebhookUrl = process.env.SLACK_WEBHOOK_URL;
   const slackRequest = https.request(slackWebhookUrl, { method: 'POST' });
   slackRequest.write(JSON.stringify({ text: message }));
   slackRequest.end();
   
   // Gửi email qua SES
   const params = {
      Destination: { ToAddresses: [process.env.SES_RECIPIENT] },
      Message: {
         Body: { Text: { Data: message }},
         Subject: { Data: `Alert: ${alarmMessage.AlarmName}` }
      },
      Source: process.env.SES_RECIPIENT
   };
   
   await ses.sendEmail(params).promise();
};

4. Cấu Hình Role Và Quyền Truy Cập

Lambda cần có quyền để gửi email qua SES và gửi tin nhắn đến Slack. Cấu hình quyền như sau:

import * as iam from 'aws-cdk-lib/aws-iam';

const lambdaRole = new iam.Role(this, 'LambdaRole', {
   assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
});

lambdaRole.addToPolicy(new iam.PolicyStatement({
   actions: [
      "ses:SendEmail",
      "ses:SendRawEmail",
      "logs:*"
   ],
   resources: ['*'],
}));

5. Kết Luận

Với giải pháp này, bạn đã có một hệ thống giám sát tự động và mạnh mẽ cho các tài nguyên của EKS. Hệ thống sẽ giám sát các chỉ số như CPU, RAM, và Redis Cache, cảnh báo khi tài nguyên vượt ngưỡng WARNINGCRITICAL, đồng thời gửi thông báo kịp thời qua Slackemail thông qua Lambda, SNS, và SES.

Với CDK, bạn có thể dễ dàng mở rộng và bảo trì hệ thống này khi cần thiết. Hy vọng rằng bài viết này sẽ giúp bạn xây dựng một hệ thống giám sát hiệu quả cho môi trường EKS của mình.

6. Tài Liệu Tham Khảo

  1. AWS CDK Documentation
  2. CloudWatch Alarm Documentation
  3. AWS Lambda Documentation
  4. SNS (Simple Notification Service) Documentation
  5. SES (Simple Email Service) Documentation