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 文件??梢栽谀悴渴饝玫臅r候自定義應用程序的一些 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
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
?
?
總結
- 上一篇: C#语言实例源码系列-实现Linq操作X
- 下一篇: 复习(第三章)