k8s监控

目录

k8s容器资源限制

内存限制

CPU限制

namespace设置资源限制

​ namespace设置资源配额

Namespace 配置Pod配额

kubernetes资源监控

 Metrics-Server部署

Dashboard部署

​HPA(Horizontal Pod Autoscaler)实例 

​ Helm

构建一个 Helm Chart

Helm部署nfs-client-provisioner

 Helm部署metrics-server应用

​Helm部署nginx-ingress应用 

​ 部署kubeapps应用,为Helm提供web UI界面管理 


k8s容器资源限制

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为换算标准的。

内存限制

kubectl get pod #清理实验环境
kubectl get all
kubectl delete statefulsets.apps mysql
kubectl delete svc mysql
kubectl delete svc mysql-read
kubectl get all

mkdir limit
cd limit/
ls
vim pod.yaml #限制内存,最多为100Mi,最少为100Mi
kubectl apply -f pod.yaml
kubectl get pod
kubectl describe pod memory-demo #查看详细信息中出现设定的内存
kubectl get pod
kubectl logs memory-demo #进程kill
kubectl get pod #pod创建失败

如果容器超过其内存限制,则会被终止。如果可重新启动,则与所有其他类型的运行时故障一样,kubelet 将重新启动它。 

如果一个容器超过其内存请求,那么当节点内存不足时,它的 Pod 可能被逐出。 

 在server1中拉取stress镜像上传到本地仓库

kubectl delete -f pod.yaml
vim pod.yaml #设定最大内存为300Mi
kubectl apply -f pod.yaml #镜像可以占用200Mi
kubectl get pod #running状态
kubectl describe pod memory-demo 

CPU限制

kubectl delete -f pod.yaml
vim pod2.yaml#设置限定cpu的数量,最多为2,最少为1
kubectl apply -f pod2.yaml
kubectl get pod
kubectl describe pod cpu-demo
kubectl logs cpu-demo #查看日志没有输出
kubectl get pod #运行成功

调度失败是因为申请的CPU资源超出集群节点所能提供的资源 但CPU 使用率过高,不会被杀死

namespace设置资源限制

kubectl delete -f pod2.yaml
vim limit.yaml #资源限制cpu和memory
kubectl apply -f limit.yaml
kubectl describe limitranges #查看资源限制的具体信息

LimitRange 在 namespace 中施加的最小和最大内存限制只有在创建和更新 Pod 时才会被应用。改变 LimitRange 不会对之前创建的 Pod 造成影响。
kubectl get limitranges
kubectl get pod
kubectl run demo --image=nginx#运行pod
kubectl get pod
kubectl describe pod demo #namespace的资源限制对pod进行约束
kubectl describe limitranges #与设置的一致
kubectl delete pod demo

kubectl delete pod demo
ls
vim pod.yaml #在pod 内设置资源限制,设置的memory在namespace内存限制的范围之内
kubectl apply -f pod.yaml
kubectl get pod #可以运行

 kubectl delete -f pod.yaml
vim pod.yaml #设定pod内存最大和最小相同
kubectl apply -f pod.yaml
kubectl get pod #也可以成功运行

kubectl delete -f pod.yaml
vim pod.yaml #设定最小的内存为50Mi,而namespace的最小内存限制为100Mi
kubectl apply -f pod.yaml
kubectl get pod #出现报错

 namespace设置资源配额

kubectl delete -f pod.yaml
ls
vim limit.yaml #限制资源配额(cpu和memory)
kubectl apply -f limit.yaml
kubectl get resourcequotas #查看资源配额
kubectl describe resourcequotas
kubectl get pod
kubectl run demo1 --image=nginx #运行demo1
kubectl describe limitranges #已经设定资源限制
kubectl describe resourcequotas #占用最多0.5个cpu.512Mi内存和0.1个cpu和256Mi内存
kubectl get pod
kubectl run demo2 --image=nginx
kubectl describe resourcequotas
kubectl get pod
kubectl run demo3 --image=nginx
kubectl describe resourcequotas
kubectl run demo4 --image=nginx
kubectl describe resourcequotas #运行4个demo,最多的内存和cpu限制已经占满
kubectl run demo5 --image=nginx #运行第5个报错,内存不够

kubectl get pod
kubectl delete pod demo1
kubectl delete pod demo2
kubectl delete pod demo3
kubectl delete pod demo4
kubectl describe resourcequotas #释放内存和cpu
kubectl delete limitranges limitrange-demo #删除之前设定的namespace的资源限制
kubectl run demo --image=nginx #无法运行pod
kubectl describe resourcequotas

设置资源配额,一定要设置资源限制

 ls
vim pod.yaml #创建pod,设定资源限制
kubectl apply -f pod.yaml
kubectl get pod #运行成功
kubectl describe resourcequotas #可以看到pod已占用的资源的信息
ls
kubectl apply -f limit.yaml #设置namespace的资源限制
kubectl describe limitranges
kubectl delete -f pod.yaml
kubectl get pod

Namespace 配置Pod配额

vim limit.yaml #限制pod数为2;设置Pod配额以限制可以在namespace中运行的Pod数量
kubectl apply -f limit.yaml
kubectl run demo --image=nginx #运行pod
kubectl run demo1 --image=nginx
kubectl describe resourcequotas #看到资源配额信息中pod数量为2
kubectl run demo3 --image=nginx #运行第三个pod报错
kubectl get pod

kubernetes资源监控

 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-incubator/metrics-server 

kubectl get pod
kubectl delete pod --all
kubectl delete -f limit.yaml#删除资源限制避免对后面实验造成影响
kubectl api-versions #查看api-server

mkdir metrics
cd metrics/
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
ls
 vim components.yaml #Metric Server 支持一个参数 --kubelet-insecure-tls,可以跳过认证,修改镜像位置
kubectl apply -f components.yaml
kubectl -n kube-system get pod #状态为running
kubectl -n kube-system logs metrics-server-58fc4b6dbd-vqz64 #查看日志没有报错
kubectl api-versions #多了metrics.k8s.io/v1beta1接口
kubectl top node #查看节点的资源使用量
kubectl top pod --all-namespaces #可以查看所有namespaces的资源使用
kubectl delete namespace test
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/server2" #命令行查看各节点
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/server3"
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/server4"
kubectl top node

在本地仓库上传所需的镜像

Dashboard部署

Dashboard可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。 

网址:https://github.com/kubernetes/dashboard

ls
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml #下载部署文件
ls
vim recommended.yaml #上传镜像到本地仓库方便拉取
kubectl apply -f recommended.yaml
kubectl get ns #创建了kubernets-dashboard的ns
kubectl -n kubernetes-dashboard get pod
kubectl -n kubernetes-dashboard get all

kubectl -n kubernetes-dashboard edit svc kubernetes-dashboard #修改为LoadBalancer方式,以便外部访问
kubectl -n kubernetes-dashboard get svc #分配到ip

在浏览器中输入172.25.254.101 ,两种认证方式

kubectl -n kubernetes-dashboard get sa
kubectl -n kubernetes-dashboard get secrets
kubectl -n kubernetes-dashboard describe secrets kubernetes-dashboard-token-mbvrk #获取token登陆

登进去之后操作没有权限报错

 默认dashboard对集群没有操作权限,需要授权:

刷新

多个服务

node的监控

在界面创建pod

查看日志

修改  yaml文件中pod副本数

可以看到生成3个pod

HPA(Horizontal Pod Autoscaler)实例 

官网:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

Horizontal Pod Autoscaler 可以根据 CPU 利用率自动扩缩 ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的 Pod 数量 (也可以基于其他应用程序提供的度量指标,目前这一功能处于 beta 版本)。

mkdir hpa
cd hpa/
ls
vim hpa.yaml #启动一个 Deployment 来运行这个镜像并暴露一个服务
kubectl apply -f hpa.yaml
kubectl get pod
kubectl get svc #获得svc
kubectl describe svc php-apache #有endpoint出现
kubectl get pod #running状态
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 #创建一个 Horizontal Pod Autoscaler 用于控制上一步骤中创建的 Deployment,使 Pod 的副本数量维持在 1 到 10 之间。 大致来说,HPA 将(通过 Deployment)增加或者减少 Pod 副本的数量以保持所有 Pod 的平均 CPU 利用率在 50% 左右。由于每个 Pod 请求 200 毫核的 CPU,这意味着平均 CPU 用量为 100 毫核
kubectl get hpa #查看 Autoscaler 的状态
kubectl describe hpa php-apache
kubectl get hpa #当前的 CPU 利用率是 0%,这是由于我们尚未发送任何请求到服务器 (CURRENT 列显示了相应 Deployment 所控制的所有 Pod 的平均 CPU 利用率)
kubectl top pod
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" #启动一个容器,并通过一个循环向 php-apache 服务器发送无限的查询请求,增加负载

