Menerapkan dan men-debug kluster Amazon EKS - AWS Prescriptive Guidance

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

Menerapkan dan men-debug kluster Amazon EKS

Svenja Raether dan Mathew George, Amazon Web Services

Ringkasan

Container menjadi bagian penting dari pengembangan aplikasi cloud native. Kubernetes menyediakan cara yang efisien untuk mengelola dan mengatur kontainer. Amazon Elastic Kubernetes Service (Amazon EKS) adalah layanan kesesuaian Kubernetes bersertifikat yang dikelola sepenuhnya untuk membangun, mengamankan, mengoperasikan, dan memelihara klaster Kubernetes di Amazon Web Services (AWS). Ini mendukung menjalankan pod di AWS Fargate untuk menyediakan kapasitas komputasi sesuai permintaan dan ukuran yang tepat.

Penting bagi pengembang dan administrator untuk mengetahui opsi debugging saat menjalankan beban kerja kontainer. Pola ini memandu Anda melalui penerapan dan debugging container di Amazon EKS dengan AWS Fargate. Ini termasuk membuat, menyebarkan, mengakses, men-debug, dan membersihkan beban kerja Amazon EKS.

Prasyarat dan batasan

Prasyarat

Batasan

  • Pola ini memberi pengembang praktik debugging yang berguna untuk lingkungan pengembangan. Ini tidak menyatakan praktik terbaik untuk lingkungan produksi.

  • Jika Anda menjalankan Windows, gunakan perintah khusus sistem operasi Anda untuk mengatur variabel lingkungan.

Versi produk yang digunakan

Arsitektur

Tumpukan teknologi

  • Penyeimbang Beban Aplikasi

  • Amazon EKS

  • AWS Fargate

Arsitektur target

Semua sumber daya yang ditunjukkan dalam diagram disediakan dengan menggunakan eksctl dan kubectl perintah yang dikeluarkan dari mesin lokal. Cluster pribadi harus dijalankan dari instance yang ada di dalam VPC pribadi.

Arsitektur target terdiri dari cluster EKS menggunakan tipe peluncuran Fargate. Ini menyediakan kapasitas komputasi sesuai permintaan dan berukuran tepat tanpa perlu menentukan jenis server. Kluster EKS memiliki bidang kontrol, yang digunakan untuk mengelola node cluster dan beban kerja. Pod disediakan ke subnet VPC pribadi yang mencakup beberapa Availability Zone. Galeri Publik Amazon ECR direferensikan untuk mengambil dan menyebarkan image server web NGINX ke pod cluster.

Diagram menunjukkan cara mengakses bidang kontrol Amazon EKS menggunakan kubectl perintah dan cara mengakses aplikasi dengan menggunakan Application Load Balancer.

.

Proses empat langkah dengan bidang kontrol Amazon EKS dan profil Fargate dengan node terpisah. VPCs
  1. Mesin lokal di luar AWS Cloud mengirimkan perintah ke bidang kontrol Kubernetes di dalam VPC yang dikelola Amazon EKS.

  2. Amazon EKS menjadwalkan pod berdasarkan pemilih di profil Fargate.

  3. Mesin lokal membuka URL Application Load Balancer di browser.

  4. Application Load Balancer membagi lalu lintas antara pod Kubernetes di node klaster Fargate yang digunakan dalam subnet pribadi yang mencakup beberapa Availability Zone.

Alat

Layanan AWS

  • Amazon Elastic Container Registry (Amazon ECR) adalah layanan registri gambar kontainer terkelola yang aman, terukur, dan andal.

  • Amazon Elastic Kubernetes Service (Amazon EKS) membantu Anda menjalankan Kubernetes di AWS tanpa perlu menginstal atau memelihara control plane atau node Kubernetes Anda sendiri. Pola ini juga menggunakan alat baris perintah eksctl untuk bekerja dengan cluster Kubernetes di Amazon EKS.

  • AWS Fargate membantu Anda menjalankan container tanpa perlu mengelola server atau instans Amazon Elastic Compute Cloud (Amazon). EC2 Ini digunakan bersama dengan Amazon Elastic Container Service (Amazon ECS).

  • Elastic Load Balancing (ELB) mendistribusikan lalu lintas aplikasi atau jaringan yang masuk ke beberapa target. Misalnya, Anda dapat mendistribusikan lalu lintas di seluruh instans, container, dan alamat IP Amazon Elastic Compute Cloud (Amazon EC2) di satu atau beberapa Availability Zone. Pola ini menggunakan komponen pengendali AWS Load Balancer Controller untuk membuat Application Load Balancer ketika ingress Kubernetes disediakan. Application Load Balancer mendistribusikan lalu lintas masuk di antara beberapa target.

Alat-alat lainnya

  • Helm adalah manajer paket open-source untuk Kubernetes. Dalam pola ini, Helm digunakan untuk menginstal AWS Load Balancer Controller.

  • Kubernetes adalah sistem sumber terbuka untuk mengotomatiskan penerapan, penskalaan, dan pengelolaan aplikasi kontainer.

  • NGINX adalah web berkinerja tinggi dan server proxy terbalik.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Buat file.

Menggunakan kode di bagian Informasi tambahan, buat file-file berikut:

  • clusterconfig-fargate.yaml

  • nginx-deployment.yaml

  • nginx-service.yaml

  • nginx-ingress.yaml

  • index.html

Pengembang aplikasi, administrator AWS, AWS DevOps

Tetapkan variabel lingkungan.

catatan

Jika perintah gagal karena tugas yang belum selesai sebelumnya, tunggu beberapa detik, lalu jalankan perintah lagi.

Pola ini menggunakan AWS Region dan nama cluster yang ditentukan dalam fileclusterconfig-fargate.yaml. Tetapkan nilai yang sama dengan variabel lingkungan untuk mereferensikannya dalam perintah lebih lanjut.

export AWS_REGION="us-east-1" export CLUSTER_NAME="my-fargate"
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Buat cluster EKS.

Untuk membuat cluster EKS yang menggunakan spesifikasi dari clusterconfig-fargate.yaml file, jalankan perintah berikut.

eksctl create cluster -f clusterconfig-fargate.yaml

File berisiClusterConfig, yang menyediakan kluster EKS baru bernama my-fargate-cluster di us-east-1 Wilayah dan satu profil Fargate default ()fp-default.

Profil Fargate default dikonfigurasi dengan dua pemilih (defaultdan). kube-system

Pengembang aplikasi, AWS DevOps, administrator AWS

Periksa cluster yang dibuat.

Untuk memeriksa cluster yang dibuat, jalankan perintah berikut.

eksctl get cluster --output yaml

Outputnya harus sebagai berikut.

- Name: my-fargate Owned: "True" Region: us-east-1

Periksa profil Fargate yang dibuat dengan menggunakan file. CLUSTER_NAME

eksctl get fargateprofile --cluster $CLUSTER_NAME --output yaml

Perintah ini menampilkan informasi tentang sumber daya. Anda dapat menggunakan informasi untuk memverifikasi cluster yang dibuat. Outputnya harus sebagai berikut.

- name: fp-default podExecutionRoleARN: arn:aws:iam::<YOUR-ACCOUNT-ID>:role/eksctl-my-fargate-cluster-FargatePodExecutionRole-xxx selectors: - namespace: default - namespace: kube-system status: ACTIVE subnets: - subnet-aaa - subnet-bbb - subnet-ccc
Pengembang aplikasi, AWS DevOps, administrator sistem AWS
TugasDeskripsiKeterampilan yang dibutuhkan

Menyebarkan server web NGINX.

Untuk menerapkan penyebaran server web NGINX pada cluster, jalankan perintah berikut.

kubectl apply -f ./nginx-deployment.yaml

Outputnya harus sebagai berikut.

deployment.apps/nginx-deployment created

Penyebaran mencakup tiga replika gambar NGINX yang diambil dari Galeri Publik Amazon ECR. Gambar di-deploy ke namespace default dan diekspos pada port 80 pada pod yang sedang berjalan.

Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Periksa penerapan dan pod.

(Opsional) Periksa penyebaran. Anda dapat memverifikasi status penyebaran Anda dengan perintah berikut.

kubectl get deployment

Outputnya harus sebagai berikut.

NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 3/3 3 3 7m14s

Pod adalah sebuah objek deployable di Kubernetes, yang berisi satu atau beberapa kontainer. Untuk membuat daftar semua pod, jalankan perintah berikut. 

kubectl get pods

