11.K8S资源管理

一、namespace核心作用

资源隔离

  service、Deployment、Pod

资源配额隔离

  CPU、Memory

1.资源隔离

创建命名空间

例:

命令创建:
#kubectl create namespace dev yaml文件创建:namespace.yaml
apiVersion: v1 kind: Namespace metadata: name: dev


#kubectl create -f namespace.yaml
kubectl get all -n dev

为资源指定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

不同命名空间下的service-ip、pod-id是可以互相访问,不隔离的。pod名、dns是隔离的。

2.资源配额隔离

限制namespace下资源

  内存、cpu、gpu、存储

requests:

  请求,希望容器被容器分配到的资源,可以完全保证的资源。scheduler使用这个值计算,得到最优节点,scheduler不考虑limits。

limits

  容器使用资源的上限,当节点资源不足时,发生竞争参考此值,驱逐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

内存单位:Mi/Gi

CPU单位:m;1核=1000m

查看node节点中资源使用情况

kubectl describe nodes work01-16-24

 

 

 

 

 

 对应传输给docker的值,查看容器详细信息

docker inspect ca8499fe3c67        ##容器id

 

 CpuShares=requests中cpu的值,先把requests中定义的cpu值转化为核数,然后乘以1024。

Memory=requests中memory的值,会将memory定义的值*1024*1024转化为字节。

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

###当资源耗尽(cpu/memory),会将容器中资源占用最多的进程杀掉。并不会杀掉容器。

测试

在容器中写一个脚本

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

###cpu占满后与内存不同的是进程不会杀掉,cpu是可压缩资源,内存不是。

3.设置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 

4.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

5.驱逐策略

  磁盘紧缺驱逐

    删除故障pod、容器

    删除没用镜像

    按优先级、资源占用情况驱逐pod

  内存驱逐策略

6.标签选择

6.1.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

6.2.容器通过标签选择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 disktype=ssd

kubectl get nodes node-3 --show-labels
posted @ 2021-11-23 10:20  天涯160  阅读(73)  评论(0)    收藏  举报