下载所需的镜像上传到本地仓库

重新打开一个终端

kubectl get pod #Hpa会根据Pod的CPU使用率动态调节Pod的数量
kubectl top pod
kubectl get hpa #一分钟时间左右之后可以看到 CPU 负载升高了
kubectl top pod #查看cpu和memory使用情况
kubectl get hpa #由于请求增多,CPU 利用率已经升至请求值53%。 可以看到,Deployment 的副本数量已经增长到了 6
kubectl get svc
kubectl describe svc php-apache #endpoint端口也增加到6个

输入<Ctrl> + C 来终止负载

kubectl get pod #查看pod数量在减少
kubectl top pod
kubectl get pod
kubectl get hpa #可以再次检查负载状态(等待几分钟时间)
kubectl get pod
kubectl get hpa #CPU 利用率已经降到 0,所以 HPA 将自动缩减副本数量至 1
kubectl describe hpa php-apache #查看api为v2beta2
kubectl delete hpa php-apache

vim hpa.yaml #使用资源清单来动态实现pod伸缩
kubectl apply -f hpa.yaml
kubectl get hpa
kubectl top pod
kubectl get hpa
kubectl top pod --all-namespaces
kubectl get deployments.apps
kubectl delete hpa hpa-example
kubectl get hpa #可以看到cpu和memory的使用情况
kubectl api-versions #v2可以监控两项指标,v1只能监控一项

 Helm

Helm是Kubernetes 应用的包管理工具,主要用来管理 Charts,类似Linux系统的yum。 

Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。 

对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。

  对于使用者而言,使用 Helm 后不用需要编写复杂的应用部署文件,可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序。

官网:https://helm.sh/docs/intro/

kubectl delete -f hpa.yaml
kubectl get pod
cd
mkdir helm
cd helm/
ls #下载软件包
tar zxf helm-v3.8.0-linux-amd64.tar.gz
ls
cd linux-amd64/
 ls
mv helm /usr/local/bin/
which helm
helm
echo "source <(helm completion bash)" >> ~/.bashrc #设置helm命令补齐
source ~/.bashrc
helm search hub nginx #搜索官方helm hub chart库

可以在官网的应用中心搜索包

helm list
helm repo list #列出库
helm repo add bitnami https://charts.bitnami.com/bitnami #Helm 添加第三方 Chart 库
helm repo list
helm search repo nginx #查询
helm search repo nginx -l #查询详细信息
helm search repo nginx
helm pull bitnami/nginx #拉取应用到本地
 ls
tar zxf nginx-10.1.0.tgz #解压
ls
cd nginx/
ls
cd templates/ #有多种应用的yaml
ls

支持多种安装方式:(helm默认读取~/.kube/config信息连接k8s集群)
$ helm install redis-ha stable/redis-ha	
$ helm install redis-ha redis-ha-4.4.0.tgz
$ helm install redis-ha path/redis-ha
$ helm install redis-ha https://example.com/charts/redis-ha-4.4.0.tgz

vim value.yaml #修改镜像仓库,设置资源限制
helm install webserver1 . #安装应用到当前
kubectl get pod #运行
kubectl get svc --namespace default -w webserver1-nginx #查看svc

kubectl l get pod
kubectl describe pod webserver1-nginx-546bf74974-66xv8
kubectl describe svc #可以看到endpoint暴露出来
kubectl get pod
kubectl get svc
kubectl get hpa #pod动态进行弹索
kubectl top pod #目前pod数量为1
kubectl get deployments.apps
helm list #列出helm
helm uninstall webserver1 #卸载应用
kubectl get all
kubectl get pod
kubectl get hpa

可以访问成功

构建一个 Helm Chart

 cd helm/
ls
helm create mychart #创建mychart
cd mychart/
 ls
yum install -y tree
tree .
ls
cd templates/
 ls
vim Chart.yaml  #编写mychart的应用描述信息
vim values.yaml #修改应用部署信息
cd .
 ls
helm lint mychart/ #检查依赖和模板配置是否正确

vim Chart.yaml #修改版本为v1

vim values.yaml #开启ingress服务

ls
helm package mychart/ #将应用打包,在harbor中建立本地仓库
ls
helm repo add local https://reg.westos.org/chartrepo/charts  #添加本地仓库,需要认证
cd /etc/docker/
ls
cd
cp /etc/docker/certs.d/reg.westos.org/ca.crt /etc/pki/ca-trust/source/anchors/ #复制/etc/docker/认证授权到指定目录
update-ca-trust #更新
helm repo add local https://reg.westos.org/chartrepo/charts #再次添加
helm repo list #列出repo

cd helm/
ls
vim /root/.config/helm/repositories.yaml #设置登陆的用户和密码
helm env
安装helm-push插件
mkdir -p /root/.local/share/helm/plugins #建立目录
mkdir  /root/.local/share/helm/plugins/cm-push
ls
tar zxf helm-push_0.10.2_linux_amd64.tar.gz -C  /root/.local/share/helm/plugins/cm-push #解压到之指定目录
helm cm-push -h #安装成功
cd helm/
ls
helm cm-push mychart-0.1.0.tgz local #上传打包好的到本地

可以看到上传到本地仓库中

helm repo list #列出已经添加的源
helm repo update #更新
helm search repo mychart #可以搜索到
 helm install demo1 local/mychart #安装demo1
kubectl get all
kubectl get ingress
kubectl get svc 

可以访问到域名

cd mychart/
ls
vim values.yaml #修改应用版本为v2
vim Chart.yaml
cd ..
helm package mychart #重新打包
ll
helm cm-push mychart-0.2.0.tgz local #上传v2版本到本地
helm  repo update #更新
helm search repo mychart #已经更新为v2版本
helm search repo mychart -l
helm upgrade demo1 local/mychart #升级
helm list #列出应用
helm history demo1 #查看所有版本信息
helm rollback demo1 1 #回滚到版本1
helm uninstall demo1 #卸载
helm list
helm uninstall demo
helm list

可以看到上传的应用

Helm部署nfs-client-provisioner

kubectl get pod -n nfs-client-provisioner
helm list --all-namespaces #helm列出所有的namespaces
helm repo list #列出源
helm search repo nfs-client-provisioner #搜索
helm search hub nfs-client-provisioner
cd
cd helm/
 ls
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ #添加源到helm仓库
helm search repo nfs-subdir-external-provisioner
helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner #拉取
ls
tar zxf  nfs-subdir-external-provisioner-4.0.16.tgz
ls
cd nfs-subdir-external-provisioner/
ls
vim values.yaml #修改变量文件镜像以及nfs路径
helm install nfs-subdir-external-provisioner . -n nfs-client-provisioner #安装应用到当前指定namespace
kubectl get pod -n nfs-client-provisioner
kubectl get sc #查看动态存储卷

预先配置好外部的NFS服务器 

cd volume/
cd pvc/nfs/
ls
cat pvc.yaml
kubectl apply -f pvc.yaml
kubectl get pvc #获取pvc
kubectl get pv #与pv绑定
kubectl delete -f pvc.yaml
kubectl get pvc
kubectl get pv
helm list --all-namespaces

在/nfsshare自动生成目录

删除pvc和pv之后,目录自动清除

 Helm部署metrics-server应用

cd metrics/
ls
kubectl delete -f recommended.yaml #删除之前部署的metrics-server应用
kubectl delete -f rbac.yaml
cd -
kubectl delete -f components.yaml
kubectl get hpa
kubectl -n kube-system get pod
kubectl top node

helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/ #添加路径
cd
cd helm/
helm search repo metrics-server #搜索
helm pull metrics-server/metrics-server #拉取包
ls
tar zxf metrics-server-3.8.2.tgz
ls
cd metrics-server/
ls
vim values.yaml #更改变量文件,将所需镜像上传到本地仓库
helm install metrics-server . -n kube-system #安装应用到当前指定namespace
helm list --all-namespaces #查看
kubectl get pod -n kube-system #已创建pod
kubectl top node #可以查看各节点资源使用情况
kubectl top pod --all-namespaces