Outputnya harus sebagai berikut.

NAME READY STATUS RESTARTS AGE nginx-deployment-xxxx-aaa 1/1 Running 0 94s nginx-deployment-xxxx-bbb 1/1 Running 0 94s nginx-deployment-xxxx-ccc 1/1 Running 0 94s
Pengembang aplikasi, AWS DevOps, administrator AWS

Skala penyebaran.

Untuk menskalakan penyebaran dari tiga replika yang ditentukan menjadi empat replika, gunakan perintah berikut. deployment.yaml 

kubectl scale deployment nginx-deployment --replicas 4

Outputnya harus sebagai berikut.

deployment.apps/nginx-deployment scaled
Pengembang aplikasi, AWS DevOps, administrator sistem AWS
TugasDeskripsiKeterampilan yang dibutuhkan

Tetapkan variabel lingkungan.

Jelaskan CloudFormation tumpukan cluster untuk mengambil informasi tentang VPC-nya.

aws cloudformation describe-stacks --stack-name eksctl-$CLUSTER_NAME-cluster --query "Stacks[0].Outputs[?OutputKey==\`VPC\`].OutputValue"

Outputnya harus sebagai berikut.

[ "vpc-<YOUR-VPC-ID>" ]

Salin ID VPC dan ekspor sebagai variabel lingkungan.

export VPC_ID="vpc-<YOUR-VPC-ID>"
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Konfigurasikan IAM untuk akun layanan cluster.

Gunakan AWS_REGION dan CLUSTER_NAME dari epik sebelumnya untuk membuat penyedia IAM Open ID Connect untuk cluster.

eksctl utils associate-iam-oidc-provider \ --region $AWS_REGION \ --cluster $CLUSTER_NAME \ --approve
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Unduh dan buat kebijakan IAM.

Unduh kebijakan IAM untuk AWS Load Balancer Controller yang memungkinkannya melakukan panggilan ke APIs AWS atas nama Anda.

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

Buat kebijakan di akun AWS Anda dengan menggunakan AWS CLI.

aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam-policy.json

Anda akan melihat output berikut.

{ "Policy": { "PolicyName": "AWSLoadBalancerControllerIAMPolicy", "PolicyId": "<YOUR_POLICY_ID>", "Arn": "arn:aws:iam::<YOUR-ACCOUNT-ID>:policy/AWSLoadBalancerControllerIAMPolicy", "Path": "/", "DefaultVersionId": "v1", "AttachmentCount": 0, "PermissionsBoundaryUsageCount": 0, "IsAttachable": true, "CreateDate": "<YOUR-DATE>", "UpdateDate": "<YOUR-DATE>" } }

Simpan Nama Sumber Daya Amazon (ARN) dari kebijakan sebagai. $POLICY_ARN

export POLICY_ARN="arn:aws:iam::<YOUR-ACCOUNT-ID>:policy/AWSLoadBalancerControllerIAMPolicy"
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Buat akun layanan IAM.

Buat akun layanan IAM bernama aws-load-balancer-controller di kube-system namespace. GunakanCLUSTER_NAME,AWS_REGION, dan POLICY_ARN yang sebelumnya Anda konfigurasikan.

eksctl create iamserviceaccount \ --cluster=$CLUSTER_NAME \ --region=$AWS_REGION \ --attach-policy-arn=$POLICY_ARN \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --override-existing-serviceaccounts \ --approve

Verifikasi pembuatannya.

eksctl get iamserviceaccount \ --cluster $CLUSTER_NAME \ --name aws-load-balancer-controller \ --namespace kube-system \ --output yaml

Outputnya harus sebagai berikut.

- metadata: name: aws-load-balancer-controller namespace: kube-system status: roleARN: arn:aws:iam::<YOUR-ACCOUNT-ID>:role/eksctl-my-fargate-addon-iamserviceaccount-ku-Role1-<YOUR-ROLE-ID> wellKnownPolicies: autoScaler: false awsLoadBalancerController: false certManager: false ebsCSIController: false efsCSIController: false externalDNS: false imageBuilder: false
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Instal AWS Load Balancer Controller.

Perbarui repositori Helm.

helm repo update

Tambahkan repositori bagan Amazon EKS ke repo Helm. 

helm repo add eks https://aws.github.io/eks-charts

