K8S從入門到放棄系列-(13)Kubernetes集群mertics-server部署


集群部署好后,如果我們想知道集群中每個節點及節點上的pod資源使用情況,命令行下可以直接使用kubectl top node/pod來查看資源使用情況,默認此命令不能正常使用,需要我們部署對應api資源才可以使用此命令。從 Kubernetes 1.8 開始,資源使用指標(如容器 CPU 和內存使用率)通過 Metrics API 在 Kubernetes 中獲取, metrics-server 替代了heapster。Metrics Server 實現了Resource Metrics API,Metrics Server 是集群范圍資源使用數據的聚合器。 Metrics Server 從每個節點上的 Kubelet 公開的 Summary API 中采集指標信息。heapster從1.13版本開始被廢棄,官方推薦使用Metrics Server+Prometheus方案進行集群監控。

1、下載資源清單配置文件(6個)

項目地址:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/metrics-server

配置文件有兩種獲取方式:
2、https://github.com/kubernetes/kubernetes/tree/release-1.14/cluster/addons/metrics-server(推薦使用此方式)
[root@k8s-master01 ~]# mkdir /opt/metrics
### 選擇對應分支,下載指定配置文件
###或者直接git clone https://github.com/kubernetes/kubernetes.git,metrics-server 插件位於 kubernetes 的 cluster/addons/metrics-server/ 目錄下
[root@k8s-master01 metrics]# for file in auth-delegator.yaml auth-reader.yaml metrics-apiservice.yaml metrics-server-deployment.yaml metrics-server-service.yaml resource-reader.yaml;do wget https://raw.githubusercontent.com/kubernetes/kubernetes/v1.14.1/cluster/addons/metrics-server/$file;done
2、修改配置文件
由於某些原因,有些鏡像在國內無法下載,所以我們需要修改配置文件中鏡像下載地址,要注意紅色字體為鏡像運行的參數
##鏡像地址啟動參數修改
[root@k8s-master01 metrics]# vim metrics-server-deployment.yaml 
###mertics-server 修改啟動參數鏡像地址
......
containers:
      - name: metrics-server
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.1
        command:
        - /metrics-server
        - --metric-resolution=30s
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP ......
###metrics-server-nanny 修改鏡像地址及啟動參數
......
- name: metrics-server-nanny
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/addon-resizer:1.8.4
.....
command:
          - /pod_nanny
          - --config-dir=/etc/config
          - --cpu=100m
          - --extra-cpu=0.5m
          - --memory=100Mi
          - --extra-memory=50Mi
          - --threshold=5
          - --deployment=metrics-server-v0.3.1
          - --container=metrics-server
          - --poll-period=300000
          - --estimator=exponential

......
## 在新的版本中,授權文內沒有 node/stats 的權限,需要手動去添加
[root@k8s-master01 metrics]# vim resource-reader.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats  ## 添加此參數
  - namespaces

mertics-server鏡像參數解釋:

  • --kubelet-insecure-tls:不驗證客戶端證書
  • --kubelet-preferred-address-types: metrics-server連節點時默認是連接節點的主機名,但是coredns里面沒有物理機主機名的解析,需要加個參數,讓它連接節點的IP

特別注意:

  如果不加參數,有可能會報以下錯誤:

unable to fully collect metrics: [unable to fully scrape metrics from source kubelet_summary:k8s-node02: unable to fetch metrics from Kubelet k8s-node02 (10.10.0.23): request failed - "401 Unauthorized", response: "Unauthorized", unable to fully scrape metrics from source kubelet_summary:k8s-node01: unable to fetch metrics from Kubelet k8s-node01 (10.10.0.17): request failed - "401 Unauthorized", response: "Unauthorized"]

3、kube-apiserver配置文件修改

二進制部署安裝,需要手動修改apiserver添加開啟聚合服務的參數,當然如果你已經添加,那么請跳過這一步
## 編輯kube-apiserver.conf 添加如下參數,從下面參數中可以看出,需要生產新的證書,因此我們還需要為metrics生產證書
--requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem 
--requestheader-allowed-names="" 
--requestheader-extra-headers-prefix=X-Remote-Extra- 
--requestheader-group-headers=X-Remote-Group 
--requestheader-username-headers=X-Remote-User 
--proxy-client-cert-file=/etc/kubernetes/ssl/metrics-proxy.pem 
--proxy-client-key-file=/etc/kubernetes/ssl/metrics-proxy-key.pem 

