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

浙公网安备 33010602011771号