Helm部署nginx-ingress应用 

kubectl get ns
cd
cd ingress/
ls
 kubectl get ingress
kubectl get ingress --all-namespaces
kubectl delete -f deploy.yaml #将之前部署的ingress-nginx删除
kubectl get ns
kubectl get ingressclasses.networking.k8s.io
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx #添加路径
helm search repo ingress-nginx
helm search repo ingress-nginx -l
helm pull ingress-nginx/ingress-nginx --version 4.0.17 #拉取
ls
mv ingress-nginx-4.0.17.tgz ~/helm
cd ~/helm/
ls
tar zxf ingress-nginx-4.0.17.tgz #解压
ls
cd ingress-nginx/
 ls
vim values.yaml #更改变量文件
kubectl create namespace ingress-nginx #创建namespaces
helm install ingress-nginx . -n ingress-nginx #安装应用
kubectl get pod -n ingress-nginx #查看pod
kubectl get all -n ingress-nginx
kubectl -n ingress-nginx describe service/ingress-nginx-controller-admission
cd
kubectl -n ingress-nginx get svc #可以看到分配的ip

打开backend

上传所需镜像到本地仓库

访问172.25.254.100

cd pod/
ls
vim deploy-2.yml
kubectl apply -f deploy-2.yml #创建deploy控制器及service
kubectl get svc
kubectl describe svc myapp-v2 #该service有三个endpoint
kubectl get pod
cd
cd ingress/
ls
cat v2-ingress.yaml
vim v2-ingress.yaml
kubectl apply -f v2-ingress.yaml #应用ingress策略
kubectl get ingress
kubectl describe ingress ingress-myapp-canary #查看详细信息

可以正常访问实现负载均衡

部署kubeapps应用,为Helm提供web UI界面管理 

helm list --all-namespaces #helm列出所有的namespaces
helm repo list
helm search repo kubeapps
helm search repo kubeapps -l
cd
cd helm/
helm pull bitnami/kubeapps --version 7.8.7 #拉取解压部署文件
ls
tar zxf kubeapps-7.8.7.tgz
ls
cd kubeapps/
ls
cd charts/
ls
cd ..
ls
vim values.yaml #修改变量文件,拉取所需的镜像上传到本地仓库
kubectl delete ingress ingress-myapp-canary #删除之前的ingress 服务
kubectl delete deployments.apps deployment-myapp
kubectl get pod
kubectl get svc
kubectl delete svc myapp-v2

部署kubeapps需要的镜像

 

 

ls
cd charts/
ls
cd postgresql/
ls
vim values.yaml
cd ..
cd redis/
ls
vim values.yaml #指定仓库位置
cd ..
kubectl create namespace kubeapps #创建namespaces
ls
cd kubeapps/
ls
helm install kubeapps . -n kubeapps #安装应用
kubectl -n kubeapps get pod
kubectl -n kubeapps get all #部署成功
kubectl -n kubeapps get pod

浏览器访问kubeapps.westos.org,需要token认证,需要创建sa,并且为其附加cluster-admin权限

kubectl -n kubeapps get sa#查看sa
kubectl create serviceaccount kubeapps-operator -n kubeapps #创建sa
kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=kubeapps:kubeapps-operator #授权
kubectl describe clusterrolebinding.rbac.authorization.k8s.io/kubeapps-operator
kubectl -n kubeapps get sa
kubectl -n kubeapps get secrets
kubectl -n kubeapps describe secrets kubeapps-operator-token-j7vjv ##查看token 

复制token到浏览器

下面为部署过的应用

 添加chart库

pod内不能解析仓库reg.westos.org,在pod内不能解析这个地址,因此要添加pod内解析

helm repo list
kubectl -n kube-system get pod
kubectl -n kube-system get cm
kubectl -n kube-system edit cm coredns #添加解析
dig -t A reg.westos.org @10.96.0.10
kubectl -n kubeapps get pod #安装后会同步

网页中添加仓库,填写相关信息后安装

 

 

 

 

 可以搜索mychart

 

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值