k8s入坑之路(13)kubernetes重要資源(namespace隔離 resources資源管理 label)


Namespace --- 集群的共享與隔離

語言中namespace概念

 

  • namespace核心作用隔離

  以上是隔離的代碼。namespace隔離的是:

  • 1.資源對象的隔離:Service、Deployment、Pod
  • 2.資源配額的隔離:Cpu、Memory

創建命名空間

kubectl create namespace dev

apiVersion: v1
kind: Namespace
metadata:
  name: dev

kubectl create -f namespace.yaml

kubectl get all -n dev

 

yaml文件中指定namespace

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo-new
  namespace: dev
spec:
  selector:
    matchLabels:
      app: web-demo
  replicas: 1
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
      - name: web-demo
        image: 172.17.166.217/kubenetes/k8s-web-demo:2021070520
        ports:
        - containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-demo
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-demo
  type: ClusterIP

---
#ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-demo
  namespace: dev
spec:
  rules:
  - host: www.csweb.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: web-demo
            port:
              number: 80
web.yaml

####在metadata中指定namespace

不同命名空間下的service-ip是可以互相訪問的,與命名空間無關。

不同命名空間下的pod名稱與dns是訪問不到的。pod-ip是不隔離的。

 

切換默認namespace

kubectl config set-context ctx-dev \
  --cluster=kubernetes \
  --user=admin \
  --namespace=dev \
  --kubeconfig=/root/.kube/config
設置上下文 區分權限的話重新創建user並賦予對應權限

kubectl config set-context ctx-dev --kubeconfig=/root/.kube/config
設置當前默認上下文

 

  • 划分Namespace方式

  • 1.按照環境划分:dev、test 
  • 2.按照團隊來划分
  • 3.自定義多級划分 #安裝-划線名稱作用等划分

 

Resources---多維度集群資源管理

 

 

 

  • 限制namespace下資源

  • 1.內存
  • 2.cpu
  • 3.gpu
  • 4.持久化存儲

kubelet會收集node硬件信息等上報給apiserver。

 

  • Resources核心設計

  • 1.Requests(請求)
  • 2.Limits(限制)

requests是希望容器被容器分配到的資源,可以完全保證的資源。scheduler會使用這個值來計算,從而得到最優節點。scheduler調度是不考慮limits的。

limits是容器使用的資源上限,當整個節點資源不足時,發生競爭會參考這個值從而做出進一步的決策。把某些pod驅逐。

 

deployment中對於pod限制

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: dev
spec:
  selector:
    matchLabels:
      app: web-demo
  replicas: 4
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
      - name: web-demo
        image: 172.17.166.217/kubenetes/web:v1
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: 500Mi
            cpu: 100m
          limits:
            memory: 1000Mi
            cpu: 200m
resources-pod.yaml

#內存單位為Mi/Gi cpu為m/個數 1核心cpu=1000m

查看node節點中資源使用情況

kubectl describe nodes node-3-172.17.166.219

對應傳輸給docker的值,查看容器詳細信息

docker inspect 容器id

 

 

CpuShares=requests中cpu的值 會先把requests中定義的cpu值轉化為核數,然后乘以1024。等於其cpu權重。

Memory=requests中memory的值 會將memory定義的值*1024*1024轉化為內存字節。

 

 

 CpuQuota=limits中cpu的值,單位是minico需要*10萬。CpuPeriod是docker中默認值10萬納秒,100毫秒。一起使用表示在100毫秒中最多分配的cpu量。

 

測試內存資源限制,進入容器編寫腳本

#!/bin/bash
str="[sdfsofajpfjpfsajfs]"
while true;
do 
    str="$str$str"
    echo "+++++"
    sleep 0.1
done

###當資源耗盡(cpu/memory),會將容器中資源占用最多的進程殺掉。並不會殺掉容器。

測試cpu限制

查看cpu使用情況

crictl stats d5c1df6d1561e       

kubectl top命令需要第三方api metrics-server支持,可參考https://blog.csdn.net/wangmiaoyan/article/details/102868728

進入容器模擬cpu占用

dd if=/dev/zero of=/dev/null &執行多次就會占用光cpu

###cpu占滿后與內存不同的是進程不會殺掉,cpu是可壓縮資源,內存不是。

 

設置pod container默認限制

apiVersion: v1
kind: LimitRange #范圍的限制
metadata:
  name: test-limits #策略名稱
spec:
  limits:
  - max:
      cpu: 4000m  #最大cpu
      memory: 2Gi #最大內存
    min:
      cpu: 100m  #最小cpu
      memory: 100Mi #最小內存
    maxLimitRequestRatio:
      cpu: 3 #cpu中limits最大比requests的倍數
      memory: 2 #memory中limits最大比requests的倍數
    type: Pod #類型pod
  - default:
      cpu: 300m     #默認cpu
      memory: 200Mi #默認memory
    defaultRequest:
      cpu: 200m #默認requestcpu
      memory: 100Mi #默認request memory
    max:
      cpu: 2000m  #最大值
      memory: 1Gi
    min:
      cpu: 100m #最小值
      memory: 100Mi
    maxLimitRequestRatio:
      cpu: 5  #limit最多比request比例的倍數
      memory: 4
    type: Container  #類型container
pod-container.yaml

查看命名空間下資源限制

kubectl describe limitranges --all-namespaces 

 

namespace資源限制

資源限制

apiVersion: v1
kind: ResourceQuota #資源配額
metadata:
  name: resource-quota
  namespace: wanger
spec:
  hard:
    pods: 4  #最多允許pod個數
    requests.cpu: 2000m
    requests.memory: 4Gi
    limits.cpu: 4000m
    limits.memory: 8Gi
apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
spec:
  hard:
    configmaps: 10 #最多允許configmap
    persistentvolumeclaims: 4 #最多允許pvc
    replicationcontrollers: 20 #最多允許有replicat
    secrets: 10 #最多允許secret
    services: 10 #最多允許service

查看quota設置

kubectl get quota -n test
kubectl describe -n wanger quota

 

pod驅逐策略-Eviction

  • pod容器資源策略優先級
  • requests == limits時優先級最高(絕對可靠)
  • 不設置 (最為不可靠)
  • limits > requests 優先級次之(相對可靠)

 

kubelet啟動常用驅逐策略配置:

 

 

###當node內存小於1.5G持續1m30秒進行pod驅逐,如果node內存小於100M磁盤小於1G剩余inodes節點小於百分之五立刻進行驅逐。

kubelet配置驅逐策略:

kubelet --eviction-hard=imagefs.available<10%,memory.available<500Mi,nodefs.available<5%,nodefs.inodesFree<5% --eviction-soft=imagefs.available<30%,nodefs.available<10% --eviction-soft-grace-period=imagefs.available=2m,nodefs.available=2m --eviction-max-pod-grace-period=600

#或者啟動文件中配置

 

磁盤緊缺驅逐優先級
  • 刪除死掉的pod、容器
  • 刪除沒用的鏡像
  • 按資源優先級、資源占用情況進行驅逐 ###如同一優先級下先驅逐占用資源多的

 

 

內存驅逐策略
  • 驅逐不可靠的pod #按照資源占用情況驅逐
  • 驅逐基本可靠的pod #limit大於request的pod limit比request占用值越大越先驅逐
  • 驅逐可靠pod #按照資源占用

 

 

 

label小標簽大作用 

 

 

 

label本質是key=value鍵值對,可以貼到任意資源中。

deployment通過標簽選擇pod

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: dev
spec:
  selector:
    matchLabels:
      app: web-demo #選擇pod label app=web-demo
  replicas: 1
  template:
    metadata:
      labels:
        app: web-demo #定義pod label app=web-demo 
    spec:
      containers:
      - name: web-demo
        image: hub.mooc.com/kubernetes/web:v1
        ports:
        - containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-demo
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-demo #service 選擇pod label app=web-demo
  type: ClusterIP

###1.6版本之前在pod之上還有rc概念,即replicas副本控制器。deployment將rc封裝,deployment本質是操作副本控制器。selector與pod名稱需一致,rc去調用pod。deployment label是可變的,多個同樣名稱的rc和pod是不沖突的,屬於不同的deployment

 pod通過group標簽rc選中group

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: dev
spec:
  selector:
    matchLabels:
      app: web-demo
    matchExpressions:
      - {key: group, operator: In, values: [dev, test]}#定義選擇組
  replicas: 1
  template:
    metadata:
      labels:
        group: dev #pod打上組標簽
        app: web-demo
    spec:
      containers:
      - name: web-demo
        image: hub.mooc.com/kubernetes/web:v1
        ports:
        - containerPort: 8080

###校驗pod是否是deployment需要的。

查看是否創建成功

kubectl get pods -l app=web-demo -n dev

kubectl get pods -l group=dev -n dev

kubectl get pods -l app=web-demo group=dev -n dev

kubectl get pods -l 'group in (dev, test)' -n dev

kubectl get pods -l 'group notin (dev, test) -n dev'

 

container通過標簽選擇node

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: dev
spec:
  selector:
    matchLabels:
      app: web-demo
    matchExpressions:
      - {key: group, operator: In, values: [dev, test]}
  replicas: 1
  template:
    metadata:
      labels:
        group: dev
        app: web-demo
    spec:
      containers:
      - name: web-demo
        image: hub.mooc.com/kubernetes/web:v1
        ports:
        - containerPort: 8080
      nodeSelector:
        disktype: ssd
selector-node.yaml

給node打上標簽

kubectl label node node-3-172.17.166.219 disktype=ssd

kubectl get nodes node-3-172.17.166.219 --show-labels

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM