Kontainerisasi aplikasi Java Anda untuk Kubernetes

Artikel ini menjelaskan cara membuat kontainer aplikasi Java untuk penyebaran di Kubernetes.

Untuk panduan tentang memori kontainer, memori tumpukan JVM, pengumpul sampah (GC), dan inti vCPU, lihat Membuat kontainer aplikasi Java Anda.

Tentukan SKU VM yang sesuai untuk kumpulan simpul Kubernetes

Tentukan apakah kumpulan simpul Kubernetes atau kumpulan yang tersedia untuk kluster Anda dapat sesuai dengan memori kontainer dan inti vCPU yang ingin Anda gunakan. Jika kumpulan simpul dapat menghosting aplikasi, lanjutkan. Jika tidak, provisikan kumpulan simpul yang sesuai untuk jumlah memori kontainer dan jumlah inti vCPU yang Anda targetkan.

Perlu diingat bahwa biaya SKU VM sebanding dengan jumlah inti dan jumlah memori. Setelah Anda menentukan titik awal dalam hal vCPU dan memori untuk satu instans kontainer, tentukan apakah Anda dapat memenuhi kebutuhan aplikasi Hanya dengan penskalaan horizontal. Untuk sistem yang andal dan selalu aktif, minimal dua replika harus tersedia. Tingkatkan dan keluar sesuai kebutuhan.

Mengatur permintaan dan batasan CPU

Jika Anda harus membatasi CPU, pastikan Anda menerapkan nilai yang sama untuk dan limitsrequests dalam file penyebaran. JVM tidak secara dinamis menyesuaikan runtimenya, seperti GC dan kumpulan utas lainnya. JVM membaca jumlah prosesor yang hanya tersedia selama waktu mulai.

Tip

Tetapkan nilai yang sama untuk permintaan CPU dan batas CPU.

containers:
- image: myimage
  name: myapp
  resources:
    limits:
      cpu: "2"
    requests:
      cpu: "2"

Memahami prosesor JVM yang tersedia

Ketika HotSpot JVM di OpenJDK mengidentifikasi bahwa ia berjalan di dalam kontainer, ia menggunakan nilai seperti cpu_quota dan cpu_period untuk menentukan berapa banyak prosesor yang tersedia untuk itu. Secara umum, nilai apa pun hingga 1000m millicore diidentifikasi sebagai satu mesin prosesor. Nilai apa pun antara 1001m dan 2000m diidentifikasi sebagai mesin prosesor ganda, dan sebagainya. Informasi ini tersedia melalui API Runtime.getRuntime().availableProcessors(). Nilai ini juga dapat digunakan oleh beberapa GC bersamaan untuk mengonfigurasi utasnya. API, pustaka, dan kerangka kerja lainnya juga dapat menggunakan informasi ini untuk mengonfigurasi kumpulan utas.

Kuota CPU Kubernetes terkait dengan jumlah waktu yang dihabiskan proses dalam CPU, dan bukan jumlah CPU yang tersedia untuk proses. Runtime multi-utas seperti JVM mungkin masih menggunakan beberapa prosesor secara bersamaan, dengan beberapa utas. Bahkan jika kontainer memiliki batas satu vCPU, JVM dapat diinstruksikan untuk melihat dua atau beberapa prosesor yang tersedia.

Untuk menginformasikan JVM tentang jumlah prosesor yang tepat yang harus dilihatnya di lingkungan Kubernetes, gunakan bendera JVM berikut:

-XX:ActiveProcessorCount=N

Mengatur permintaan dan batas memori

Atur batas memori ke jumlah yang sebelumnya Anda tentukan. Pastikan nomor batas memori adalah memori kontainer dan BUKAN nilai memori heap JVM.

Tip

Atur permintaan memori sama dengan batas memori.

containers:
  - name: myimage
    image: myapp
    resources:
      limits:
        memory: "4Gi"
      requests:
        memory: "4Gi"

Mengatur argumen JVM dalam file penyebaran

Ingatlah untuk mengatur memori tumpukan JVM ke jumlah yang telah Anda tentukan sebelumnya. Kami menyarankan agar Anda meneruskan nilai ini sebagai variabel lingkungan sehingga Anda dapat dengan mudah mengubahnya tanpa perlu membangun kembali gambar kontainer.

containers:
  - name: myimage
    image: myapp
    env:
    - name: JAVA_OPTS
      value: "-XX:+UseParallelGC -XX:MaxRAMPercentage=75"

Langkah berikutnya