如何将指标服务器部署到Kubernetes集群

时间:2020-02-23 14:30:30  来源:igfitidea点击:

Kubernetes Metrics Server是资源使用数据的群集聚合器。
其工作是从每个节点上的Kubelet曝光的摘要API中收集指标。
资源使用指标,例如Container CPU和内存使用情况有用在诊断奇怪的资源利用率时都有用。
所有这些指标都可以通过Metrics API在Kubernetes中提供。

指标API具有当前由给定节点或者给定POD使用的资源量。
由于它不存储度量标准值,因此Metrics服务器用于此目的。
部署yamls文件是在Metrics Server项目源代码中安装的。

指标服务器要求

Metrics Server对群集和网络配置具有特定要求。
这些要求不是所有群集分布的默认值。
请确保在使用Metrics服务器之前,群集分发支持这些要求:

必须从kube-apiserver到达Metrics服务器,kube-apiserver必须正确配置为启用聚合pardernode必须具有kubelet授权,配置为匹配Metrics Server ContionContainer运行时必须实现容器度量RPC

将标准服务器部署到Kubernetes

下载列表文件。

wget kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml

通过编辑文件将设置修改为喜好。

vim components.yaml

一旦我们需要自定义,需要在Kubernetes集群中部署Metrics-Server。
如果我们有多个Kubernetes集群,请切换到正确的群集:轻松使用Kubectl&Kubectx管理多个Kubernetes集群。

应用Metrics Server Manifests,可在Metrics Server上发布,使其通过URL可安装:

kubectl apply -f components.yaml

以下是正在创建的资源的输出。

clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created

使用以下命令验证Metrics-Server部署是否运行所需的POD:

$kubectl get deployment metrics-server -n kube-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
metrics-server   1/1     1            1           7m23s
$kubectl get pods -n kube-system | grep metrics
metrics-server-7cb45bbfd5-kbrt7   1/1     Running   0          8m42s

确认指标服务器处于活动状态。

$kubectl get apiservice v1beta1.metrics.k8s.io -o yaml
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apiregistration.k8s.io/v1beta1","kind":"APIService","metadata":{"annotations":{},"name":"v1beta1.metrics.k8s.io"},"spec":{"group":"metrics.k8s.io","groupPriorityMinimum":100,"insecureSkipTLSVerify":true,"service":{"name":"metrics-server","namespace":"kube-system"},"version":"v1beta1","versionPriority":100}}
  creationTimestamp: "2017-08-12T11:27:13Z"
  name: v1beta1.metrics.k8s.io
  resourceVersion: "130943"
  selfLink: /apis/apiregistration.k8s.io/v1/apiservices/v1beta1.metrics.k8s.io
  uid: 83c44e41-6346-4dff-8ce2-aff665199209
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
    port: 443
  version: v1beta1
  versionPriority: 100
status:
  conditions:
  - lastTransitionTime: "2017-08-12T11:27:18Z"
    message: all checks passed
    reason: Passed
    status: "True"
    type: Available

也可以使用kubectl top命令访问度量标准API。
这使得调试自动阶层的管道更容易。

$kubectl top --help
Display Resource (CPU/Memory/Storage) usage.
 The top command allows you to see the resource consumption for nodes or pods.
 This command requires Metrics Server to be correctly configured and working on the server.
Available Commands:
  node        Display Resource (CPU/Memory/Storage) usage of nodes
  pod         Display Resource (CPU/Memory/Storage) usage of pods
Usage:
  kubectl top [flags] [options]
Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

要显示群集节点资源使用 - CPU/Memory/Storate将运行命令:

$kubectl top nodes
NAME                                            CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
ip-192-168-138-244.eu-west-1.compute.internal   50m          2%     445Mi           13%
ip-192-168-176-247.eu-west-1.compute.internal   58m          3%     451Mi           13%

类似的命令可以用于Pods。

$kubectl top pods -A
NAMESPACE     NAME                              CPU(cores)   MEMORY(bytes)
kube-system   aws-node-glfrs                    4m           51Mi
kube-system   aws-node-sgh8p                    5m           51Mi
kube-system   coredns-6987776bbd-2mgxp          2m           6Mi
kube-system   coredns-6987776bbd-vdn8j          2m           6Mi
kube-system   kube-proxy-5glzs                  1m           7Mi
kube-system   kube-proxy-hgqm5                  1m           8Mi
kube-system   metrics-server-7cb45bbfd5-kbrt7   1m           11Mi

我们还可以访问使用kubectl get -raw来拉动群集中所有节点的原始资源使用度量。

$kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq
{
  "kind": "NodeMetricsList",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {
    "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes"
  },
  "items": [
    {
      "metadata": {
        "name": "ip-192-168-176-247.eu-west-1.compute.internal",
        "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/ip-192-168-176-247.eu-west-1.compute.internal",
        "creationTimestamp": "2017-08-12T11:44:41Z"
      },
      "timestamp": "2017-08-12T11:44:17Z",
      "window": "30s",
      "usage": {
        "cpu": "55646953n",
        "memory": "461980Ki"
      }
    },
    {
      "metadata": {
        "name": "ip-192-168-138-244.eu-west-1.compute.internal",
        "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/ip-192-168-138-244.eu-west-1.compute.internal",
        "creationTimestamp": "2017-08-12T11:44:41Z"
      },
      "timestamp": "2017-08-12T11:44:09Z",
      "window": "30s",
      "usage": {
        "cpu": "47815890n",
        "memory": "454944Ki"
      }
    }
  ]
}

其他自定义

这些是在在Kubernetes上安装Metrics Server之前可以进行的额外自定义。

设置标志

Metrics Server支持所有标准的Kubernetes API服务器标志以及标准的Kubernetes glog记录标志。
最常用的是: --logtostderr:记录标准错误而不是容器中的文件。
你一般想要这个。 --v=<X>:设置日志详细程度。
除非我们遇到错误,否则运行日志级别1或者2通常是一个好主意。
在日志级别10中,将报告大量的诊断信息,包括API请求和响应主体,以及来自Kubelet的原始度量结果。 --secure-port=<port>:设置安全端口。
如果我们未作为root运行,则我们需要将此设置为默认值以外的东西(端口443)。 --tls-cert-file--tls-private-key-file:服务证书和密钥文件。
如果未指定,将生成自签名证书。
在生产中使用非自签名证书。 --kubelet-certificate-authority:用于验证Kubelet的服务证书的CA证书的路径。

要更改度量标准服务器行为的其他标志是: --metric-resolution=<duration>:从kubelets刮擦度量的间隔(默认为60s)。 --kubelet-insecure-tls:跳过验证Kubelet CA证书。 --kubelet-port:用于连接kubelet的端口(默认到默认安全kubelet端口,10250)。 --kubelet-preferred-address-types:连接到Kubelet时要考虑Kubelet节点地址类型。

设置节点地址类型顺序

我将修改部署列表文件以添加在连接到Kubelet时考虑不同的Kubelet节点地址类型的顺序。

vim components.yaml

修改如下:

...............
containers:
      - name: metrics-server
        image: k8s.gcr.io/metrics-server-amd64:v0.3.6
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
          - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname

禁用Inecure CA证书验证

如果我们正在使用自签名证书,则可以使用-kubelet-iNecure-TLS标志来跳过验证Kubelet CA证书。

...............
containers:
      - name: metrics-server
        image: k8s.gcr.io/metrics-server-amd64:v0.3.7
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
          - --kubelet-insecure-tls
          - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname

测试指标服务器安装

允许显示节点的资源使用 - CPU/Memory/Storage:

$kubectl top nodes
NAME                                  CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8smaster01.theitroad.com     196m         4%     1053Mi          14%       
k8sworker01.theitroad.com     107m         2%     2080Mi          27%       
k8sworker02.theitroad.com     107m         2%     2080Mi          27%       
k8sworker03.theitroad.com     107m         2%     2080Mi          27%

我们可以为PODS做同样的事情 - 显示默认命名空间中所有窗格的指标

$kubectl top pods
NAMESPACE     NAME                                                        CPU(cores)   MEMORY(bytes)   
kube-system   calico-kube-controllers-5c45f5bd9f-dk8jp                    1m           11Mi            
kube-system   calico-node-4h67w                                           32m          27Mi            
kube-system   calico-node-99vkm                                           35m          27Mi            
kube-system   calico-node-qdqb8                                           21m          27Mi            
kube-system   calico-node-sd9r8                                           21m          43Mi            
kube-system   coredns-6955765f44-d4g99                                    2m           12Mi            
kube-system   coredns-6955765f44-hqc4q                                    2m           11Mi            
kube-system   kube-proxy-h87zf                                            1m           12Mi            
kube-system   kube-proxy-lcnvx                                            1m           14Mi            
kube-system   kube-proxy-x6tfx                                            1m           16Mi            
kube-system   kube-proxy-xplz4                                            1m           16Mi            
kube-system   metrics-server-7bd949b8b6-mpmk9                             1m           10Mi

更多命令选项检查:

kubectl top pod --help
kubectl top node --help