參數說明:

  • --requestheader-XXX、--proxy-client-XXX 是 kube-apiserver 的 aggregator layer 相關的配置參數,metrics-server & HPA 需要使用;
  • --requestheader-client-ca-file:用於簽名 --proxy-client-cert-file 和 --proxy-client-key-file 指定的證書(ca證書),在啟用了 metric aggregator 時使用;

注:如果 --requestheader-allowed-names 不為空,則--proxy-client-cert-file 證書的 CN 必須位於 allowed-names 中,默認為 aggregator;

  如果 kube-apiserver 機器沒有運行 kube-proxy,則還需要添加 --enable-aggregator-routing=true 參數
特別注意:
  kube-apiserver不開啟聚合層會報以下類似錯誤:
  
I0109 05:55:43.708300       1 serving.go:273] Generated self-signed cert (apiserver.local.config/certificates/apiserver.crt, apiserver.local.config/certificates/apiserver.key)
Error: cluster doesn't provide requestheader-client-ca-file

4、為metrics server生成證書

上面可以看到,kube-apiserver開啟聚合層,也需要使用證書,為了便於區分,我們這里為mertics 單獨生產證書

關於證書的創建也可參考之前部署其它組件時創建證書時候的步驟

## 創建kube-proxy證書請求
[root@k8s-master01 ~]# vim /opt/k8s/certs/metrics-proxy-csr.json 
{
  "CN": "metrics-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "metrics-proxy",
      "OU": "System"
    }
  ]
}
## 生成kube-proxy證書與私鑰
[root@k8s-master01 ~]# cd /opt/k8s/certs/
[root@k8s-master01 certs]# cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
    -ca-key=/etc/kubernetes/ssl/ca-key.pem \
    -config=/opt/k8s/certs/ca-config.json \
    -profile=kubernetes metrics-proxy-csr.json | cfssljson -bare metrics-proxy
## 證書分發
[root@k8s-master01 certs]# ansible k8s-master -m copy -a 'src=/opt/k8s/certs/metrics-proxy-key.pem dest=/etc/kubernetes/ssl/'
[root@k8s-master01 certs]# ansible k8s-master -m copy -a 'src=/opt/k8s/certs/metrics-proxy.pem dest=/etc/kubernetes/ssl/'
## 重啟kube-apiserver服務
[root@k8s-master01 ~]# ansible k8s-node -m shell -a 'systemctl restart kube-apiserver'

5、kubelet參數修改

主要檢查以下兩個參數,否則無法正常獲取節點主機或者pod的資源使用情況

  • 刪除--read-only-port=0
  • 添加--authentication-token-webhook=true參數

 6、根據清單文件創建mertics server服務
[root@k8s-master01 metrics]# kubectl apply -f .
##查看mertics-server運行情況
[root@k8s-master01 metrics]# kubectl get pods -n kube-system |grep metrics-server
metrics-server-v0.3.1-57654875b4-6nflh     2/2     Running   0          13m
## 驗證查看是否可以正常獲取資源使用詳情
[root@k8s
-master01 metrics]# kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% k8s-master01 245m 24% 648Mi 74% k8s-master02 166m 16% 630Mi 72% k8s-master03 137m 13% 645Mi 73% k8s-node01 96m 4% 461Mi 15% k8s-node02 360m 18% 1075Mi 37%

特別注意:
  我是二進制部署,所以剛開始並沒有在master節點部署kubelet、kube-proxy組件,所以導致一直安裝失敗:

  執行命令kubectl get apiservices v1beta1.metrics.k8s.io -o yaml 看到報錯信息:"metrics-server error "Client.Timeout exceeded while awaiting headers"",這是因為mertics無法與 apiserver服務通信導致,因此需要在master節點安裝部署kubelet、kube-proxy組件(可以選擇給master節點打污點,來決定是否讓master參與pod調度上來),具體結合前面文章K8S踩坑篇-master節點作為node節點加入集群


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM