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

【kubernetes系列】kubernetes之計算資源管理

這篇具有很好參考價值的文章主要介紹了【kubernetes系列】kubernetes之計算資源管理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

資源類型

在 Kubernetes 中,Node 提供資源,而 Pod 使用資源。其中資源分為計算(CPU、Memory、GPU)、存儲(Disk、SSD)、網(wǎng)絡(luò)(Network Bandwidth、IP、Ports)。這些資源提供了應(yīng)用運行的基礎(chǔ),正確理解這些資源以及集群調(diào)度如何使用這些資源,對于大規(guī)模的 Kubernetes 集群來說至關(guān)重要,不僅能保證應(yīng)用的穩(wěn)定性,還可以提高資源的利用率。在日常工作中,我們一般比較關(guān)心其中的計算資源,包括CPU和內(nèi)存。CPU 的單位是 core,memory 的單位是 byte。

可壓縮資源

目前kubernetes支持的可壓縮資源是CPU。它的特點是,當可壓縮資源不足時,Pod 只會饑餓少用,但不會退出。CPU 資源的限制和請求以cpu為單位。Kubernetes 中的一個 cpu 就是一個核,就是一個邏輯CPU。一個核相當于1000個微核,即1=1000m,0.5=500m。

不可壓縮資源

目前kubernetes支持的不可壓縮資源是內(nèi)存。它的特點是,當不可壓縮資源不足時,Pod 就會因為 OOM被內(nèi)核殺掉。內(nèi)存的限制和請求以字節(jié)為單位??梢允褂靡韵潞缶Y之一作為平均整數(shù)或定點整數(shù)表示內(nèi)存:E,P,T,G,M,K。還可以使用兩個字母的等效的冪數(shù):Ei,Pi,Ti ,Gi,Mi,Ki。

POD中的資源請求和資源限制

requests 資源請求 pod最低需求(表示Pod對資源的最小需求,因此在調(diào)度的時候會如果Node剩余的資源不能滿足Pod的需求,則不會調(diào)度到對應(yīng)的Node上。Scheduler調(diào)度的時候并不關(guān)注在調(diào)度時具體的資源使用情況,而是根據(jù)現(xiàn)存Pod的資源請求情況來進行調(diào)度。調(diào)度器首先將不符合請求的Node排除在外,然后在執(zhí)行優(yōu)選策略最后在選定pod)

由于 Pod 可以由多個 Container 組成,所以 CPU 和內(nèi)存資源的限額,是要配置在每個Container的定義上的。這樣,Pod 整體的資源配置,就由這些 Container的配置值累加得到。

示例

執(zhí)行下面yaml的內(nèi)容:

[root@k8s-m1 k8s-resource]# cat resource-limit-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: resource-limit-pod
  namespace: default
  labels:
    name: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/stress-ng
    command: ["/usr/bin/stress-ng","-c 1","--metrics-brief"]
    ports:
    - name: http
      containerPort: 80
    resources:
      requests:
        memory: "128Mi"
        cpu: "200m"
      limits:
        memory: "512Mi"
        cpu: "500m"
[root@k8s-m1 k8s-resource]# kubectl apply  -f resource-limit-pod.yaml 
pod/resource-limit-pod created

查看結(jié)果:

[root@k8s-m1 k8s-resource]# kubectl exec -it resource-limit-pod -- top
Mem: 7805096K used, 202092K free, 6444K shrd, 2104K buff, 4575292K cached
CPU:   3% usr   1% sys   0% nic  88% idle   6% io   0% irq   0% sirq
Load average: 0.14 0.55 0.71 3/1509 33
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
    6     1 root     R     6892   0%  15   2% {stress-ng-cpu} /usr/bin/stress-ng -c 1 --metrics-brief
    1     0 root     S     6244   0%   9   0% /usr/bin/stress-ng -c 1 --metrics-brief
   29     0 root     R     1500   0%   9   0% top

我們看到CPU占用是3%,為什么呢?因為我的集群node都是是16個core。我們最大限制是0.5核。所以應(yīng)該是0.5/16≈3.1%。

Request和Limits

基于Requests和Limits的Pod調(diào)度機制

  • 調(diào)度器在調(diào)度時,首先要確保調(diào)度后該節(jié)點上所有Pod的CPU和內(nèi)存的Requests總和,不超過該節(jié)點能提供給Pod使用的CPU和Memory的最大容量值;
  • 即使某節(jié)點上的實際資源使用量非常低,但是已運行Pod配置的Requests值的總和非常高,再加上需要調(diào)度的Pod的Requests值,會超過該節(jié)點提供給Pod的資源容量上限,這時Kubernetes仍然不會將Pod調(diào)度到該節(jié)點上。如果Kubernetes將Pod調(diào)度到該節(jié)點上,之后該節(jié)點上運行的Pod又面臨服務(wù)峰值等情況,就可能導(dǎo)致Pod資源短缺;

Requests和Limits的背后機制

kubelet在啟動Pod的某個容器時,會將容器的Requests和Limits值轉(zhuǎn)化為相應(yīng)的容器啟動參數(shù)傳遞給容器執(zhí)行器。如果是docker 容器:

  • spec.container[].resources.requests.cpu: 轉(zhuǎn)化為docker 的–cpu-share;
  • spec.container[].resources.limits.cpu: 轉(zhuǎn)為docker的–cpu-quota;
  • spec.container[].resources.requests.memory: 提供給Kubernetes調(diào)度器作為調(diào)度和管理的依據(jù),不會作為任何參數(shù)傳遞給Docker;
  • spec.container[].resources.limits.memory: 會轉(zhuǎn)為–memory;
    【kubernetes系列】kubernetes之計算資源管理,Kubernetes,kubernetes

QoS(服務(wù)質(zhì)量等級)

Kubernetes是根據(jù)Pod的Requests和Limits配置來實現(xiàn)針對Pod的不同級別的資源服務(wù)質(zhì)量控制。當 Kubernetes 創(chuàng)建一個 Pod 時,它就會給這個 Pod 分配一個 QoS 等級。

QoS分類

  • Guaranteed:pod里的每一個container都同時設(shè)置了CPU和內(nèi)存的requests和limits 而且值必須相等。(這類的pod是最高優(yōu)先級)
  • Burstable:pod至少有一個container設(shè)置了cpu或內(nèi)存的requests和limits,且不滿足 Guarantee 等級的要求。即內(nèi)存或CPU的值設(shè)置的不同。(中等優(yōu)先級)
  • BestEffort:沒有任何一個容器設(shè)置了requests或limits的屬性。(最低優(yōu)先級)

應(yīng)用場景:當宿主機資源緊張的時候,kubelet會根據(jù)服務(wù)質(zhì)量等級對pod進行eviction,即驅(qū)逐pod進行資源回收。

Requests和Limits資源配置特點

  • 如果Pod配置的Requests值等于Limits值,那么該Pod可以獲得的資源是完全可靠的;
  • 如果Pod的Requests值小于Limits值,那么該Pod獲得的資源可分成兩部分;

完全可靠的資源,資源量的大小等于Requests值;
不可靠的資源,資源量最大等于Limits與 Requests的差額,這份不可靠的資源能夠申請到多少,取決于當時主機上容器可用資源的余量;通過這種機制,Kubernetes可以實現(xiàn)節(jié)點資源的超售(Over Subscription),超售機制能有效提高資源的利用率,同時不會影響容器申請的完全可靠資源的可靠性。

調(diào)度策略的影響

  • Kubernetes的kubelet通過計算Pod中所有容器的Requests的總和來決定對Pod的調(diào)度;
  • 不管是CPU還是內(nèi)存,Kubernetes調(diào)度器和kubelet都會確保節(jié)點上所有Pod的Requests的總和不會超過在該節(jié)點上可分配給容器使用的資源容量上限;

示例

https://www.cnblogs.com/wtzbk/p/15816291.html

Guaranteed樣例

[root@k8s-m1 k8s-resource]# cat   guaranteed-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: guaranteed-pod
  labels:
    name: nginx
spec:
  containers:
  - name: myapp
    image: nginx
    ports:
    - name: http
      containerPort: 80
    resources:
      requests:
        memory: "512Mi"
        cpu: "500m"
      limits:
        memory: "512Mi"
        cpu: "500m"
[root@k8s-m1 k8s-resource]# kubectl apply -f guaranteed-pod.yaml 
pod/guaranteed-pod created

結(jié)果:

[root@k8s-m1 k8s-resource]# kubectl describe po guaranteed-pod 
......
Volumes:
  default-token-glxls:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-glxls
    Optional:    false
QoS Class:       Guaranteed
Node-Selectors:  <none>
.....

更詳細檢查
1)查看該pod被分配到的節(jié)點

[root@k8s-m1 k8s-resource]# kubectl get pod -o wide
NAME                 READY   STATUS    RESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
guaranteed-pod       1/1     Running   0          8s      10.244.11.39    k8s-m3   <none>           <none>

2)然后到k8s-m3上去查看這個pod里面啟動的容器的資源限制是否生效

[root@k8s-m3 ~]# docker ps |grep guaranteed
434a95e67849   nginx                                               "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes             k8s_myapp_guaranteed-pod_default_7095c77a-7c31-4a0a-ba1c-c347c690cfe8_0
32a0053da67b   registry.aliyuncs.com/google_containers/pause:3.2   "/pause"                 6 minutes ago   Up 6 minutes             k8s_POD_guaranteed-pod_default_7095c77a-7c31-4a0a-ba1c-c347c690cfe8_0

#查看主容器的信息
[root@k8s-m3 ~]# docker inspect  434|egrep -i 'cpu|mem'
            "CpuShares": 512,
            "Memory": 536870912,
            "NanoCpus": 0,
            "CpuPeriod": 100000,
            "CpuQuota": 50000,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 536870912,
            "MemorySwappiness": null,
            "CpuCount": 0,
            "CpuPercent": 0,
關(guān)注Memory、CpuPeriod、CpuQuota這三個值

3)通過cgroup的相關(guān)信息查看
從上面的結(jié)果實際上我們就可以看到這個容器的一些資源情況,Pod 上的資源配置最終也還是通過底層的容器運行時去控制 CGroup 來實現(xiàn)的,我們可以進入如下目錄查看 CGroup 的配置,該目錄就是 CGroup 父級目錄,而 CGroup 是通過文件系統(tǒng)來進行資源限制的,所以我們上面限制容器的資源就可以在該目錄下面反映出來:
##查看CPU的限制##

[root@k8s-m3 ~]# docker exec -it 434 /bin/bash
root@guaranteed-pod:/# cd /sys/fs/cgroup/cpu/
root@guaranteed-pod:/sys/fs/cgroup/cpu# cat cpu.cfs_period_us 
100000
root@guaranteed-pod:/sys/fs/cgroup/cpu# cat cpu.cfs_quota_us  
50000
root@guaranteed-pod:/sys/fs/cgroup/cpu# 
#反向計算出--cpus參數(shù)
#cpu.cfs_quota_us / cpu.cfs_period_us = cpu的限制
50000/100000=0.5核(也就是500m)

##查看內(nèi)存的限制##
root@guaranteed-pod:/sys/fs/cgroup/cpu# cd /sys/fs/cgroup/memory/
root@guaranteed-pod:/sys/fs/cgroup/memory# cat memory.limit_in_bytes 
536870912
root@guaranteed-pod:/sys/fs/cgroup/memory# 

內(nèi)存的計算方法為:536870912÷1024÷1024÷1024 = 0.5(G)

Burstable樣例

[root@k8s-m1 k8s-resource]# cat  burstable-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: burstable-pod
  labels:
    name: nginx
spec:
  containers:
  - name: myapp
    image: nginx
    ports:
    - name: http
      containerPort: 80
    resources:
      requests:
        memory: "256Mi"
        cpu: "200m"
      limits:
        memory: "512Mi"
        cpu: "500m"

[root@k8s-m1 k8s-resource]# kubectl apply  -f burstable-pod.yaml 
pod/burstable-pod created

結(jié)果:

[root@k8s-m1 k8s-resource]# kubectl describe po burstable-pod 
......
Volumes:
  default-token-glxls:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-glxls
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
......

上面Burstable的示例中,可以看到limit和Request都設(shè)置了的,且limit大于Request。大家可以自行測試只設(shè)置其中一個的Qos等級。當只設(shè)置Request時,系統(tǒng)是不會補全limit的相關(guān)配置,也是Burstable。而當只設(shè)置limit時,系統(tǒng)會自動補全Request的相關(guān)配置和limit一樣,Qos是Guaranteed類型。

BestEffort樣例

[root@k8s-m1 k8s-resource]# cat  besteffort-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: besteffort-pod
  labels:
    name: myapp
    tier: appfront
spec:
  containers:
  - name: http
    image: nginx
    ports:
    - name: http
      containerPort: 80

[root@k8s-m1 k8s-resource]# kubectl apply -f besteffort-pod.yaml 
kupod/besteffort-pod created

結(jié)果:

[root@k8s-m1 k8s-resource]# kubectl describe po besteffort-pod 
......
Volumes:
  default-token-glxls:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-glxls
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
.....

總結(jié):
CPU是可以壓縮資源,所以在CPU不夠的時候會壓縮限流。而內(nèi)存是不可壓縮資源,所以QoS主要用于內(nèi)存限制。

  • BestEffort Pod的優(yōu)先級最低,在這類Pod中運行的進程會在系統(tǒng)內(nèi)存緊缺時被第一優(yōu)先殺掉。當然,從另外一個角度來看,BestEffort Pod由于沒有設(shè)置資源Limits,所以在資源充足時,它們可以充分使用所有的閑置資源;
  • Burstable Pod的優(yōu)先級居中,這類Pod初始時會分配較少的可靠資源,但可以按需申請更多的資源。當然,如果整個系統(tǒng)內(nèi)存緊缺,又沒有BestEffort容器可以被殺掉以釋放資源,那么這類Pod中的進程可能會被殺掉;
  • Guaranteed Pod的優(yōu)先級最高,而且一般情況下這類Pod只要不超過其資源Limits的限制就不會被殺掉。當然,如果整個系統(tǒng)內(nèi)存緊缺,又沒有其他更低優(yōu)先級的容器可以被殺掉以釋放資源,那么這類Pod中的進程也可能會被殺掉;

OOM計分系統(tǒng)

【kubernetes系列】kubernetes之計算資源管理,Kubernetes,kubernetes
如果kubelet無法在系統(tǒng)OOM之前回收足夠的內(nèi)存,則oom_killer 會根據(jù)內(nèi)存使用比率來計算oom._score, 將得出的結(jié)果和oom_score_adj相加,最后得分最高的Pod會被首先驅(qū)逐。這個策略的思路是,QoS最低且相對于調(diào)度的Request來說消耗最多內(nèi)存的Pod會被首先清除,來保障內(nèi)存的回收。這意味著與Burstable或Guaranteed QoS類別的容器相比,BestEffort這種類別的容器被殺死的可能性更高。
與Pod驅(qū)逐不同,如果一個Pod的容器被oom殺掉,是可能被 kubelet根據(jù)restartpolicy重啟的。

容器中的JVM資源限制

在Kubernetes環(huán)境中部署Java程序不一會就重啟了,這意味著你的pod是不健康的。然后我們可以通過describe去查看一下重啟的原因。發(fā)現(xiàn)是因為Pod超出了資源限制被kill掉,在日志最后一行會出現(xiàn)一個kill的字段。為什么Kubernetes會kill掉,因為它超出了Kubernetes對Pod的資源限制。默認情況下Docker容器會使用宿主機所有的資源,但如果不做資源限制,會影響整個宿主機。然后整個宿主機資源不夠會實現(xiàn)飄移,會轉(zhuǎn)移到其他主機上,然后再異常,可能會起到一種雪崩的效應(yīng),所以一般我們都是要做Pod資源限制。如果Java容器中未設(shè)置JVM的-Xmx(最大的堆內(nèi)存使用)參數(shù),一旦這個Pod的使用內(nèi)存超出Kubernetes的limits限制,Kubernetes就會把它殺掉并重啟一個新的Pod。所以在實際使用中,JVM中的這個值建議要比limits要小一點,小個10%左右,因為超過這個limits限制就可能會被殺死掉再重新起一個Pod。

更多關(guān)于kubernetes的知識分享,請前往博客主頁。編寫過程中,難免出現(xiàn)差錯,敬請指出文章來源地址http://www.zghlxwxcb.cn/news/detail-583876.html

到了這里,關(guān)于【kubernetes系列】kubernetes之計算資源管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • (kubernetes)k8s常用資源管理

    (kubernetes)k8s常用資源管理

    目錄 k8s常用資源管理 1、創(chuàng)建一個pod 1)創(chuàng)建yuml文件 2)創(chuàng)建容器 3)查看所有pod創(chuàng)建運行狀態(tài) 4)查看指定pod資源 5)查看pod運行的詳細信息 6)驗證運行的pod 2、pod管理 1)刪除pod 2)查看刪除pod無法找到 3)創(chuàng)建pod 4)發(fā)現(xiàn)最先創(chuàng)建的pod運行在k8s-master節(jié)點上,下載鏡像速度太

    2024年02月13日
    瀏覽(52)
  • 【Kubernetes資源篇】ConfigMap配置管理中心詳解

    【Kubernetes資源篇】ConfigMap配置管理中心詳解

    1、ConfigMap配置中心簡介 官方中文參考文檔: ConfigMap是API對象,用于存放明文(非機密性)數(shù)據(jù)保存到鍵值對中,可以使用環(huán)境變量、命令行參數(shù)或者存儲卷方式應(yīng)用到Pod中,ConfigMap相當于Pod中程序的配置文件,通過修改ConfigMap內(nèi)容來修改程序的配置。 2、ConfigMap局限性 ConfigM

    2024年02月13日
    瀏覽(54)
  • 云原生Kubernetes:K8S配置資源管理

    云原生Kubernetes:K8S配置資源管理

    目錄 一、理論 1.Secret 2.Secret創(chuàng)建 3.Secret使用 4.Configmap 5.Configmap創(chuàng)建 6.Configmap使用 二、實驗 1.Secret創(chuàng)建 2.Secret使用 3.Configmap創(chuàng)建 4.Configmap使用 三、問題 1.變量引用生成資源報錯 2.查看pod日志失敗 3.創(chuàng)建configmap報錯 4.YAML創(chuàng)建configmap報錯 5. 生成資源報錯 6.文件掛載pod報錯Error 四

    2024年02月07日
    瀏覽(25)
  • 【Kubernetes資源篇】StatefulSet無狀態(tài)服務(wù)管理入門實戰(zhàn)詳解

    【Kubernetes資源篇】StatefulSet無狀態(tài)服務(wù)管理入門實戰(zhàn)詳解

    官方中文參考文檔 1、StatefulSet Pod控制器特性 StatefulSet(簡寫sts)也是K8S集群中的一種Pod資源管理器,與deployment Pod控制器不同的是,StatefulSet用于管理無狀態(tài)程序,特性如下: 穩(wěn)定的網(wǎng)絡(luò)標識符:管理的Pod都擁有一個穩(wěn)定的網(wǎng)絡(luò)標識符??梢酝ㄟ^網(wǎng)絡(luò)標識符進行訪問。 有序部署

    2024年02月13日
    瀏覽(22)
  • 在CSDN學(xué)Golang云原生(Kubernetes聲明式資源管理Kustomize)

    在CSDN學(xué)Golang云原生(Kubernetes聲明式資源管理Kustomize)

    在 Kubernetes 中,我們可以通過 YAML 或 JSON 文件來定義和創(chuàng)建各種資源對象,例如 Pod、Service、Deployment 等。下面是一個簡單的 YAML 文件示例,用于創(chuàng)建一個 Nginx Pod: 該文件包含了以下信息: apiVersion :指定 Kubernetes API 的版本。 kind :指定資源類型,這里為 Pod。 metadata :定義

    2024年02月15日
    瀏覽(25)
  • yum部署kubernetes(k8s)集群、k8s常用資源管理

    目錄 一、環(huán)境搭建 1、準備環(huán)境 1)計算機說明,建議系統(tǒng)版本7.4或者7.6 2)修改所有主機的計算機名設(shè)置host文件 ?2、安裝master節(jié)點 1)安裝etcd配置etcd 2)安裝k8s-master節(jié)點 3)配置apiserver 4)配置controller和scheduler 5)啟動k8s服務(wù) 3、安裝k8s-master上的node 1)安裝node 2)配置kube

    2024年02月13日
    瀏覽(35)
  • Kubernetes(K8s)與虛擬GPU(vGPU):實現(xiàn)高效管理和利用GPU資源的最佳實踐

    目錄 第一節(jié):Kubernetes簡介 第二節(jié):虛擬GPU(vGPU)簡介 第三節(jié):Kubernetes中的GPU資源管理 第四節(jié):虛擬GPU(vGPU)的部署和配置 第五節(jié):GPU資源調(diào)度和負載均衡 第六節(jié):GPU資源監(jiān)控和調(diào)優(yōu) 結(jié)論: 可先閱讀一下參考: kubernetes如何將異構(gòu)GPU(如NVIDIA、海光、寒武紀)統(tǒng)一協(xié)同

    2024年04月13日
    瀏覽(31)
  • K8S資源管理之計算資源管理

    K8S資源管理之計算資源管理

    ????????以CPU為例,下圖顯示了未設(shè)置Limits與設(shè)置了Requests和Limits的CPU使用率的區(qū)別 ???????盡管Requests和Limits只能被設(shè)置到容器上,但是設(shè)置了Pod級別的Requests和Limits能大大提高管理Pod的便利性和靈活性,因此在Kubernetes中提供了對Pod級別的Requests和Limits的配置。對于CP

    2024年04月15日
    瀏覽(23)
  • 水資源管理:云計算在水資源管理中的優(yōu)勢

    水資源是人類生存和發(fā)展的基礎(chǔ),同時也是一個國家或地區(qū)的重要戰(zhàn)略資源。隨著人口增長、經(jīng)濟發(fā)展和工業(yè)化進程,水資源的緊缺和污染問題日益嚴重。為了有效地管理水資源,提高水資源利用效率,降低污染水體的成本,云計算技術(shù)在水資源管理領(lǐng)域發(fā)揮著重要作用。本

    2024年04月16日
    瀏覽(28)
  • 【kubernetes系列】Kubernetes之資源限制ResourceQuota

    當多個用戶或團隊共享具有固定節(jié)點數(shù)目的集群時,人們會擔(dān)心有人使用超過其基于公平原則所分配到的資源量。我們可以通過ResourceQuota來解決這個問題,對每個namespace的資源消耗總量提供限制。它可以限制命名空間中某種類型的對象的總數(shù)目上限,也可以限制命名空間中的

    2024年02月16日
    瀏覽(13)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包