Terapkan definisi sumber daya kustom Kubernetes (CRDs) yang digunakan oleh AWS Load Balancer Controller eks-chart di latar belakang.

kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"

Outputnya harus sebagai berikut.

customresourcedefinition.apiextensions.k8s.io/ingressclassparams.elbv2.k8s.aws created customresourcedefinition.apiextensions.k8s.io/targetgroupbindings.elbv2.k8s.aws created

Instal bagan Helm, menggunakan variabel lingkungan yang Anda tetapkan sebelumnya.

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ --set clusterName=$CLUSTER_NAME \ --set serviceAccount.create=false \ --set region=$AWS_REGION \ --set vpcId=$VPC_ID \ --set serviceAccount.name=aws-load-balancer-controller \ -n kube-system

Outputnya harus sebagai berikut.

NAME: aws-load-balancer-controller LAST DEPLOYED: <YOUR-DATE> NAMESPACE: kube-system STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: AWS Load Balancer controller installed!
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Buat layanan NGINX.

Buat layanan untuk mengekspos pod NGINX dengan menggunakan file. nginx-service.yaml

kubectl apply -f nginx-service.yaml

Outputnya harus sebagai berikut.

service/nginx-service created
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Buat sumber daya ingress Kubernetes.

Buat layanan untuk mengekspos ingress Kubernetes NGINX dengan menggunakan file tersebut. nginx-ingress.yaml

kubectl apply -f nginx-ingress.yaml

Outputnya harus sebagai berikut.

ingress.networking.k8s.io/nginx-ingress created
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Dapatkan URL penyeimbang beban.

Untuk mengambil informasi ingress, gunakan perintah berikut.

kubectl get ingress nginx-ingress

Outputnya harus sebagai berikut.

NAME CLASS HOSTS ADDRESS PORTS AGE nginx-ingress <none> * k8s-default-nginxing-xxx.us-east-1.elb.amazonaws.com 80 80s

Salin ADDRESS (misalnya,k8s-default-nginxing-xxx.us-east-1.elb.amazonaws.com) dari output, dan tempel ke browser Anda untuk mengakses index.html file.

Pengembang aplikasi, AWS DevOps, administrator sistem AWS
TugasDeskripsiKeterampilan yang dibutuhkan

Pilih pod.

Buat daftar semua pod, dan salin nama pod yang diinginkan. 

kubectl get pods

Outputnya harus sebagai berikut.

NAME READY STATUS RESTARTS AGE nginx-deployment-xxxx-aaa 1/1 Running 0 55m nginx-deployment-xxxx-bbb 1/1 Running 0 55m nginx-deployment-xxxx-ccc 1/1 Running 0 55m nginx-deployment-xxxx-ddd 1/1 Running 0 42m

Perintah ini mencantumkan pod yang ada dan informasi tambahan.

Jika Anda tertarik dengan pod tertentu, isi nama pod yang Anda minati untuk POD_NAME variabel tersebut atau atur sebagai variabel lingkungan. Jika tidak, hilangkan parameter ini untuk mencari semua sumber daya.

export POD_NAME="nginx-deployment-<YOUR-POD-NAME>"
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Akses log.

Dapatkan log dari pod yang ingin Anda debug.

kubectl logs $POD_NAME
Pengembang aplikasi, administrator sistem AWS, AWS DevOps

Teruskan port NGINX.

Gunakan port-forwarding untuk memetakan port pod untuk mengakses server web NGINX ke port di komputer lokal Anda.

kubectl port-forward deployment/nginx-deployment 8080:80

Di browser Anda, buka URL berikut.

http://localhost:8080

port-forwardPerintah menyediakan akses ke index.html file tanpa membuatnya tersedia untuk umum melalui penyeimbang beban. Ini berguna untuk mengakses aplikasi yang sedang berjalan saat men-debug itu. Anda dapat menghentikan penerusan port dengan menekan perintah keyboard Ctrl+C.

Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Jalankan perintah di dalam pod.

Untuk melihat index.html file saat ini, gunakan perintah berikut. 

kubectl exec $POD_NAME -- cat /usr/share/nginx/html/index.html

Anda dapat menggunakan exec perintah untuk mengeluarkan perintah apa pun secara langsung di pod. Ini berguna untuk men-debug aplikasi yang sedang berjalan.

Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Salin file ke pod.

