国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在Pod設(shè)置limit 的情況下,如何讓JDK容器適配

這篇具有很好參考價值的文章主要介紹了在Pod設(shè)置limit 的情況下,如何讓JDK容器適配。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

1. 背景

2. 問題

3. 解決方案

3.1. 注意

4. 參考


1. 背景

????????在使用Kubernetes部署業(yè)務(wù)應(yīng)用的實際操作中,由于k8s集群的資源是有限的,為了防止部分應(yīng)用無節(jié)制地使用資源,我們會在Deployment.yaml文件中設(shè)置request,limit的資源限制大小。

????????在 Kubernetes 中,你可以通過設(shè)置 pod 的 spec.containers[].resources.requests 和 spec.containers[].resources.limits 來配置容器的資源需求和限制。以下是一個樣例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-springboot-jdk11-demo-image
    resources:
      requests:
        cpu: "0.5"
        memory: "250Mi"
      limits:
        cpu: "2"
        memory: "8192Mi"

在這個例子中:

  • requests:這部分設(shè)置了容器啟動所需要的資源。在這個例子中,容器啟動所需的 CPU 是 0.5 個核心,內(nèi)存是 250 MiB。
  • limits:這部分設(shè)置了容器所能使用的資源的最大值。在這個例子中,容器所能使用的最多的 CPU 是 2 個核心,內(nèi)存是 8192 MiB(8Gib)。

????????如果容器使用的資源超過了所設(shè)置的 limits,那么這個容器可能會被 Kubernetes 殺掉并重啟。

2. 問題

????????在現(xiàn)實中,我們有很多應(yīng)用使用java開發(fā),那必然會使用JDK基礎(chǔ)鏡像,在這個實際操作中,我們可能會遇到明明設(shè)置了Limit,但是容器的最大Memory就是上不去,卡在2.1Gib左右,這個和使用的基礎(chǔ)鏡像有關(guān)系,部分JDK基礎(chǔ)鏡像有的存在默認的Xmx和Xms值。或者說,JDK運行在容器中,它無法確定Pod的limit是多少。

  • -Xmx<size>: 這個參數(shù)可以設(shè)置程序的最大內(nèi)存分配。比如,如果你想要設(shè)置最大內(nèi)存為1GB,你可以寫成-Xmx1024m或者-Xmx1g。
  • -Xms<size>: 這個參數(shù)可以設(shè)置程序的初始化(最?。﹥?nèi)存分配。比如,如果你想要設(shè)置最小內(nèi)存為256MB,你可以寫成-Xms256m。

3. 解決方案

????????對于運行在容器中的Java應(yīng)用,于JDK 10及以后的版本,JVM可以自動識別并根據(jù)容器的內(nèi)存限制動態(tài)設(shè)置堆大小,無需再額外手動設(shè)置JVM的-Xmx和-Xms參數(shù)。

????????JDK 10及以后的版本默認開啟了-XX:+UseContainerSupport選項,默認使用容器的cgroup限制作為JVM的內(nèi)存限制。如果你使用的是JDK 8,可以使用-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap選項來讓JVM使用容器cgroup的內(nèi)存限制。

????????此外,你還可以通過使用比例設(shè)置JVM的內(nèi)存分配,例如,你可以使用-XX:MaxRAMPercentage和-XX:MinRAMPercentage參數(shù)來限制JVM使用的最大和最小內(nèi)存占比。這兩個參數(shù)設(shè)置的是JVM可用內(nèi)存占容器可用內(nèi)存的最大和最小百分比。

-XX:MaxRAMPercentage=80.0 -XX:MinRAMPercentage=5.0

# 注意
# -XX:+UseContainerSupport參數(shù)在JDK 10及以后的版本是默認開啟的
# 完整命令:-XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -XX:MinRAMPercentage=5.0

# JDK8完整命令:-XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -XX:MinRAMPercentage=5.0

????????上述命令就設(shè)置了JVM使用最大內(nèi)存為容器內(nèi)存的80%,最小內(nèi)存為容器內(nèi)存的20%。這樣,無論你的pod限制如何變動,JVM都會按照這個比例動態(tài)調(diào)整。

