برنامه نویسی

راه اندازی پرهزینه EKS Cluster؟ AWS برای نجات!

خط داستان

هدف انجام یک خودکار بود استقرار Terraform Kubernetes. من در نهایت یک کلاستر EKS درجه تولید را با استفاده از ماژول‌های Terraform-EKS تهیه کردم و منابع AWS دیگری را ایجاد کرد که همراه با آن ادغام شوند. به عنوان مبتدی که بودم، خوشه را برای روزها در حال اجرا گذاشتم به این امید که بتوانم انواع مختلف برنامه های میکروسرویس را در همان خوشه مرتب کنم و در نهایت پاکسازی کنم. کل صورتحساب جمع آوری شده پس از مدتی فک فک و مشکل ساز بود اما AWS به کمک من آمد و همه چیز را مرتب کرد.

هدف

این شما را در فرآیند ایجاد یک EKS-Cluster استاندارد با استفاده از ماژول های Terraform در AWS EKS Cluster Creation و مراحل درخواست معافیت کل هزینه/قبض ها از AWS در AWS Bills Waiver راهنمایی می کند. فرآیند چشم پوشی برای بارهای کاری دیگر مفید است و نه فقط برای تنظیم این خوشه.

ملزومات:

  • یک حساب AWS، یک ردیف رایگان در اینجا ایجاد کنید.
  • به یک کاربر IAM با امتیازات مدیریت، کلیدهای مخفی و دسترسی وارد شوید.
  • سیستم عامل میزبان اوبونتو (رایانه شخصی محلی یا ماشین مجازی).
  • کد VS یا هر IDE مورد نظر شما.
  • یک سطل S3 برای ذخیره فایل های حالت terraform از راه دور
  • استفاده اولیه از ترمینال لینوکس

تاسیسات:

  • جدیدترین را نصب کنید Terraform در خط فرمان:
sudo apt update && apt upgrade -y
sudo apt install -y gnupg software-properties-common curl
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt update
sudo apt install terraform
terraform -v
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی نسخه Terraform

  • را نصب کنید پسوند Terraform توسط آنتون کولیکوف در کد VS برای نکات برجسته نحوی و کارایی.
  • نصب AWS CLI :
sudo apt-get update
sudo apt-get install -y less curl unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip -q awscliv2.zip
sudo ./aws/install
aws --version
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی نسخه AWS CLI

  • پیکربندی AWS CLI با aws configure دستور:

    • خروجی ها را با کلیدهای مخفی و دسترسی که قبلاً از کاربر IAM ایجاد شده است پر کنید
    • اضافه کردن us-east-1 به عنوان منطقه
    • جزئیات پیکربندی تست با aws configure list
    • بدون نیاز به ایجاد متغیرهای محیطی به عنوان runnng env | grep AWS از این رو، متغیرهای محیطی را که در برگه ترمینال دیگری تنظیم شده اند، تشخیص نمی دهد aws configure برای راه اندازی جهانی مناسب است.
    export AWS_ACCESS_KEY_ID="YOUR_AWS_ACCESS_KEY_ID"
    export AWS_SECRET_ACCESS_KEY="YOUR_AWS_SECRET_ACCESS_KEY"
    export AWS_DEFAULT_REGION="us-east-1"
    
  • نصب کوبکتل به عنوان ابزار خط فرمان که با خوشه Kubernetes تعامل دارد:
sudo apt-get update -y
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update -y
sudo apt-get install -y kubectl
kubectl version --client
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • (گزینه) نصب کنید graphviz برای تجسم فرآیند پلان زمینی:
sudo apt install graphviz
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

معماری

برپایی
این نسخه خلاصه شده از نحوه تشکیل خوشه از طریق ماژول terraform را نشان می دهد (بیشتر شبیه گروهی از منابع در هم تنیده که با هم استفاده می شوند). منابع دیگری مانند VPC، گروه‌های امنیتی، NAT و دروازه‌های اینترنت برای مسیریابی ترافیک از داخل زیرشبکه‌های خصوصی و اینترنت به ترتیب و غیره. در کنار آن ایجاد خواهد شد.
این راه‌اندازی دارای VPC است که با سه زیرشبکه عمومی و سه زیرشبکه خصوصی ایجاد شده است که با سه منطقه دسترسی موجود در آن مطابقت دارد. us-east-1 منطقه

مقادیر موجود در پیکربندی Terraform ثابت نیستند و می‌توانند بر اساس ترجیحات فرد تغییر کنند، اما من به مبتدیان پیشنهاد می‌کنم که این مقادیر دقیق را دنبال کنند تا باگ‌ها و خطاهای قابل اجتناب از بین بروند.

رویه ها:

  • با شبیه‌سازی git مخزن من به فهرست کاری ترجیحی بروید
    git clone https://github.com/wandexdev/k8s-microservices-deployment-via-CICD-terraform.git، سپس cd terraform/eks_creation-terraform/ برای تغییر دایرکتوری

توجه داشته باشید

