Sederhanakan penerapan aplikasi multi-tenant Amazon EKS dengan menggunakan Flux - AWS Prescriptive Guidance

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Sederhanakan penerapan aplikasi multi-tenant Amazon EKS dengan menggunakan Flux

Nadeem Rahaman, Aditya Ambati, Aniket Dekate, dan Shrikant Patil, Amazon Web Services

Ringkasan

Pemberitahuan: AWS CodeCommit tidak lagi tersedia untuk pelanggan baru. Pelanggan yang sudah ada AWS CodeCommit dapat terus menggunakan layanan seperti biasa. Pelajari selengkapnya

Banyak perusahaan yang menawarkan produk dan layanan adalah industri yang diatur data yang diperlukan untuk mempertahankan hambatan data antara fungsi bisnis internal mereka. Pola ini menjelaskan bagaimana Anda dapat menggunakan fitur multi-tenancy di Amazon Elastic Kubernetes Service (Amazon EKS) untuk membangun platform data yang mencapai isolasi logis dan fisik antara penyewa atau pengguna yang berbagi satu kluster Amazon EKS. Pola memberikan isolasi melalui pendekatan berikut:

  • Isolasi namespace Kubernetes

  • Kontrol akses berbasis peran (RBAC)

  • Kebijakan jaringan

  • Kuota sumber daya

  • AWS Identity and Access Management (IAM) peran untuk akun layanan (IRSA)

Selain itu, solusi ini menggunakan Flux untuk menjaga konfigurasi penyewa tetap tidak berubah saat Anda menerapkan aplikasi. Anda dapat menerapkan aplikasi penyewa Anda dengan menentukan repositori penyewa yang berisi file Flux dalam konfigurasi Anda. kustomization.yaml

Pola ini mengimplementasikan yang berikut:

  • AWS CodeCommit Repositori, AWS CodeBuild proyek, dan AWS CodePipeline pipeline, yang dibuat dengan menerapkan skrip Terraform secara manual.

  • Jaringan dan komponen komputasi yang diperlukan untuk hosting penyewa. Ini dibuat melalui CodePipeline dan CodeBuild dengan menggunakan Terraform.

  • Ruang nama penyewa, kebijakan jaringan, dan kuota sumber daya, yang dikonfigurasi melalui bagan Helm.

  • Aplikasi milik penyewa yang berbeda, digunakan dengan menggunakan Flux.

Kami menyarankan Anda merencanakan dan membangun arsitektur Anda sendiri dengan hati-hati untuk multi-tenancy berdasarkan persyaratan unik dan pertimbangan keamanan Anda. Pola ini memberikan titik awal untuk implementasi Anda.

Prasyarat dan batasan

Prasyarat

Batasan

  • Ketergantungan pada penerapan manual Terraform: Penyiapan awal alur kerja, termasuk membuat CodeCommit repositori, CodeBuild proyek, dan CodePipeline saluran pipa, bergantung pada penerapan Terraform manual. Ini memperkenalkan batasan potensial dalam hal otomatisasi dan skalabilitas, karena memerlukan intervensi manual untuk perubahan infrastruktur.

  • CodeCommit ketergantungan repositori: Alur kerja bergantung pada CodeCommit repositori sebagai solusi manajemen kode sumber dan digabungkan dengan erat. Layanan AWS

Arsitektur

Arsitektur target

Pola ini menyebarkan tiga modul untuk membangun infrastruktur pipeline, jaringan, dan komputasi untuk platform data, seperti yang diilustrasikan dalam diagram berikut.

Arsitektur pipa:

Infrastruktur pipa untuk arsitektur multi-tenant Amazon EKS

Arsitektur jaringan:

Infrastruktur jaringan untuk arsitektur multi-tenant Amazon EKS

Arsitektur komputasi:

Infrastruktur komputasi untuk arsitektur multi-tenant Amazon EKS

Alat

Layanan AWS

  • AWS CodeBuildadalah layanan build terkelola penuh yang membantu Anda mengkompilasi kode sumber, menjalankan pengujian unit, dan menghasilkan artefak yang siap digunakan.

  • AWS CodeCommitadalah layanan kontrol versi yang membantu Anda menyimpan dan mengelola repositori Git secara pribadi, tanpa perlu mengelola sistem kontrol sumber Anda sendiri.

  • AWS CodePipelinemembantu Anda dengan cepat memodelkan dan mengkonfigurasi berbagai tahapan rilis perangkat lunak dan mengotomatiskan langkah-langkah yang diperlukan untuk merilis perubahan perangkat lunak secara terus menerus.

  • Amazon Elastic Kubernetes Service (Amazon EKS) membantu Anda menjalankan AWS Kubernetes tanpa perlu menginstal atau memelihara control plane atau node Kubernetes Anda sendiri.

  • AWS Transit Gatewayadalah hub pusat yang menghubungkan virtual private cloud (VPCs) dan jaringan lokal.

  • Amazon Virtual Private Cloud (Amazon VPC) membantu Anda meluncurkan AWS sumber daya ke jaringan virtual yang telah Anda tentukan. Jaringan virtual ini menyerupai jaringan tradisional yang akan Anda operasikan di pusat data Anda sendiri, dengan manfaat menggunakan infrastruktur yang dapat diskalakan. AWS

Alat-alat lainnya

  • Kebijakan Jaringan Cilium mendukung kebijakan jaringan Kubernetes L3 dan L4. Mereka dapat diperluas dengan kebijakan L7 untuk menyediakan keamanan tingkat API untuk HTTP, Kafka, dan gRPC, dan protokol serupa lainnya.

  • Flux adalah alat pengiriman berkelanjutan (CD) berbasis Git yang mengotomatiskan penerapan aplikasi di Kubernetes.

  • Helm adalah pengelola paket open source untuk Kubernetes yang membantu Anda menginstal dan mengelola aplikasi di klaster Kubernetes Anda.

  • Terraform adalah alat infrastruktur sebagai kode (IAc) HashiCorp yang membantu Anda membuat dan mengelola sumber daya cloud dan lokal.

Repositori kode

Kode untuk pola ini tersedia di repositori Solusi GitHub Terraform Multi-Tenancy EKS.

Praktik terbaik

Untuk pedoman dan praktik terbaik untuk menggunakan implementasi ini, lihat berikut ini:

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Kloning repositori proyek.

Kloning repositori Solusi Terraform Multi-Tenancy GitHub EKS dengan menjalankan perintah berikut di jendela terminal:

git clone https://github.com/aws-samples/aws-eks-multitenancy-deployment.git
AWS DevOps

Bootstrap bucket Terraform S3 dan Amazon DynamoDB.

  1. Di bootstrap folder, buka bootstrap.sh file dan perbarui nilai variabel untuk nama bucket S3, nama tabel DynamoDB, dan: Wilayah AWS

    S3_BUCKET_NAME="<S3_BUCKET_NAME>" DYNAMODB_TABLE_NAME="<DYNAMODB_NAME>" REGION="<AWS_REGION>"
  2. Jalankan bootstrap.sh skrip. Skrip membutuhkan AWS CLI, yang Anda instal sebagai bagian dari prasyarat.

    cd bootstrap ./bootstrap.sh
AWS DevOps

Perbarui locals.tf file run.sh dan.

  1. Setelah proses bootstrap selesai dengan sukses, salin bucket S3 dan nama tabel DynamoDB dari bagian skrip: variables bootstrap.sh

    # Variables S3_BUCKET_NAME="<S3_BUCKET_NAME>" DYNAMODB_TABLE_NAME="<DYNAMODB_NAME"
  2. Tempelkan nilai-nilai tersebut ke run.sh skrip, yang ada di direktori root proyek:

    BACKEND_BUCKET_ID="<SAME_NAME_AS_S3_BUCKET_NAME>" DYNAMODB_ID="<SAME_NAME_AS_DYNAMODB_NAME>"
  3. Unggah kode proyek ke CodeCommit repositori. Anda dapat secara otomatis membuat repositori ini melalui Terraform dengan menyetel variabel berikut ke true dalam file: demo/pipeline/locals.tf

    create_new_repo = true
  4. Perbarui locals.tf file sesuai dengan kebutuhan Anda untuk membuat sumber daya pipa.

AWS DevOps

Menyebarkan modul pipa.

Untuk membuat sumber daya pipeline, jalankan perintah Terraform berikut secara manual. Tidak ada orkestrasi untuk menjalankan perintah ini secara otomatis.