Hapus index.html file default pada pod ini.

kubectl exec $POD_NAME -- rm /usr/share/nginx/html/index.html

Unggah file lokal yang disesuaikan index.html ke pod.

kubectl cp index.html $POD_NAME:/usr/share/nginx/html/

Anda dapat menggunakan cp perintah untuk mengubah atau menambahkan file langsung ke salah satu pod.

Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Gunakan port-forwarding untuk menampilkan perubahan.

Gunakan port-forwarding untuk memverifikasi perubahan yang Anda buat pada pod ini.

kubectl port-forward pod/$POD_NAME 8080:80

Buka URL berikut di browser Anda.

http://localhost:8080

Perubahan yang diterapkan pada index.html file harus terlihat di browser.

Pengembang aplikasi, AWS DevOps, administrator sistem AWS
TugasDeskripsiKeterampilan yang dibutuhkan

Hapus penyeimbang beban.

Hapus masuknya.

kubectl delete ingress/nginx-ingress

Outputnya harus sebagai berikut.

ingress.networking.k8s.io "nginx-ingress" deleted

Hapus layanan.

kubectl delete service/nginx-service

Outputnya harus sebagai berikut.

service "nginx-service" deleted

Hapus pengontrol penyeimbang beban.

helm delete aws-load-balancer-controller -n kube-system

Outputnya harus sebagai berikut.

release "aws-load-balancer-controller" uninstalled

Hapus akun layanan.

eksctl delete iamserviceaccount --cluster $CLUSTER_NAME --namespace kube-system --name aws-load-balancer-controller
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Hapus penyebaran.

Untuk menghapus sumber daya penyebaran, gunakan perintah berikut.

kubectl delete deploy/nginx-deployment

Outputnya harus sebagai berikut.

deployment.apps "nginx-deployment" deleted
Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Hapus klaster .

Hapus kluster EKS dengan menggunakan perintah berikut, di my-fargate mana nama cluster.

eksctl delete cluster --name $CLUSTER_NAME

Perintah ini menghapus seluruh cluster, termasuk semua sumber daya terkait.

Pengembang aplikasi, AWS DevOps, administrator sistem AWS

Hapus kebijakan IAM.

Hapus kebijakan yang dibuat sebelumnya dengan menggunakan AWS CLI.

aws iam delete-policy --policy-arn $POLICY_ARN
Pengembang aplikasi, administrator AWS, AWS DevOps

Pemecahan Masalah

IsuSolusi

Anda menerima pesan galat pada pembuatan klaster yang menyatakan bahwa Availability Zone yang ditargetkan tidak memiliki kapasitas yang cukup untuk mendukung klaster. Anda akan melihat pesan yang mirip dengan yang berikut ini.

Cannot create cluster 'my-fargate' because us-east-1e, the targeted availability zone, does not currently have sufficient capacity to support the cluster. Retry and choose from these availability zones: us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1f

Buat cluster lagi menggunakan Availability Zones yang direkomendasikan dari pesan kesalahan. Tentukan daftar Availability Zones di baris terakhir clusterconfig-fargate.yaml file Anda (misalnya,availabilityZones: ["us-east-1a", "us-east-1b", "us-east-1c"]).

Sumber daya terkait

Informasi tambahan

clusterconfig-fargate.yaml

apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-fargate region: us-east-1 fargateProfiles: - name: fp-default selectors: - namespace: default - namespace: kube-system

nginx-deployment.yaml

apiVersion: apps/v1 kind: Deployment metadata: name: "nginx-deployment" namespace: "default" spec: replicas: 3 selector: matchLabels: app: "nginx" template: metadata: labels: app: "nginx" spec: containers: - name: nginx image: public.ecr.aws/nginx/nginx:latest ports: - containerPort: 80

nginx-service.yaml

apiVersion: v1 kind: Service metadata: annotations: alb.ingress.kubernetes.io/target-type: ip name: "nginx-service" namespace: "default" spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: app: "nginx"

nginx-ingress.yaml

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: "default" name: "nginx-ingress" annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: "nginx-service" port: number: 80

index.html

<!DOCTYPE html> <html> <body> <h1>Welcome to your customized nginx!</h1> <p>You modified the file on this running pod</p> </body> </html>