مطمئن شوید که دایرکتوری کاری فعلی شما هست ~/k8s-microservices-deployment-via-CICD-terraform/terraform/eks_creation-terraform

با دستور تایید کنید pwd.

  • همه فایل‌های Terraform (.tf) مورد نیاز در پوشه موجود در مخزن من وجود دارند، می‌توانید یک پوشه برای خودتان ایجاد کنید تا به صورت دستی آن را بنویسید. .tf فایل ها اگر شما کار را نکرد مخزن را شبیه سازی کنید

    Terraform
    همه فایل های tf مورد نیاز
  • اکثر پیکربندی ماژول مورد استفاده از terraform-aws-modules/eks در Terraform’s Registry گرفته شده است. می توانید موارد بیشتری اضافه کنید/تغییر دهید لازم نیست ورودی‌ها یا تصمیم بگیرید که کدام منابع یا نسخه‌های ترجیحی را خارج از منابعی که قبلاً در مخزن خود انتخاب کرده‌ام، می‌خواهید.

  • ایجاد یک providers.tf فایلی برای شناسایی پلاگین های ارائه دهنده terraform خاص که مستقیماً با سرویس AWS تعامل دارند.


        provider "aws" {
            region  = var.region
        }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ایجاد یک s3_backend.tf فایل برای ذخیره فایل‌های حالت راه دور در یک سطل S3 خارجی، زیرا این اطمینان را ایجاد می‌کند که چندین کاربر یا سرور CI آخرین داده‌های وضعیت را قبل از اجرای terraform دریافت می‌کنند. آن نیز امن تر است. > PS
    > > لطفاً مطمئن شوید که سطل S3 قبل از مقداردهی اولیه terraform ایجاد شده است


        terraform {
        required_version = ">= 0.12"
        backend "s3" {
            bucket         = var.S3_bucket_name
            key            = var.bucket_key
            region         = var.region
        }
     }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ایجاد یک متغیرها.tf فایل برای اعلام همه متغیرهای مورد استفاده در این پروژه.

        #----------------------------BACKEND-------------------------
        variable "S3_bucket_name" {
            description = "name of S3 bucket for remote backend storage"
        }

        variable "bucket_key" {
            description = "It's the file path inside the bucket"
        }

        variable "region" {
            description = "The region of cluster deployment"
        }

        #--------------------------------VPC-------------------------------#

        variable "vpc_cidr_block" {
            description = "ip range for vpc"
        }

        variable "private_subnet_cidr_blocks" {
            description = "ip range for private subnet"
        }

        variable "public_subnet_cidr_blocks" {
            description = "ip range for public subnets"
        }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ایجاد یک vpc.tf فایل برای تنظیمات محیط خصوصی مجازی که EKS-cluster در آن ایجاد می شود.

        #-----------DATA SOURCE-------------------#
        # By state
        data "aws_availability_zones" "available" {
        }

        module "wandek8s-vpc" {
        source                                    = "terraform-aws-modules/vpc/aws"
        version                                   = "2.64.0"

        name                                      = "wandek8s-vpc"
        cidr                                      = var.vpc_cidr_block
        private_subnets                           = var.private_subnet_cidr_blocks
        public_subnets                            = var.public_subnet_cidr_blocks
        azs                                       = data.aws_availability_zones.available.names 

        enable_nat_gateway                        = true
        single_nat_gateway                        = true
        enable_dns_hostnames                      = true

        tags                                      = {
                "kubernetes.io/cluster/wandek8s-eks-cluster" = "shared"
        }

        public_subnet_tags                        = {
                "kubernetes.io/cluster/wandek8s-eks-cluster" = "shared"
                "kubernetes.io/role/elb"            = 1
        }

        private_subnet_tags                       = {
                "kubernetes.io/cluster/wandek8s-eks-cluster" = "shared"
                "kubernetes.io/role/internal-elb"   = 1
        }
        }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ایجاد کنید خروجی ها.tf فایل برای به اشتراک گذاری داده ها بین تنظیمات Terraform و ابزارهای خارجی. خروجی ها همچنین تنها راه برای اشتراک گذاری داده ها بین ماژول فرزند و ماژول ریشه پیکربندی هستند.

    output "cluster_id" {
    description       = "EKS cluster ID."
    value             = module.eks.cluster_id
    }

    output "cluster_name" {
    description       = "Amazon Web Service EKS Cluster Name"
    value             = module.eks.cluster_name
    }

    output "cluster_endpoint" {
    description       = "Endpoint for Amazon Web Service EKS "
    value             = module.eks.cluster_endpoint
    }

    output "region" {
    description       = "Amazon Web Service EKS Cluster region"
    value             = var.region
    }

    output "cluster_security_group_id" {
    description       = "Security group ID for the Amazon Web Service EKS Cluster "
    value             = module.eks.cluster_security_group_id
    }

    output "cluster_ca_certificate" {
    value             = module.eks.cluster_certificate_authority_data
    }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ایجاد کنید eks-cluster.tf فایلی که ارائه‌دهنده Terraform Kubernetes را برای ایجاد اشیاء Kubernetes، پیکربندی‌های ماژول، گروه‌های گره‌های تا حدی مدیریت‌شده + نمونه‌های گره برای ایجاد در خوشه و غیره مشخص می‌کند.

        #-----------provider to communicate with Kubernetes’ resources----------#

        provider "kubernetes" {
            host                        = module.eks.cluster_endpoint # end point of k8s (API server)
            token                       = data.aws_eks_cluster_auth.wandek8s-eks-cluster.token
            cluster_ca_certificate      = base64decode(module.eks.cluster_certificate_authority_data)
        }

        #--------Query data ------------#
        #data "aws_eks_cluster" "wandek8s-eks-cluster" {
        #    name                        = module.eks.cluster_id
        #}

        data "aws_eks_cluster_auth" "wandek8s-eks-cluster" {
            name                        = module.eks.cluster_name
        }

        module "eks" {
        source                        = "terraform-aws-modules/eks/aws"
        version                       = "19.10.0"

        cluster_name                  = "wandek8s-eks-cluster"
        cluster_version               = "1.24"

        subnet_ids                    = module.wandek8s-vpc.private_subnets
        vpc_id                        = module.wandek8s-vpc.vpc_id
        cluster_endpoint_public_access = true

        tags = {
            environment = "development"
            application = "wandek8s"
        }

        eks_managed_node_groups = {
            one = {
            min_size     = 1
            max_size     = 4
            desired_size = 3

            instance_types = var.instance_type
            }
        }
        }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • در نهایت یک را ایجاد کنید terraform.tfvars فایل برای وارد کردن مقادیر متغیر تعریف شده در متغیرها.tf فایل. محدوده‌های بلوک VPC CIDR، نام‌های منابع خاص و غیره در اینجا قرار دارد. لطفاً مطمئن شوید که مسیر مطلق کلید خصوصی و عمومی واقع در سیستم‌عامل HOST را وارد کنید زیرا به دلایل امنیتی مال من حذف شده است.