./run.sh -m pipeline -e demo -r <AWS_REGION> -t init ./run.sh -m pipeline -e demo -r <AWS_REGION> -t plan ./run.sh -m pipeline -e demo -r <AWS_REGION> -t apply
AWS DevOps
TugasDeskripsiKeterampilan yang dibutuhkan

Mulai pipa.

  1. Dalam templates folder, pastikan bahwa buildspec file memiliki variabel berikut diatur kenetwork:

    TF_MODULE_TO_BUILD: "network"
  2. Di CodePipeline konsol, pada halaman detail pipeline, mulai pipeline dengan memilih Rilis perubahan.

Setelah proses pertama ini, pipeline dimulai secara otomatis setiap kali Anda melakukan perubahan ke cabang utama CodeCommit repositori.

Pipa meliputi tahapan berikut:

  • validatemenginisialisasi Terraform, menjalankan pemindaian keamanan Terraform dengan menggunakan alat checkov dan tfsec, dan mengunggah laporan pemindaian ke bucket S3.

  • plan menunjukkan paket Terraform dan mengunggah paket ke bucket S3.

  • applymenerapkan output paket Terraform dari bucket S3 dan membuat sumber daya. AWS

  • destroymenghapus AWS sumber daya yang dibuat selama apply tahap. Untuk mengaktifkan tahap opsional ini, atur variabel berikut ke true dalam demo/pipeline/locals.tf file:

    enable_destroy_stage = true
AWS DevOps

Validasi sumber daya yang dibuat melalui modul jaringan.

Konfirmasikan bahwa AWS sumber daya berikut dibuat setelah pipeline berhasil diterapkan:

  • VPC jalan keluar dengan tiga subnet publik dan tiga subnet pribadi, gateway internet, dan gateway NAT.

  • VPC Amazon EKS dengan tiga subnet pribadi.

  • Penyewa 1 dan Penyewa 2 VPCs dengan masing-masing tiga subnet pribadi.

  • Gateway transit dengan semua lampiran VPC dan rute ke setiap subnet pribadi.

  • Rute gateway transit statis untuk VPC jalan keluar Amazon EKS dengan blok CIDR tujuan. 0.0.0.0/0 Ini diperlukan untuk memungkinkan semua memiliki VPCs akses internet keluar melalui VPC jalan keluar Amazon EKS.

AWS DevOps
TugasDeskripsiKeterampilan yang dibutuhkan

Perbarui locals.tf untuk mengaktifkan akses CodeBuild proyek ke VPC.

Untuk menyebarkan add-on untuk kluster pribadi Amazon EKS, CodeBuild proyek harus dilampirkan ke VPC Amazon EKS.

  1. Di demo/pipeline folder, buka locals.tf file, dan atur vpc_enabled variabel ketrue.

  2. Jalankan run.sh skrip untuk menerapkan perubahan pada modul pipeline:

    demo/pipeline/locals.tf ./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd init ./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd plan ./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd apply
AWS DevOps

Perbarui buildspec file untuk membangun modul komputasi.

Di templates folder, di semua file buildspec YAMM, atur nilai TF_MODULE_TO_BUILD variabel dari network kecompute:

TF_MODULE_TO_BUILD: "compute"
AWS DevOps

Perbarui values file untuk bagan Helm manajemen penyewa.

  1. Buka values.yaml file di lokasi berikut:

    cd cfg-terraform/demo/compute/cfg-tenant-mgmt

    File terlihat seperti ini:

    --- global: clusterRoles: operator: platform-tenant flux: flux-tenant-applier flux: tenantCloneBaseUrl: ${TEANT_BASE_URL} repoSecret: ${TENANT_REPO_SECRET} tenants: tenant-1: quotas: limits: cpu: 1 memory: 1Gi flux: path: overlays/tenant-1 tenant-2: quotas: limits: cpu: 1 memory: 2Gi flux: path: overlays/tenant-2
  2. Di tenants bagian global dan, perbarui konfigurasi berdasarkan kebutuhan Anda:

    • tenantCloneBaseUrl— Jalur ke repositori yang menampung kode untuk semua penyewa (kami menggunakan repositori Git yang sama untuk semua penyewa)

    • repoSecret- Rahasia Kubernetes yang menyimpan kunci SSH dan host yang dikenal untuk mengautentikasi ke repositori Git penyewa global

    • quotas— Kubernetes kuota sumber daya yang ingin Anda terapkan untuk setiap penyewa

    • flux path— Jalur ke file YAMM aplikasi penyewa di repositori penyewa global

AWS DevOps

Validasi sumber daya komputasi.

Setelah Anda memperbarui file di langkah sebelumnya, CodePipeline mulai secara otomatis. Konfirmasikan bahwa itu membuat AWS sumber daya berikut untuk infrastruktur komputasi:

  • Cluster Amazon EKS dengan titik akhir pribadi

  • Node pekerja Amazon EKS

  • Pengaya Amazon EKS: rahasia eksternal,aws-loadbalancer-controller, dan metrics-server

  • GitOps modul, bagan Helm Flux, bagan Helm Cilium, dan bagan helm manajemen penyewa

AWS DevOps
TugasDeskripsiKeterampilan yang dibutuhkan

Validasi sumber daya manajemen penyewa di Kubernetes.

Jalankan perintah berikut untuk memeriksa apakah sumber daya manajemen penyewa berhasil dibuat dengan bantuan Helm.

  1. Namespace penyewa telah dibuat, seperti yang ditentukan dalam: values.yaml

    kubectl get ns -A
  2. Kuota ditetapkan untuk setiap namespace penyewa, seperti yang ditentukan dalam: values.yaml

    kubectl get quota --namespace=<tenant_namespace>
  3. Detail kuota benar untuk setiap namespace penyewa:

    kubectl describe quota cpu-memory-resource-quota-limit -n <tenant_namespace>
  4. Kebijakan Jaringan Cilium diterapkan ke setiap namespace penyewa:

    kubectl get CiliumNetworkPolicy -A
AWS DevOps

Verifikasi penerapan aplikasi penyewa.

Jalankan perintah berikut untuk memverifikasi bahwa aplikasi penyewa telah digunakan.

  1. Flux dapat terhubung ke CodeCommit repositori yang ditentukan dalam modul: GitOps

    kubectl get gitrepositories -A
  2. Pengontrol kustomisasi Flux telah menerapkan file YAMAL di repositori: CodeCommit

    kubectl get kustomizations -A
  3. Semua sumber daya aplikasi digunakan di ruang nama penyewa mereka:

    kubectl get all -n <tenant_namespace>
  4. Ingress telah dibuat untuk setiap penyewa:

    kubectl get ingress -n <tenant_namespace>

Pemecahan Masalah

IsuSolusi

Anda menemukan pesan galat yang mirip dengan berikut ini:

Failed to checkout and determine revision: unable to clone unknown error: You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit.

Ikuti langkah-langkah ini untuk memecahkan masalah:

  1. Verifikasi repositori aplikasi penyewa: Repositori kosong atau salah konfigurasi mungkin menyebabkan kesalahan. Pastikan repositori aplikasi penyewa berisi kode yang diperlukan.

  2. Menerapkan ulang tenant_mgmt modul: Dalam file konfigurasi tenant_mgmt modul, cari app bloknya, lalu atur deploy parameternya ke: 0

    deploy = 0

    Setelah Anda menjalankan apply perintah Terraform, ubah nilai deploy parameter kembali ke: 1

    deploy = 1
  3. Periksa kembali status: Setelah Anda menjalankan langkah-langkah sebelumnya, gunakan perintah berikut untuk memeriksa apakah masalah tetap ada:

     kubectl get gitrepositories -A

    Jika terus berlanjut, pertimbangkan untuk menyelam lebih dalam ke log Flux untuk detail lebih lanjut atau lihat panduan pemecahan masalah umum Flux.

Sumber daya terkait

Informasi tambahan

Berikut adalah contoh struktur repositori untuk menerapkan aplikasi penyewa:

applications sample_tenant_app ├── README.md ├── base │ ├── configmap.yaml │ ├── deployment.yaml │ ├── ingress.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays ├── tenant-1 │ ├── configmap.yaml │ ├── deployment.yaml │ └── kustomization.yaml └── tenant-2 ├── configmap.yaml └── kustomization.yaml