HPA
pod的数量进行扩缩容
针对控制器创建的pod
deployment:
replica:
静态:edit
yaml:apply -f
HPA:基于cpu的利用率来实现pod数量的自动伸缩。
Horizontal pod autoscaling
yaml文件————主流——————>必须要有资源控制这个字段才能生效。
命令行 生成hpa的配置
比要条件:
前置比要条件:控制创建,而且必须能设置副本数
配置的必要条件:必须要声明pod的资源控制。
依赖环境:
metrices-server hpa使用的依赖环境。k8s使用集群资源的集中查询器。收集资源使用数据,给HPA,scheduller等等使用
echo 1 > /proc/sys/vm/drop_caches # 释放页面缓存 echo 2 > /proc/sys/vm/drop_caches # 释放目录项和inode缓存 echo 3 > /proc/sys/vm/drop_caches # 释放所有缓存
[root@master01 hpa]# vim hpa.yaml apiVersion: apps/v1 kind: Deployment metadata: name: hpa-test1 labels: hpa: test1 spec: replicas: 1 selector: matchLabels: hpa: test1 template: metadata: labels: hpa: test1 spec: containers: - name: centos image: centos:7 command: ["/bin/bash", "-c", "yum install -y epel-release --nogpgcheck && yum install -y stress --nogpgcheck && sleep 3600"] volumeMounts: - name: yum1 mountPath: /etc/yum.repos.d/ resources: limits: cpu: "1" memory: 512Mi volumes: - name: yum1 hostPath: path: /etc/yum.repos.d --- apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: hpa-centos1 spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hpa-test1 #就是用来匹配需要监控器类型和名称 #资源占用率高,要扩容,扩容的数量 #资源占用率低,要缩容,最小的保持数量 #定义扩缩容的指标,阈值。 minReplicas: 1 maxReplicas: 6 targetCPUUtilizationPercentage: 50 #占用50%的cpu [root@master01 nginx1]# kubectl top node node01 NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% node01 328m 16% 1938Mi 52% [root@master01 hpa]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-centos2 StatefulSet/hpa-test1 0%/50% 1 6 2 2m13s nginx1 Deployment/nginx1 1%/80% 1 6 1 64m
扩容和缩容的速度
扩容是一旦达到阈值,会立即扩容。
缩容的速度会相对较慢。
为了保证pod的正常工作,扩容必须要快。
缩容的时候为了保证pod的资源突然又变大了,可以继续维持pod的数量。在一定时间之内,pod占用的资源维持在了较低的比率,然后开始慢慢缩容。
对命名空间做资源限制:
[root@master01 hpa]# vim ns.yaml apiVersion: v1 kind: ResourceQuota metadata: name: ns-xy102 namespace: xy102 #对指定的命名空间进行资源限制 spec: hard: pods: "20" #设置该命名空间可以创建pod的最大数量 requests.cpu: "2" #只能使用2个cpu requests.memory: 1Gi #只能使用1个G的内存 limits.cpu: "3" limits.memory: 2Gi #limits是最多能使用多少 configmaps: "10" #创建configmap的数量限制 persistentvolumeclaims: "4" #创建pvc请求的限制 secrets: "10" #创建加密配置文件的限制 services: "10" #创建service的限制 [root@master01 hpa]# kubectl apply -f ns.yaml resourcequota/ns-xy102 created [root@master01 hpa]# kubectl describe namespaces xy102 Name: xy102 Labels: <none> Annotations: <none> Status: Active Resource Quotas Name: ns-xy102 Resource Used Hard -------- --- --- configmaps 1 10 limits.cpu 0 3 limits.memory 0 2Gi persistentvolumeclaims 0 4 pods 0 20 requests.cpu 0 2 requests.memory 0 1Gi secrets 1 10 services 0 10 No LimitRange resource.
limitRange:
只要是创建在这个命令空间的pod。都会根据limitRange的配置来对所有的pod进行统一的资源限制
[root@master01 hpa]# vim limitRange.yaml apiVersion: v1 name: xy102-limit apiVersion: v1 kind: LimitRange metadata: name: xy102-limit namespace: xy102 #指定命名空间 spec: limits: - default: #直接加default就相当于是上限 memory: 1Gi cpu: "4" defaultRequest: #这个就是软限制 memory: 1Gi cpu: "4" type: Container #指定类型,Container pod pvc [root@master01 hpa]# kubectl describe namespaces xy102 Name: xy102 Labels: <none> Annotations: <none> Status: Active Resource Quotas Name: ns-xy102 Resource Used Hard -------- --- --- configmaps 1 10 limits.cpu 0 3 limits.memory 0 2Gi persistentvolumeclaims 0 4 pods 0 20 requests.cpu 0 2 requests.memory 0 1Gi secrets 1 10 services 0 10 Resource Limits Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio ---- -------- --- --- --------------- ------------- ----------------------- Container memory - - 1Gi 1Gi - Container cpu - - 4 4 -
helm:
nginx ingress
deployment
svc
ingress
heml提供了一个模板,可以一键化的部署微服务。
通过打包的方式,把所有需要的yaml文件集合一起,然后一键部署。
可以支持回滚。
heml
k8s的部署可以配置,可以集成,可以动态修改
三个概念:
Chart:部署安装k8s微服务的模板。类似于linux里面的rpm包。
Repository:仓库,仓库用来保存Chart
Release:当我们使用chart部署微服务时。每部署一次就会有一个Release。(理解为版本号)
[root@master01 opt]# rz -E rz waiting to receive. [root@master01 opt]# tar -xf helm-v3.10.0-linux-amd64.tar.gz [root@master01 opt]# ls linux-amd64 [root@master01 opt]# cd linux-amd64/ [root@master01 linux-amd64]# mv helm /usr/local/bin/ [root@master01 linux-amd64]# vim /etc/profile source <(kubectl completion bash) [root@master01 linux-amd64]# source /etc/profile #安装仓库和模板 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo add stable http://mirror.azure.cn/kubernetes/charts helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts helm repo add incubator https://charts.helm.sh/incubator ###上面这几个在master命令行输入 #更新当前所有仓库的chart [root@master01 linux-amd64]# helm show chart aliyun/nginx-lego ###查看chart的详情 [root@master01 linux-amd64]# helm repo remove aliyun [root@master01 linux-amd64]# helm install redis1 stable/redis -n default ###用helm创建redis的pod [root@master01 linux-amd64]# helm uninstall redis1 release "redis1" uninstalled ###删除helm创建的pod
使用helm的yaml模板 [root@master01 opt]# mkdir helm [root@master01 opt]# cd helm/ [root@master01 helm]# helm create nginx1 Creating nginx1 [root@master01 helm]# yum -y install tree [root@master01 helm]# tree nginx1/ nginx1/ ├── charts #依赖环境,一般为空,也不需要 ├── Chart.yaml #包含chart的元信息,chart的版本,名称等等 ├── templates #包含了部署k8s的应用pod的模板文件 │ ├── deployment.yaml #基于控制器 │ ├── _helpers.tpl │ ├── hpa.yaml #做hpa的监控,自动伸缩 │ ├── ingress.yaml #对外访问 │ ├── NOTES.txt │ ├── serviceaccount.yaml #创建服务账号 │ ├── service.yaml #创建service的清单 │ └── tests │ └── test-connection.yaml └── values.yaml #我们的配置在values里面完成,集合在了这个配置里面,当配置完成之后,可以通过values配置把参数传给 template里面的模板文件,进行覆盖。 3 directories, 10 files
[root@master01 nginx1]# vim values.yaml replicaCount: 3 ##更改副本数 tag: "1.22" #tag:使用镜像的版本号,不改默认最新 ingress: enabled: true hosts: - host: www.xy102.com paths: - path: / pathType: Prefix resources: limits: cpu: 100m memory: 128Mi # requests: # cpu: 100m # memory: 128Mi autoscaling: enabled: true minReplicas: 1 maxReplicas: 6 targetCPUUtilizationPercentage: 80
[root@master01 helm]# helm package nginx1/ Successfully packaged chart and saved it to: /opt/helm/nginx1-0.1.0.tgz [root@master01 helm]# ls nginx1 nginx1-0.1.0.tgz [root@master01 helm]# helm install nginx1 /opt/helm/nginx1-0.1.0.tgz #第一次部署,release就是版本号,版本号1