• 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节点加入集群

  • 相关阅读:
    Ubuntu18.04下搭建LNMP教程-超详细图文(Nginx+MySQL+PHP含各种解决报错问题)
    win10下Ubuntu18.04安装的简单教程
    Bugku-CTF加密篇之富强民主
    PHP中PHP $_POST和PHP $_REQUEST及PHP $_GET的用法及区别
    Base系列编码浅析【base16 base32 base64 base85 base36 base 58 base91 base 92 base62】
    Bugku-CTF加密篇之贝斯家族(@iH<,{bdR2H;i6*Tm,Wx2izpx2!)
    Bugku-CTF加密篇之这不是md5(666c61677b616537333538376261353662616566357d)
    Bugku-CTF加密篇之告诉你个秘密(ISCCCTF)
    攻防世界—pwn—guess_num
    攻防世界—pwn—level2
  • 原文地址:https://www.cnblogs.com/tchua/p/10855001.html
Copyright © 2020-2023  润新知