如何将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