????????在上述例子中,因為設(shè)置的容器內(nèi)存上限是8GB,所以JVM會設(shè)置最大堆大小(-Xmx)為8GB的80%,即6.4GB。最小堆大?。?Xms)為8GB的5%,即400MB

完整的Dockerfile如下:

FROM openjdk-11

ADD target/my-app-name.jar /app/app.jar

WORKDIR /app

ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -XX:MinRAMPercentage=5.0"

ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Dspring.profiles.active=$PROJECT_ENV -jar app.jar"]

EXPOSE 8080

3.1. 注意

????????在實際使用過程中,請注意,XX:MaxRAMPercentage=80.0是限制堆內(nèi)存最大值。我遇到一個項目出現(xiàn)這個問題,當時就提出這個問題,此處也記錄一下

:我的container limit 是3000M, 設(shè)置-XX:MaxRAMPercentage=80.0之后,在壓力測試之后,從監(jiān)控上看,內(nèi)存還是能飚高到3000M,為何沒有限制???

????????這主要是因為Java程序的內(nèi)存使用不僅僅包括堆內(nèi)存(Heap),還包括了非堆內(nèi)存(Non-Heap),其中包括MetaSpace(元數(shù)據(jù)區(qū)),JVM堆棧,JVM本身代碼等等。?MaxRAMPercentage?這個參數(shù)只是設(shè)置了堆內(nèi)存(Heap)的大小,但并沒有限制非堆內(nèi)存(Non-Heap)。

????????如果你看到的內(nèi)存占用達到了3000M,可能的情況是,堆內(nèi)存占用了你設(shè)置的比例(80%,即2400M),剩下的600M被非堆內(nèi)存占用了。

另外一個需要注意的地方,3000M的limit是設(shè)置給了整個容器,容器里不僅僅有這一個Java進程。也可能是其他進程占用了一部分內(nèi)存。

????????所以這意味著,如果你希望Java進程的最大內(nèi)存使用不超過一個確定的值,那么你需要將MaxRAMPercentage設(shè)置的更小一些,比如50%或60%等,以便為非堆內(nèi)存和其他進程留出足夠的空間。

????????注意,一定要結(jié)合實際的應(yīng)用情況去做這個調(diào)整和選擇,避免設(shè)置過小影響了Java程序的運行性能。

4. 參考

ChatGPT文章來源地址http://www.zghlxwxcb.cn/news/detail-851624.html

到了這里,關(guān)于在Pod設(shè)置limit 的情況下,如何讓JDK容器適配的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Kubernetes在容器內(nèi)獲取Pod信息

    我們知道,每個 Pod 在被成功創(chuàng)建出來之后,都會被系統(tǒng)分配唯一的名字、IP 地址,并且處于某個 Namespace 中,那么我們?nèi)绾卧?Pod 的容器內(nèi)獲取 Pod 的這些重要信息呢?答案就是使用 Downward API。 Downward API 可以通過以下兩種方式將 Pod 信息注入容器內(nèi)部。 (1)環(huán)境變量:用于單

    2024年02月10日
    瀏覽(23)
  • 【云原生|Kubernetes】08-Pod中的Init容器

    Init 容器是一種特殊容器,在 Pod內(nèi)的應(yīng)用容器啟動之前運行。Init 容器可以包括一些應(yīng)用鏡像中不存在的實用工具和安裝腳本。 你可以在 Pod 的spec中與用來描述應(yīng)用容器的 containers 數(shù)組平行的位置指定 Init 容器。 Init 容器的狀態(tài)在 status.initContainerStatuses 字段中以容器狀態(tài)數(shù)組

    2024年02月09日
    瀏覽(51)
  • Kubernetes(k8s)容器編排Pod介紹和使用

    Kubernetes(k8s)容器編排Pod介紹和使用

    Pod是kubernetes中你可以創(chuàng)建和部署的最小也是最簡的單位,一個Pod代表著集群中運行的一個進程。 Pod有兩個必須知道的特點 通過yaml文件或者json描述Pod和其內(nèi)容器的運行環(huán)境和期望狀態(tài),例如一個最簡單的運行nginx應(yīng)用的pod,定義如下 3.1.1 參數(shù)描述 下面簡要分析一下上面的

    2024年02月08日
    瀏覽(119)
  • kubernetes(k8s)為容器和 Pod 分配內(nèi)存資源

    kubernetes(k8s)為容器和 Pod 分配內(nèi)存資源

    展示如何將內(nèi)存請求(request)和內(nèi)存限制(limit)分配給一個容器。 我們保障容器擁有它請求數(shù)量的內(nèi)存,但不允許使用超過限制數(shù)量的內(nèi)存。 創(chuàng)建新的命名空間 編輯yaml文件 配置文件的 args 部分提供了容器啟動時的參數(shù)。 “–vm-bytes”, “150M” 參數(shù)告知容器嘗試分配 15

    2024年02月15日
    瀏覽(109)
  • 【云原生】kubernetes在Pod中init容器的作用和使用

    【云原生】kubernetes在Pod中init容器的作用和使用

    目錄 Pod 中 init 容器 1 init 容器特點 2 使用 init 容器 Pod 中 init 容器 Init 容器是一種特殊容器,在Pod 內(nèi)的應(yīng)用容器啟動之前運行。Init 容器可以包括一些應(yīng)用鏡像中不存在的實用工具和安裝腳本。 1 init 容器特點 init 容器與普通的容器非常像,除了如下幾點: 它們總是運行到完

    2024年02月14日
    瀏覽(31)
  • 45了解容器編排工具 Kubernetes 的基本概念和應(yīng)用,包括 Pod、Service

    45了解容器編排工具 Kubernetes 的基本概念和應(yīng)用,包括 Pod、Service

    Kubernetes 是一種用于自動部署、擴展和管理容器化應(yīng)用程序的開源容器編排工具。它可以輕松地管理和編排應(yīng)用程序容器,確保它們在大規(guī)模的云環(huán)境中高效、可靠地運行。本教程將介紹 Kubernetes 的基本概念和應(yīng)用,包括 Pod 和 Service。 Pod 是 Kubernetes 中最小的可部署對象,是

    2024年02月08日
    瀏覽(26)
  • kubernetes|云原生| 如何優(yōu)雅的重啟和更新pod---pod生命周期管理實務(wù)

    kubernetes|云原生| 如何優(yōu)雅的重啟和更新pod---pod生命周期管理實務(wù)

    kubernetes的管理維護的復(fù)雜性體現(xiàn)在了方方面面,例如,pod的管理,服務(wù)的管理,用戶的管理(RBAC),網(wǎng)絡(luò)的管理等等,因此,kubernetes安裝部署完畢僅僅是萬里長征的第一步,后面的運營和維護工作才是更為關(guān)鍵的東西。 那么,pod的生命周期是什么概念呢?這

    2024年02月04日
    瀏覽(18)
  • k8s(Kubernetes)設(shè)置 pod,Deployment 域名自定義映射ip,hosts 解析 HostAliases

    直接 編輯修改 Deployment 最后內(nèi)容如下,如需保存 按 esc 鍵,最后輸入 :wq 保存退出,容器會自動重新生成新的

    2024年02月12日
    瀏覽(56)
  • 十一. Kubernetes 容器 container 設(shè)置詳解

    十一. Kubernetes 容器 container 設(shè)置詳解

    pod是k8s的基本單位,用k8s部署的應(yīng)用運行在container容器中, 容器運行在pod中,pod又運行在k8s的節(jié)點上,一個pod內(nèi)部可以啟動多個container容器,所以pod又稱為容器組(pod內(nèi)部運行的docker容器,使用docker容器啟動服務(wù)時一個容器只能啟動一個服務(wù),使用k8s后,pod是k8s的基本單位一個pod中可以運

    2024年02月08日
    瀏覽(22)
  • 云原生之深入解析Kubernetes Pod如何獲取IP地址

    云原生之深入解析Kubernetes Pod如何獲取IP地址

    一、背景 Kubernetes 網(wǎng)絡(luò)模型的核心要求之一是每個 Pod 都擁有自己的 IP 地址并可以使用該 IP 地址進行通信。很多人剛開始使用 Kubernetes 時,還不清楚如何為每個 Pod 分配 IP 地址。它們了解各種組件如何獨立工作,但不清楚這些組件如何組合在一起使用。例如,它們了解什么是

    2024年02月02日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包