Menerapkan contoh layanan mikro Java di Amazon EKS dan mengekspos layanan mikro menggunakan Application Load Balancer - AWS Prescriptive Guidance

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

Menerapkan contoh layanan mikro Java di Amazon EKS dan mengekspos layanan mikro menggunakan Application Load Balancer

Vijay Thompson dan Akkamahadevi Hiremath, Amazon Web Services

Ringkasan

Pola ini menjelaskan cara menerapkan contoh layanan mikro Java sebagai aplikasi kontainer di Amazon Elastic Kubernetes Service (Amazon EKS) dengan menggunakan eksctl utilitas baris perintah dan Amazon Elastic Container Registry (Amazon ECR). Anda dapat menggunakan Application Load Balancer untuk memuat keseimbangan lalu lintas aplikasi.

Prasyarat dan batasan

Prasyarat

  • Akun AWS yang aktif

  • AWS Command Line Interface (AWS CLI) versi 1.7 atau yang lebih baru, diinstal dan dikonfigurasi di macOS, Linux, atau Windows

  • Daemon Docker yang sedang berjalan

  • Utilitas baris eksctl perintah, diinstal dan dikonfigurasi di macOS, Linux, atau Windows (Untuk informasi selengkapnya, lihat Memulai Amazon EKS — eksctl dalam dokumentasi Amazon EKS.)

  • Utilitas baris kubectl perintah, diinstal dan dikonfigurasi di macOS, Linux, atau Windows (Untuk informasi selengkapnya, lihat Menginstal atau memperbarui kubectl dalam dokumentasi Amazon EKS.)

Batasan

  • Pola ini tidak mencakup pemasangan sertifikat SSL untuk Application Load Balancer.

Arsitektur

Tumpukan teknologi target

  • Amazon ECR

  • Amazon EKS

  • Penyeimbang Beban Elastis

Arsitektur target

Diagram berikut menunjukkan arsitektur untuk containerizing Java microservice di Amazon EKS.

Layanan mikro Java digunakan sebagai aplikasi kontainer di Amazon EKS.

Alat

  • 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.

  • AWS Command Line Interface (AWS CLI) adalah alat sumber terbuka yang membantu Anda berinteraksi dengan layanan AWS melalui perintah di shell baris perintah Anda.

  • Elastic Load Balancing secara otomatis mendistribusikan lalu lintas masuk ke beberapa target, seperti instans Amazon Elastic Compute Cloud ( EC2Amazon), container, dan alamat IP, dalam satu atau beberapa Availability Zone.

  • eksctl membantu Anda membuat cluster di Amazon EKS.

  • kubectl memungkinkan untuk menjalankan perintah terhadap cluster Kubernetes.

  • Docker membantu Anda membangun, menguji, dan mengirimkan aplikasi dalam paket yang disebut kontainer.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Buat klaster Amazon EKS.

Untuk membuat klaster Amazon EKS yang menggunakan dua EC2 instance Amazon t2.small sebagai node, jalankan perintah berikut:

eksctl create cluster --name <your-cluster-name> --version <version-number> --nodes=1 --node-type=t2.small
catatan

Prosesnya bisa memakan waktu antara 15 hingga 20 menit. Setelah cluster dibuat, konfigurasi Kubernetes yang sesuai ditambahkan ke file kubeconfig Anda. Anda dapat menggunakan kubeconfig file dengan kubectl untuk menyebarkan aplikasi di langkah selanjutnya.

Pengembang, Admin Sistem

Verifikasi cluster Amazon EKS.

Untuk memverifikasi bahwa cluster dibuat dan Anda dapat terhubung dengannya, jalankan kubectl get nodes perintah.

Pengembang, Admin Sistem
TugasDeskripsiKeterampilan yang dibutuhkan

Buat repositori Amazon ECR.

Ikuti petunjuk dari Membuat repositori pribadi di dokumentasi Amazon ECR.

Pengembang, Admin Sistem

Buat file XMLPOM.

Buat pom.xml file berdasarkan kode file Contoh POM di bagian Informasi tambahan dari pola ini.

Pengembang, Admin Sistem

Buat file sumber.

Buat file sumber yang disebut HelloWorld.java di src/main/java/eksExample jalur berdasarkan contoh berikut:

package eksExample; import static spark.Spark.get; public class HelloWorld { public static void main(String[] args) { get("/", (req, res) -> { return "Hello World!"; }); } }

Pastikan untuk menggunakan struktur direktori berikut:

├── Dockerfile ├── deployment.yaml ├── ingress.yaml ├── pom.xml ├── service.yaml └── src └── main └── java └── eksExample └── HelloWorld.java

Buat Dockerfile.

Buat Dockerfile berdasarkan kode Contoh Dockerfile di bagian Informasi tambahan dari pola ini.

Pengembang, Admin Sistem

Bangun dan dorong gambar Docker.

Di direktori tempat Anda Dockerfile ingin membangun, menandai, dan mendorong gambar ke Amazon ECR, jalankan perintah berikut:

aws ecr get-login-password --region <region>| docker login --username <username> --password-stdin <account_number>.dkr.ecr.<region>.amazonaws.com docker buildx build --platform linux/amd64 -t hello-world-java:v1 . docker tag hello-world-java:v1 <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1 docker push <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1
catatan

Ubah Wilayah AWS, nomor akun, dan detail repositori di perintah sebelumnya. Pastikan untuk mencatat URL gambar untuk digunakan nanti.

penting

Sistem macOS dengan chip M1 memiliki masalah dalam membangun gambar yang kompatibel dengan Amazon EKS yang berjalan pada platform. AMD64 Untuk mengatasi masalah ini, gunakan docker buildx untuk membuat image Docker yang berfungsi di Amazon EKS.

TugasDeskripsiKeterampilan yang dibutuhkan

Buat file penyebaran.

Buat file YAMM yang disebut deployment.yaml berdasarkan kode file penyebaran Contoh di bagian Informasi tambahan dari pola ini.

catatan

Gunakan URL gambar yang Anda salin sebelumnya sebagai jalur file gambar untuk repositori Amazon ECR.

Pengembang, Admin Sistem

Menerapkan layanan mikro Java di kluster Amazon EKS.

Untuk membuat penerapan di cluster Amazon EKS Anda, jalankan kubectl apply -f deployment.yaml perintah.

Pengembang, Admin Sistem

Verifikasi status pod.

  1. Untuk memverifikasi status pod, jalankan kubectl get pods perintah.

  2. Tunggu status berubah menjadi Siap.

Pengembang, Admin Sistem

Buat sebuah layanan.

  1. Buat file yang disebut service.yaml berdasarkan kode file layanan Contoh di bagian Informasi tambahan dari pola ini.

  2. Jalankan perintah kubectl apply -f service.yaml.

Pengembang, Admin Sistem

Instal add-on AWS Load Balancer Controller.

Ikuti petunjuk dari Menginstal add-on AWS Load Balancer Controller dalam dokumentasi Amazon EKS.

catatan

Anda harus memiliki add-on yang diinstal untuk membuat Application Load Balancer atau Network Load Balancer untuk layanan Kubernetes.

Devloper, Sistem Admin

Buat sumber daya ingress.

Buat file YAMM yang disebut ingress.yaml berdasarkan kode file sumber daya masuk Contoh di bagian Informasi tambahan dari pola ini.

Pengembang, Admin Sistem

Buat Application Load Balancer.

Untuk menyebarkan sumber daya ingress dan membuat Application Load Balancer, jalankan perintah. kubectl apply -f ingress.yaml

Pengembang, Admin Sistem
TugasDeskripsiKeterampilan yang dibutuhkan

Uji dan verifikasi aplikasi.

  1. Untuk mendapatkan nama DNS load balancer dari bidang ADDRESS, jalankan perintah. kubectl get ingress.networking.k8s.io/java-microservice-ingress

  2. Pada EC2 instance di VPC yang sama dengan node Amazon EKS Anda, jalankan perintah. curl -v <DNS address from previous command>

Pengembang, Admin Sistem

Sumber daya terkait

Informasi tambahan

Contoh file POM

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>helloWorld</groupId> <artifactId>helloWorld</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.sparkjava</groupId><artifactId>spark-core</artifactId><version>2.0.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.4</version> <configuration><finalName>eksExample</finalName><archive><manifest> <addClasspath>true</addClasspath><mainClass>eksExample.HelloWorld</mainClass><classpathPrefix>dependency-jars/</classpathPrefix> </manifest></archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version> <configuration><source>1.8</source><target>1.8</target></configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <goals><goal>attached</goal></goals><phase>package</phase> <configuration> <finalName>eksExample</finalName> <descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs> <archive><manifest><mainClass>eksExample.HelloWorld</mainClass></manifest></archive> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>

Contoh Dockerfile

FROM bellsoft/liberica-openjdk-alpine-musl:17 RUN apk add maven WORKDIR /code # Prepare by downloading dependencies ADD pom.xml /code/pom.xml RUN ["mvn", "dependency:resolve"] RUN ["mvn", "verify"] # Adding source, compile and package into a fat jar ADD src /code/src RUN ["mvn", "package"] EXPOSE 4567 CMD ["java", "-jar", "target/eksExample-jar-with-dependencies.jar"]

Contoh berkas penyebaran

apiVersion: apps/v1 kind: Deployment metadata: name: microservice-deployment spec: replicas: 2 selector: matchLabels: app.kubernetes.io/name: java-microservice template: metadata: labels: app.kubernetes.io/name: java-microservice spec: containers: - name: java-microservice-container image: .dkr.ecr.amazonaws.com/: ports: - containerPort: 4567

Contoh file layanan

apiVersion: v1 kind: Service metadata: name: "service-java-microservice" spec: ports: - port: 80 targetPort: 4567 protocol: TCP type: NodePort selector: app.kubernetes.io/name: java-microservice

Contoh file sumber daya ingress

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: "java-microservice-ingress" annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/load-balancer-name: apg2 alb.ingress.kubernetes.io/target-type: ip labels: app: java-microservice spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: "service-java-microservice" port: number: 80