目录
一、资源限制
1、limitrange
2、ResourceQuota
二、metrics-server
三、图形化监控和代码行监控
1、dashboard
2、k9s
四、hpa
一、资源限制
- Kubernetes采用request和limit两种限制类型来对资源进行分配。
- request(资源需求):即运行Pod的节点必须满足运行Pod的最基本需求才能运行Pod。
- limit(资源限额):即运行Pod期间,可能内存使用量会增加,那最多能使用多少内存,这就是资源限额。
- 资源类型:
- CPU 的单位是核心数,内存的单位是字节。
- 一个容器申请0.5个CPU,就相当于申请1个CPU的一半,你也可以加个后缀m 表示千分之一的概念。比如说100m的CPU,100豪的CPU和0.1个CPU都是一样的。
- 内存单位:
- K、M、G、T、P、E #通常是以1000为换算标准的。
- Ki、Mi、Gi、Ti、Pi、Ei #通常是以1024为换算标准的。
上传镜像
vim limit.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: stress
args:
- --vm
- "1"
- --vm-bytes
- 200M
resources:
requests:
memory: 50Mi
limits:
memory: 100Mi
kubectl apply -f limit.yaml
kubectl get pod
- 如果容器超过其内存限制,则会被终止。如果可重新启动,则与所有其他类型的运行时故障一样,kubelet 将重新启动它。
- 如果一个容器超过其内存请求,那么当节点内存不足时,它的 Pod 可能被逐出。
1、limitrange
vim range.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: limitrange-memory
spec:
limits:
- default:
cpu: 0.5
memory: 512Mi
defaultRequest:
cpu: 0.1
memory: 256Mi
max:
cpu: 1
memory: 1Gi
min:
cpu: 0.1
memory: 100Mi
type: Container
kubectl apply -f range.yaml
LimitRange 在 namespace 中施加的最小和最大内存限制只有在创建和更新 Pod 时才会被应用。改变 LimitRange 不会对之前创建的 Pod 造成影响。
创建的pod自动添加限制
kubectl run demo --image nginx
自定义限制的pod也需要在limitrange定义的区间内
2、ResourceQuota
- 创建的ResourceQuota对象将在default名字空间中添加以下限制:
- 每个容器必须设置内存请求(memory request),内存限额(memory limit),cpu请求(cpu request)和cpu限额(cpu limit)。
- 所有容器的内存请求总额不得超过1 GiB。
- 所有容器的内存限额总额不得超过2 GiB。
- 所有容器的CPU请求总额不得超过1 CPU。
- 所有容器的CPU限额总额不得超过2 CPU。
vim range.yaml
添加进
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
pods: "2"
kubectl apply -f range.yaml
kubectl describe resourcequotas
- 配额是针对namespace施加的总限额,命名空间内的所有pod资源总和不能超过此配额
- 创建的pod必须定义资源限制
二、metrics-server
- Metrics-Server是集群核心监控数据的聚合器,用来替换之前的heapster。
- 容器相关的 Metrics 主要来自于 kubelet 内置的 cAdvisor 服务,有了Metrics-Server之后,用户就可以通过标准的 Kubernetes API 来访问到这些监控数据。
- Metrics API 只可以查询当前的度量数据,并不保存历史数据。
- Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 维护。
- 必须部署 metrics-server 才能使用该 API,metrics-server 通过调用 Kubelet Summary API 获取数据。
- Metrics Server 并不是 kube-apiserver 的一部分,而是通过 Aggregator 这种插件机制,在独立部署的情况下同 kube-apiserver 一起统一对外服务的。
- kube-aggregator 其实就是一个根据 URL 选择具体的 API 后端的代理服务器。
- Metrics-server属于Core metrics(核心指标),提供API metrics.k8s.io,仅提供Node和Pod的CPU和内存使用情况。而其他Custom Metrics(自定义指标)由Prometheus等组件来完成。
官网:https://github.com/kubernetes-sigs/metrics-server
下载部署文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
修改部署文件
上传镜像到harbor
kubectl apply -f components.yaml
kubectl -n kube-system logs metrics-server-
三、图形化监控和代码行监控
1、dashboard
- Dashboard可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。
官网:https://github.com/kubernetes/dashboard
下载部署文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
上传所需镜像到harbor
部署
kubectl apply -f recommended.yaml
修改svc
kubectl -n kubernetes-dashboard edit svc kubernetes-dashboard
集群需要部署metallb-system,如果没有可以使用NodePort方式
访问:
授权 获取token
vim rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
kubectl apply -f rbac.yaml
kubectl -n kubernetes-dashboard create token kubernetes-dashboard
使用token登录网页
使用图像化创建
2、k9s
四、hpa
官网:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/上传镜像
vim hpa.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
kubectl apply -f hpa.yaml
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
kubectl get hpa
压测
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
pod负载上升触发hpa扩容pod
结束压测后,默认等待5分钟冷却时间,pod会被自动回收
多项量度指标
kubectl get hpa php-apache -o yaml > hpa-v2.yaml
修改文件,增加内存指标
- resource:
name: memory
target:
averageValue: 50Mi
type: AverageValue
type: Resource
kubectl apply -f hpa-v2.yaml
kubectl get hpa