zoukankan      html  css  js  c++  java
  • 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节点加入集群

  • 相关阅读:
    FZU 2150 Fire Game
    POJ 3414 Pots
    POJ 3087 Shuffle'm Up
    POJ 3126 Prime Path
    POJ 1426 Find The Multiple
    POJ 3278 Catch That Cow
    字符数组
    HDU 1238 Substing
    欧几里德和扩展欧几里德详解 以及例题CodeForces 7C
    Codeforces 591B Rebranding
  • 原文地址:https://www.cnblogs.com/tchua/p/10855001.html
Copyright © 2011-2022 走看看