Kubernetes/k8s之HPA,命名空间资源限制

Horizontal Pod Autoscaling:po的水平自动伸缩

这是k8s自带的模块

pod占用cpu比例达到一定的阀值,会触发伸缩机制。

根据cpu的阀值触发伸缩机制

replication controller 副本控制器 控制pod的副本数

deployment controller 节点控制器 部署pod

hpa控制副本的数量,以及如何控制部署pod

1、hpa基于kube-controll-manager服务,周期性的检测pod的cpu使用率,默认30秒检测一次

2、hpa和replication controller,deployment controller都属于k8s的资源对象。通过跟踪分析副本控制器和deployment的pod的负载变化,针对性的调整目标pod的副本数

阀值:在正常情况下,pod的副本数,以及达到阀值之后,pod的扩容最大数量

3、组件:metrics-server 部署到集群中,对外提供度量的数据

HPA的规则:

1、定义pod时候必须要有资源限制,否则hpa无法进行监控

2、扩容是即时的,只要超过阀值会立刻扩容,不是立刻扩容到最大副本数,会在最大值和最小值波动,如果扩容的数量满足了需求,不会在扩容

3、缩容是缓慢的,如果业务的峰值较高,回收的策略太积极的话,可能会产生业务的崩溃,缩容的速度比较慢的

周期性的获取数据,缩容的机制

HPA的部署运用

进行HPA的部署设置

//在所有 Node 节点上传 metrics-server.tar 镜像包到 /opt 目录
cd /opt/
docker load -i metrics-server.tar
 
#在主master节点上执行
kubectl apply -f components.yaml

HPA伸缩的测试演示

apiVersion: apps/v1
kind: Deployment
metadata:
  name: centos-test
  labels:
    test: centos1
spec:
  replicas: 1
  selector:
    matchLabels:
      test: centos1
  template:
    metadata:
      labels:
        test: centos1
    spec:
      containers:
        - name: centos
          image: centos:7
          command: ["/bin/bash", "-c", "yum -y install epel-release;yum -y install stress;sleep 3600"]
          resources:
            limits:
              cpu: "1"
              memory: 512Mi
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-centos7
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: centos-test
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 50

命名空间资源限

ResourceQuota:命名空间进行资源限制

apiVersion: apps/v1
kind: Deployment
metadata:
  name: centos-test1
  namespace: test1
  labels:
    test: centos2
spec:
  replicas: 6
  selector:
    matchLabels:
      test: centos2
  template:
    metadata:
      labels:
        test: centos2
    spec:
      nodeSelector:
        kubernetes.io/hostname: node01
      containers:
        - name: centos
          image: centos:7
          command: ["/bin/bash", "-c", "yum -y install epel-release;yum -y install stress;sleep 3600"]
          resources:
            limits:
              cpu: "1"
              memory: 512Mi
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: ns-resource
  namespace: test1
spec:
  hard:
    pods: "10"
    requests.memory: 1Gi
    limits.cpu: "4"
    limits.memory: 2Gi
    configmaps: "10"
#在当前这个命名空间能创建最大configmap数量10个
    persistentvolumeclaims: "4"
#当前命名空间只能使用4个pvc
    secrets: "9"
#创建贾母的secret只能9个
    services: "5"
#创建service个数只能五个
    services.nodeports: "2"
#创建nodeport类型的svc只能两个

只能在命名空间创建两个service第三个就不创建了因为限制了最多只能创建两个

第二种LimitRange

apiVersion: apps/v1
kind: Deployment
metadata:
  name: centos-test3
  namespace: test3
  labels:
    test: centos3
spec:
  replicas: 1
  selector:
    matchLabels:
      test: centos3
  template:
    metadata:
      labels:
        test: centos3
    spec:
      containers:
        - name: centos3
          image: centos:7
          command: ["/bin/bash", "-c", "yum -y install epel-release;yum -y install stress;sleep 3600"]
---

apiVersion: v1
kind: LimitRange
metadata:
  name: test3-limit
  namespace: test3
spec:
  limits:
  - default:
      memory: 512Mi
      cpu: "1"
    defaultRequest:
      memory: 256Mi
      cpu: "0.5"
    type: Container

pod的副本数扩缩容,有两种方式:

1、手动方式kubectl scale deployment nginx1 --replicas=5,kubectl edit,修改yaml文件 apply -f

2、自动扩缩容 hpa 监控指标是cpu和内存没关系

资源限制

pod资源限制

命名空间资源限

ucky-cloud项目--部署在test1的命名空间,如果lucky-cloud不做限制,或者命名空间不做限制,他会依然会沾满所有集群资源

k8s集群部署pod的最大数量:10000

busybox:就是服务最小化的centos 4M

哪些服务会部署在k8s当中

中间件 kafka: 6

redis: 3

选好节点 用nodeName固定在一个pod上,扩容之后阀值是否会下降

apiVersion: apps/v1
kind: Deployment
metadata:
  name: centos-test8
  labels:
    test: centos8
spec:
  replicas: 3
  selector:
    matchLabels:
      test: centos8
  template:
    metadata:
      labels:
        test: centos8
    spec:
      nodeSelector:
        kubernetes.io/hostname: node01
      containers:
        - name: centos8
          image: centos:7
          command: ["/bin/bash", "-c", "yum -y install epel-release;yum -y install stress;sleep 3600"]
          resources:
            limits:
              cpu: "2"
              memory: 512Mi
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-centos7
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: centos-test8
  minReplicas: 1
  maxReplicas: 5
  targetCPUUtilizationPercentage: 50

总结

HPA的自动扩缩容

命令空间两种方式

ResourceQuota:可以对命名空间进行资源限制

第二种LimitRange:直接声明在命名空间当中创建pod,容器的资源限制,只是一种统一的限制,所有的pod都受这个条件的制约

pod资源限制 一般是我们创建的时候声明好的,必加选项

resources

limit

命名空间资源限制:对命名空间使用cpu和内存一定会做限制通过

核心:防止整个集群的资源被一个服务或者一个命名空间沾满

ResourceQuata

命名空间统一资源限制在pod LimitRange

相关推荐
qq_3129201122 分钟前
docker 部署 kvm 图形化管理工具 WebVirtMgr
运维·docker·容器
踏雪Vernon23 分钟前
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
linux·docker·容器·harmonyos
条纹布鲁斯1 小时前
dockerdsktop修改安装路径/k8s部署wordpress和ubuntu
docker·kubernetes
CP-DD3 小时前
Docker 容器化开发 应用
运维·docker·容器
老司机张师傅4 小时前
【微服务实战之Docker容器】第七章-Dockerfile解析
容器·dockerfile·虚悬镜像·docker学习
登云时刻5 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)
redis·kubernetes·bootstrap
运维&陈同学5 小时前
【zookeeper03】消息队列与微服务之zookeeper集群部署
linux·微服务·zookeeper·云原生·消息队列·云计算·java-zookeeper
吴半杯6 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway
Code_Artist8 小时前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
Eternal-Student8 小时前
【docker 保存】将Docker镜像保存为一个离线的tar归档文件
运维·docker·容器