این یک فایل بسیار حساس است که نباید به کنترل نسخه فشار داده شود.


        S3_bucket_name               = "wandek8s-bucket"

        bucket_key                   = "cicd-server/state.tfstate"

        region                       = "us-east-1"

        key_pair                     = "cicd-server"

        local_public_key_location    = ""

        local_private_key_location   = ""

        instance_type                = ["t3.medium"]

        vpc_cidr_block               = "10.0.0.0/16"

        public_subnet_cidr_blocks    = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]

        private_subnet_cidr_blocks   = ["10.0.4.0/24", "10.0.5.0/24", "10.0.6.0/24"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مراحل:

  • به کنسول AWS بروید و مرکز پشتیبانی را از لیست کشویی انتخاب کنید

    چشم پوشی
    شکل 1: مرکز پشتیبانی در کنسول وب
  • اطمینان حاصل شود حساب و صورتحساب تیک خورده است و سپس به ایجاد مورد

    چشم پوشی
    شکل 2: ایجاد پرونده در حساب و صورتحساب
  • مشخصات گزینه را در شکل 3 زیر دنبال کنید.

    چشم پوشی
    شکل 3: انتخاب گزینه های سرویس و دسته
  • را پر کنید موضوع خلاصه. من توصیه می کنم یک تفکیک صادقانه از رویدادهایی که منجر به هزینه ساخت می شوند، اسناد را نیز ضمیمه کنید. در اینجا نسخه توضیحات من است، شما می توانید از آن به عنوان یک الگو استفاده کنید.
    خلاصه پرونده

Hello AWS Support team,

I am requesting your assistance with my recent AWS charges. As a beginner to AWS processes, I have incurred very high unexpected charges that I am not able to afford at this moment while setting up an EKS Cluster with modules and I am hoping to find a solution that will allow me to continue learning and using AWS services without experiencing any financial burden.


I understand that some of the charges may have been due to my lack of knowledge about AWS pricing and usage. I have since taken steps to educate myself and ensure that I am aware of the free tier limits and best practices for minimizing costs and curbing hidden costs.


I would be very grateful if my account be waived off all the pending AWS charges on my account as a one-time courtesy due to my status as a new user. This would allow me to continue my learning journey with AWS without any worry about unexpected charges.


Thank you for your time and attention to this matter. I appreciate your assistance in resolving this issue.
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • انتخاب کنید وب و از طریق چت با یک موج خاموش همراه با چند اعتبار aws برای تسویه بدهی های آینده با شما تماس گرفته می شود. بسته به موقعیت مکانی خود نیز می توانید انتخاب کنید تلفن، شماره تلفن خود را وارد کنید تا تیم با شما تماس بگیرد.
    مخاطب

از اینکه با من در این سفر آمدید متشکرم و امیدوارم توانسته باشم با تجربیاتم در مورد AWS awesomeness شما را به دو روش مختلف راهنمایی کرده باشم.

در صورت وجود ابهام یا سؤالات و همچنین مستقیماً در بخش نظرات با ما تماس بگیرید توییتر. به سلامتی برای یک سفر یادگیری پربار با AWS.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا