Kubernetes için Java uygulamalarınızı kapsayıcıya alma

Bu makalede, Kubernetes'te dağıtım için Java uygulamalarınızı kapsayıcıya alma işlemleri açıklanmaktadır.

Kapsayıcı belleği, JVM yığın belleği, çöp toplayıcılar (GC' ler) ve vCPU çekirdekleri hakkında yönergeler için bkz . Java uygulamalarınızı kapsayıcıya alma.

Kubernetes düğüm havuzu için uygun VM SKU'su belirleme

Kubernetes düğüm havuzunun veya kümeniz için kullanılabilir havuzların kullanmayı planladığınız kapsayıcı belleğine ve vCPU çekirdeklerine sığıp sığmayacağını belirleyin. Düğüm havuzu uygulamayı barındırabiliyorsa devam edin. Aksi takdirde, kapsayıcı belleği miktarına ve hedeflediğiniz vCPU çekirdeği sayısına uygun bir düğüm havuzu sağlayın.

VM SKU'sunun maliyetinin çekirdek sayısı ve bellek miktarıyla orantılı olduğunu unutmayın. Bir kapsayıcı örneği için başlangıç noktanızı vCPU'lar ve bellek açısından belirledikten sonra, yalnızca yatay ölçeklendirme ile uygulamanızın gereksinimlerini karşılayıp karşılayamayacağınızı belirleyin. Güvenilir, her zaman açık sistemler için en az iki çoğaltma kullanılabilir olmalıdır. Gerektiğinde ölçeği artırma ve genişletme.

CPU isteklerini ve sınırlarını ayarlama

CPU'yu sınırlamanız gerekiyorsa, hem hem de limitsrequests dağıtım dosyasında aynı değeri uyguladığınıza emin olun. JVM, GC ve diğer iş parçacığı havuzları gibi çalışma zamanını dinamik olarak ayarlamaz. JVM, yalnızca başlangıç zamanında kullanılabilen işlemci sayısını okur.

Bahşiş

CPU istekleri ve CPU sınırları için aynı değeri ayarlayın.

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

JVM kullanılabilir işlemcilerini anlama

OpenJDK'daki HotSpot JVM bir kapsayıcı içinde çalıştığını belirlediğinde, ve gibi cpu_quotacpu_period değerleri kullanarak kullanılabilir işlemci sayısını belirler. Genel olarak, milicore değerine kadar 1000m olan tüm değerler tek bir işlemci makinesi olarak tanımlanır. ile 2000m arasındaki 1001m herhangi bir değer çift işlemcili makine olarak tanımlanır ve benzeri. Bu bilgiler, API Runtime.getRuntime().availableProcessors() aracılığıyla kullanılabilir. Bu değer, iş parçacıklarını yapılandırmak için bazı eşzamanlı GC'ler tarafından da kullanılabilir. Diğer API'ler, kitaplıklar ve çerçeveler de iş parçacığı havuzlarını yapılandırmak için bu bilgileri kullanabilir.

Kubernetes CPU kotaları, işlemin CPU'da harcadığı süreyle ilgilidir ve işlem için kullanılabilir CPU sayısıyla ilgili değildir. JVM gibi çok iş parçacıklı çalışma zamanları, birden çok iş parçacığıyla aynı anda birden çok işlemciyi kullanmaya devam edebilir. Kapsayıcının bir vCPU sınırı olsa bile, JVM'ye iki veya daha fazla kullanılabilir işlemci görmesi talimatı verilebilir.

Bir Kubernetes ortamında görmesi gereken işlemci sayısını JVM'ye bildirmek için aşağıdaki JVM bayrağını kullanın:

-XX:ActiveProcessorCount=N

Bellek isteği ve sınırları ayarlama

Bellek sınırlarını daha önce belirlediğiniz miktara ayarlayın. Bellek sınırları numarasının kapsayıcı belleği ve JVM yığın bellek değeri DEĞİl olduğundan emin olun.

Bahşiş

Bellek isteklerini bellek sınırlarına eşit olarak ayarlayın.

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

Dağıtım dosyasında JVM bağımsız değişkenlerini ayarlama

JVM yığın belleğini daha önce belirlediğiniz miktara ayarlamayı unutmayın. Kapsayıcı görüntüsünü yeniden oluşturmanıza gerek kalmadan kolayca değiştirebilmeniz için bu değeri ortam değişkeni olarak geçirmenizi öneririz.

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

Sonraki adımlar