Blog AWS Indonesia

Otomatisasi upgrade Amazon EKS menggunakan infrastructure as code

Dalam artikel ini, kami akan menjelaskan bagaimana melakukan upgrade managed node group dari kluster Amazon Elastic Kubernetes Service (Amazon EKS) dari 1.19 ke 1.20 secara paralel. Kita dapat menggunakan AWS Service Catalog untuk mendukung otomatisasi alur kerja dengan kontrol yang granular. Kemampuan ini menyediakan pilihan untuk memperbarui control plane dan node. Daftar fitur Amazon EKS, berdasarkan versi Kubernetes, dapat ditemukan dalam dokumen change log yang tersedia secara open source.

Solusi

Banyak komponen, konfigurasi, dan aplikasi yang berjalan di kluster Kubernetes. Tim operasional dan developer ingin dapat menggunakan fitur baru yang membantu mengoptimalkan environment. Memperbarui kluster Kubernetes dapat dilakukan secara manual dan memakan waktu jika developers harus melakukan validasi umum dan langkah-langkah prosedural.

Anda dapat mengupgrade kluster melalui AWS Management Console atau melalui antarmuka command line dengan eksctl atau kubectl. Setelah pengaktifan kluster Amazon EKS, tidak ada proses audit di dalam AWS CloudTrail. Kedua opsi tersebut bersifat manual dan tidak dicatat untuk pelacakan maupun audit.

Solusi yang saya jelaskan dalam artikel ini mengotomatiskan proses upgrade Amazon EKS menggunakan managed group node, launch template, infrastructure as code, dan container image dengan kode Python. Ketiga container image menjalankan perintah eksctl dan kubectl bersama dengan pemeriksaan status. Pembaruan kluster dikemas menjadi parameter sederhana. Di background, perintah dan konfigurasi dicatat dalam log.

Jenis-jenis container image pada AWS Lambda sebagai berikut:

  • Control plane upgrade: Meningkatkan control plane Amazon EKS ke versi yang ditentukan.
  • DaemonSet upgrade image: Upgrade aws-node, coredns, dan kube-proxy DaemonSets agar sesuai dengan versi control plane.
  • Node group upgrade image: Upgrade versi node group launch template agar sesuai dengan versi kluster Amazon EKS.

Berikut alur kerja control plane pada gambar diatas yang ditampilkan dengan angka warna hitam yang dilingkari adalah sebagai berikut:

  1. Sebuah container image AWS Lambda dibuat menggunakan AWS CloudFormation yang mengirim request upgrade control plane dan menyimpan ID pembaruan.
  2. Request container AWS Lambda diterima dan memulai upgrade control plane.
  3. Container AWS Lambda mengambil ID pembaruan dan memeriksa status dari upgrade control plane.
  4. Jika upgrade control plane berhasil, template AWS CloudFormation deploy managed node group dengan versi Kubernetes 1.20. Jika kluster Amazon EKS tidak normal, upgrade akan gagal.

Berikut workflow data plane yang ditampilkan dengan angka berwarna kuning yang dilingkari sebagai berikut:

  1. Upgrade control plane berhasil dan template AWS CloudFormation mendeploy managed node group ke versi Kubernetes 1.20.
  2. Request container AWS Lambda diterima dan memulai upgrade data plane pada jenis DaemonSet yang berbeda satu per satu.
  3. Jika semua upgrade pada data plane berhasil, template AWS CloudFormation deploy managed node group ke versi Kubernetes 1.20. Jika kluster Amazon EKS dalam status tidak normal, upgrade kontrol gagal.
  4. Request AWS Lambda diterima dan memulai upgrade data plane pada grup node yang dikelola.

Prasyarat

Untuk mengikuti langkah-langkah proses pipeline deployment, Anda harus memiliki hal berikut:

Note: Lihat kode dalam GitHub repository. Praktik terbaik AWS merekomendasikan untuk mengurangi policy AWS Identity and Access Management (IAM) untuk memenuhi kebutuhan perusahaan Anda. Permission ini hanya untuk demonstrasi dan tidak untuk produksi.

Panduan

  1. Clone repositori kode sumber yang ada dilokasi ini:
    git clone https://github.com/aws-samples/automation-eks-upgrades
  2. Membuat kluster Amazon Elastic Kubernetes. Perintah berikut membuat kluster Amazon EKS yang baru, tetapi Anda dapat mengubah langkah-langkah ini, khusus untuk penggunaan jika Anda memiliki kluster yang sudah ada:
    eksctl create cluster \ 
    --name demo-eks \ 
    --version 1.19 \ 
    --nodegroup-name demo-managed-node-group \ 
    --node-type t3.medium \
    --nodes 2 \ --region <AWS_REGION> \ 
    --enable-ssm

    Output akan terlihat seperti berikut:

    2050-08-12 00:00:00 [✔]  EKS cluster "demo-eks-cluster" in "us-east-1" region is ready
  3. Mengotentikasi repositori Amazon Elastic Container Registry (Amazon ECR), tempat kluster Amazon EKS berjalan:
    aws ecr get-login-password \ 
    --region <AWS_REGION> | docker login \
    --username AWS \
    --password-stdin <AWS_ACCOUNT_ID>.dkr.ecr.<AWS_REGION>.amazonaws.com

    Output akan terlihat seperti berikut:

    Login Succeeded
  4. Build dan push container image ke repositori Amazon ECR menggunakan script bash:
    images/ecr_push_image.sh <AWS_ACCOUNT_ID> <AWS_REGION>

Note: Script ecr_push_image.sh script dapat menghasilkan error karena masalah limitasi terkait Docker.

Deploy CloudFormation template

Untuk deploy template Anda, ikuti langkah-langkah berikut.

  1. Deploy template konfigurasi IAM:
    aws cloudformation create-stack \
    --stack-name IAM-Stack \
    --template-body file://templates/iam.yml \
    --capabilities CAPABILITY_NAMED_IAM
    --region <AWS_REGION>

    Output akan terlihat seperti berikut:

    {
        "StackId": "arn:aws:cloudformation:us-west-2:0123456789012:stack/IAM-Stack/e7aac640-fba0-11eb-bf85-XXXXXX"
    }
  2. Mengatur environment variable lokal untuk IAM identity mapping:
    export CLUSTER_NAME=<CLUSTER_NAME>
    export LAMBDA_EXECUTION_ROLE=$(aws cloudformation describe-stacks --stack-name Demo-IAM-Stack --query Stacks[*].Outputs[0].OutputValue --output text --region <AWS_REGION>)
  3. Memeriksa apakah environment variable lokal dieksport dengan benar:
    printenv | awk '/CLUSTER_NAME/||/LAMBDA_EXECUTION_ROLE/{print $0}'

    Output akan terlihat seperti berikut:

    CLUSTER_NAME=demo-eks-cluster
    LAMBDA_EXECUTION_ROLE=arn:aws:iam::0123456789012:role/lambda-execution-role
  4. Memperbarui IAM identity mapping untuk menghubungkan dengan AWS Lambda execution role ke kluster RBAC Amazon EKS:
    eksctl create iamidentitymapping \
    --cluster $CLUSTER_NAME \
    --arn $LAMBDA_EXECUTION_ROLE \
    --group system:masters \
    --username admin \
    --region <AWS_REGION>

    Output akan terlihat seperti berikut:

    2050-08-13 12:00:00 [ℹ] eksctl version 0.55.0
    2050-08-13 12:00:00 [ℹ] using region us-west-2
    2050-08-13 12:00:00 [ℹ] adding identity "arn:aws:iam::0123456789012:role/lambda-execution-role" to auth ConfigMap
  5. Buka file parameters/controlplane-cluster.json gunakan EksClusterName, EksUpdateClusterVersion, dan IAMStackName.
  6. Deploy template konfigurasi untuk memulai upgrade control plane kluster. Langkah ini dapat memakan waktu hingga 60 menit untuk menyelesaikannya:
    --stack-name demo-eks-cluster-upgrade \ 
    --template-body file://templates/controlplane-cluster.yml \ 
    --parameters file://parameters/controlplane-cluster.json \ 
    --capabilities CAPABILITY_AUTO_EXPAND \ 
    --region <AWS_REGION>
  7. Periksa versi terbaru dari kluster saat ini:
    aws eks describe-cluster \
    --name demo-eks-cluster \
    --region <REGION> \
    --query cluster.version \
    --output text

    Output akan terlihat seperti berikut:

    1.20
  8. Buka file parameters/dataplane-daemonset.json dan gunakan EksClusterName dan IAMStackName.
  9. Deploy template konfigurasi untuk memulai upgrade data plan kluster DaemonSet:
    aws cloudformation create-stack \
    --stack-name demo-eks-daemonset-upgrade \
    --template-body file://templates/dataplane-daemonset.yml \
    --parameters file://parameters/dataplane-daemonset.json \
    --capabilities CAPABILITY_AUTO_EXPAND \
    --region <AWS_REGION>

    Output akan terlihat seperti berikut:

    {
        "StackId": "arn:aws:cloudformation:us-west-2:0123456789012:stack/aws-eks-daemonset-upgrade/59f93f30-fc67-11eb-8242-XXXXXX"
    }

    Lihat Amazon CloudWatch Logs untuk output masing-masing type DaemonSet:

    {
    "Status": "SUCCESS",
    "Reason": "See the details in CloudWatch Log Stream: 2050/08/13/[$LATEST]6755fff2fef147e6b94XXXXXXXX",
    "PhysicalResourceId": "2050/08/13/[$LATEST]6755fff2fef147e6b94XXXXXXXX",
    "StackId": "arn:aws:cloudformation:us-west-2:0123456789012:stack/aws-eks-daemonset-upgrade/fbb9d6e0-fc6c-11eb-a6f5-0aXXXXX",
    "RequestId": "8a5ccd07-30a5-49d4-ba50-5XXXXXXX",
    "LogicalResourceId": "AwsNodeDaemonsetUpgradeFunction",
    "NoEcho": false,
    "Data": null
    }
  10. Deploy template konfigurasi untuk memulai upgrade grup node kluster data plane:
    aws cloudformation create-stack \
    --stack-name aws-eks-nodegroup-upgrade \
    --template-body file://templates/dataplane-nodegroup.yml \
    --parameters file://parameters/dataplane-nodegroup.json \
    --capabilities CAPABILITY_AUTO_EXPAND \
    --region <AWS_REGION>

    Output akan terlihat seperti berikut:

    {
        "StackId": "arn:aws:cloudformation:us-west-2:0123456789012:stack/aws-eks-nodegroup-upgrade/df59be10-01bd-11ec-8a4e-XXXXXX"
    }

Membersihkan

  1. Menghapus stack node group:
    aws cloudformation delete-stack \
    --stack-name aws-eks-nodegroup-upgrade
  2. Hapus stack DaemonSet:
    aws cloudformation delete-stack \
    --stack-name aws-eks-daemonset-upgrade
  3. Hapus node cluster:
    aws cloudformation delete-stack \
    --stack-name aws-eks-cluster-upgrade
  4. Hapus stacl IAM:
    aws cloudformation delete-stack \
    --stack-name aws-iam-stack
  5. Menghapus wadah image dan repositori:
    images=("controlplane/upgrade" "controlplane/status" "dataplane/daemonset" "dataplane/nodegroup" "dataplane/status") 
    for app in ${images[*]}; do aws ecr delete-repository --repository-name $app --force || true ; done

Kesimpulan

Kami telah menjelaskan cara upgrade kluster Kubernetes terkelola menggunakan Amazon EKS dalam pola yang dapat diulang dengan file konfigurasi, template, dan kode. Aktivitas selama proses upgrade tercatat di Amazon CloudWatch Logs. Informasi tersebut dapat digunakan untuk pemantauan, peringatan, dan audit.  Anda dapat habiskan waktu untuk proses deploying perubahan ini ke prioritas lain, sebagai gantinya.

Artikel ini merupakan terjemahan dari artikel yang dibuat oleh Virginia Chu dan Manoj Shunmugam pada 08 Des 2021 berjudul Automate Amazon EKS upgrades with infrastructure as code.

Verenne Tanara

Verenne Tanara

Verenne Tanara is an Associate Solutions Architect at Amazon Web Services. She has a passion for building and accelerating cloud adoption with AWS!