如何将Metrics Server部署到Kubernetes集群
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