目錄
- 插敘
- 前言
- 一、思考和原理
- 二、實現步驟
- 0. 資料包
- 1. TLS證書簽發
- 2. 使用 certmanager 生成簽發證書
- 3. 獲取secret的內容 并替換CA_BUNDLE
- 4.部署svc + deploy
- 三、測試驗證
- 1. 觀察pod情況
- 2. 給node 打上不需要超售的標簽【可以讓master節點資源不超賣】
- 3. 資源實現超賣
- 4. 刪除還原
- 四、總結
插敘
友友們好久不見,插播一個最近get的證書,完成了第一步,一起努力鴨~
前言
小濤運維時遇到一個問題,發現:容器在Kubernetes中,使用率要遠低于申請率
比如:申請了1G內存,實際只用了200M左右,
就會產生這種情況:node上還有資源,但是不能調度了(Why?因為k8s默認調度器是 按allocate算的,并不是真實剩余的)
那么怎么辦呢?
- 用scheduler extender寫一個調度器 ,用usage調度pod
- 按照namespace 把業務分開,在每個ns上設置resourceQuota -->相對最容易實現【yaml文件限制】
- 把pod的request降低
- 基于MutatingWebhook 把node的 allocatable 調高
今天,小濤講解的方法,是第四種----基于MutatingWebhook 把node的 allocatable 調高
下面和小濤看看吧~
一、思考和原理
思想:基于MutatingWebhook將allocatable調高
,實現node資源超賣
#查看某個node節點當前資源情況
kubectl get nodes node2 -o yaml |grep allocatable: -A6
核心點:動態修改節點Node對象的allocatable字段值
- 而我們看到allocatable字段屬于Status字段
- 顯然不能直接通過kubectl edit命令來直接修改。
- 因為Status字段和Spec字段不同,Spec是用戶設置的期望數據
- 而Status是實際數據(Node節點通過不斷向apiServer發送心跳來更新自己的實時狀態,最終存在etcd中)。那么怎么去修改Stauts字段呢?
二、實現步驟
0. 資料包
鏈接:https://pan.baidu.com/s/12AmYn5h_c_XrlH6iS-gSDQ
提取碼:sell
- 實現的核心步驟
- 證書和簽名:tls雙向認證需要
- 編寫go項目代碼,實現webhook服務器,對node status字段更改
- 部署webhook服務,編寫MutatingWebhookConfiguration 測試【把node 的status推送到中間件服務中】
1. TLS證書簽發
借助certmanager 簽發證書
#安裝部署
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.2/cert-manager.yaml#================================================================
#如果是內網環境,將yaml文件 wget后,再docker pull 對應的鏡像后,再導入到離線環境的鏡像倉庫【資料包里有相關鏡像資料】
wget https://github.com/cert-manager/cert-manager/releases/download/v1.8.2/cert-manager.yaml
docker pull quay.io/jetstack/cert-manager-cainjector:v1.8.2
docker pull quay.io/jetstack/cert-manager-controller:v1.8.2
docker pull quay.io/jetstack/cert-manager-webhook:v1.8.2
docker pull registry.cn-beijing.aliyuncs.com/dbatao/k8s-node-oversell:v1
檢查certmanager服務是否正常
$ kubectl apply -f cert-manager.yaml
$ kubectl get pod -n cert-manager
2. 使用 certmanager 生成簽發證書
# cat cert.yaml
---
apiVersion: v1
kind: Namespace
metadata:name: node-oversell-webhook
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:name: selfsigned-issuernamespace: node-oversell-webhook
spec:selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:name: serving-certnamespace: node-oversell-webhook
spec:dnsNames:- node-oversell-webhook.node-oversell-webhook.svc- node-oversell-webhook.node-oversell-webhook.svc.cluster.localissuerRef:kind: Issuername: selfsigned-issuersecretName: webhook-server-cert
---# kubectl apply -f cert.yaml
查看證書是否已簽發完成
$ kubectl get certificate -n node-oversell-webhook
3. 獲取secret的內容 并替換CA_BUNDLE
CA_BUNDLE=$(kubectl -n node-oversell-webhook get secrets webhook-server-cert -o jsonpath="{.data.ca\.crt}")echo ${CA_BUNDLE}
sed -i "s|\${CA_BUNDLE}|${CA_BUNDLE}|g" mutating_webhook.yamlcat mutating_webhook.yaml
kubectl apply -f mutating_webhook.yaml
4.部署svc + deploy
kubectl apply -f webhook_deployment.yamlkubectl apply -f svc.yaml
curl -k https://svc_ip:443/readyz #預期---返回ok
三、測試驗證
1. 觀察pod情況
kubectl logs -n node-oversell-webhook node-oversell-webhook-7b75dd467b-hs9m9 --tail 10
2. 給node 打上不需要超售的標簽【可以讓master節點資源不超賣】
#將<node_name>更換為不用超賣節點的名稱,非常智能!!
$ kubectl label node <node_name> node-oversell/disable=true#例如
kubectl label node master01 node-oversell/disable=true#如果需要這個節點超賣,將標簽去掉即可
kubectl label node master01 node-oversell/disable-
3. 資源實現超賣
$ kubectl get nodes node2 -o yaml |grep allocatable: -A6#在Prometheus里用PromeQL也能查看到
kube_node_status_allocatable{} #QL查詢語句
4. 刪除還原
$ kubectl delete deploy -n node-oversell-webhook node-oversell-webhook
$ kubectl delete mutatingwebhookconfigurations node-oversell-webhook
四、總結
-
我們再來回顧一下大致步驟
-
API-Server支持準入控制器中,準入控制器中有一個“修改性質的控制器”
- 監聽node status的服務資源,牽引到某個服務上【這個服務中,把10G改成20G,再推送API-Server中】
- Admission controller是攔截(經過身份驗證)API Server請求的網關,并且可以修改請求對象或拒絕請求。
- k8s在Api-Server中就提供Admission Controller(準入控制器)的機制,包括MutatingAdmissionWebhook,通過這個webhook,所有在集群中和Api-Sever交互的請求都被發送到一個指定的接口中,我們只要提供一個這樣的接口,就可以獲取到Node往ApiServer發送心跳的Staus數據了。然后將這個數據進行我們的自定義修改,再往后傳給etcd,就能讓etcd以為我們修改過的Status數據就是節點的真實Status,最終實現資源的超賣。
- MutatingAdmissionWebhook 作為kubernetes的 ApiServer中Admission Controller的一部分,提供了非常靈活的擴展機制,通過配置MutatingWebhookConfiguration對象,理論上可以監聽并修改任何經過ApiServer處理的請求。
-
形象的通俗理解:古代時,大臣(node資源匯報)想匯報情況給皇帝(ETCD),需要通過太監進行傳達,那么太監可以修改奏本(allocatable)再傳給皇帝,以達到以假亂真的情形。
- 而 k8s在Api-Server中就提供Admission Controller(準入控制器)的機制(可以修改性質的控制器)
今天也是充實的一天呢,有問題歡迎大家評論區交流,咱們下篇文章再見了~ 😉