如何将Metrics Server部署到Kubernetes集群

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

Kubernetes Metrics Server是资源使用情况数据的群集范围的聚合器。它的工作是从Summary API收集指标,该指标由Kubelet在每个节点上公开。在对怪异的资源利用率进行故障排除时,诸如容器CPU和内存使用率之类的资源使用率指标将很有帮助。所有这些指标都可以通过Metrics API在Kubernetes中使用。

Metrics API具有给定节点或者给定Pod当前使用的资源量。由于它不存储度量标准值,因此将Metrics Server用于此目的。提供了部署yamls文件以用于在Metrics Server项目源代码中进行安装。

指标服务器要求

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

必须从kube-apiserver可以访问Metrics Server必须正确配置kube-apiserver以启用聚合层节点必须配置kubelet授权以匹配Metrics Server配置容器运行时必须实现容器指标RPC

将Metrics Server部署到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版本中可用的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部署是否正在运行所需数量的容器:

$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

也可以使用thekubectl top命令访问Metrics 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 /内存/存储,请运行以下命令:

$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%

类似的命令可以用于Pod。

$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

我们还可以访问usekubectl 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服务器标志以及标准的Kubernetesglog日志记录标志。最常用的是:--logtostderr:登录到标准错误而不是容器中的文件。我们通常希望启用它。--v = <X>`:设置日志详细程度。除非我们遇到错误,否则通常最好运行日志级别1或者2. 在日志级别10,将报告大量诊断信息,包括API请求和响应正文,以及来自Kubelet的原始度量结果。--secure-port = <port>:设置安全端口。如果我们不是以root用户身份运行,则需要将其设置为默认值(端口443)以外的其他值。--tls-cert-file,,--tls-private-key-file文件。如果未指定,将生成自签名证书。在生产中使用非自签名证书。--kubelet-certificate-authority:CA证书的路径,用于验证提供证书的Kubelet。

更改Metrics Server行为的其他标志是:--metric-resolution = <duration>:从Kubelet抓取指标的时间间隔(默认为60s)。--kubelet-insecure-tls:跳过验证Kubelet CA证书的步骤。--kubelet-port:用于连接Kubelet的端口(默认为默认的安全Kubelet端口10250)。--kubelet-preferred-address-types 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

禁用不安全的CA证书验证

如果我们使用的是自签名证书,则可以使用kubelet-insecure-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 /内存/存储的资源使用情况:

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

我们可以对pod进行相同操作显示默认命名空间中所有pod的指标

$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