在Amazon EKS集群上安装Kubernetes Metrics Server

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

在我们之前的教程中,我们讨论了如何使用Amazon EKS服务在AWS上安装Kubernetes Cluster。实际上,这是几分钟之内在AWS中运行Kubernetes集群的最快,最简单的方法。 eksctl的设置过程是相当自动化的,它使用幕后使用CloudFormation堆栈来引导由Amazon Linux工作机驱动的工作集群。

在本教程中,我将逐步引导我们完成在EKS集群中安装和配置Kubernetes指标服务器的步骤。 Metrics Server是Kubernetes内置自动伸缩管道的可扩展,高效的容器资源指标来源。它从Kubelet收集资源指标,并通过Metrics API在Kubernetes apiserver中公开它们,以供Horizontal Pod AutoscalerandVertical Pod Autoscaler使用。

Metrics Server提供:

适用于大多数群集的单个部署可扩展支持多达5,000个节点群集资源效率:Metrics Server使用0.5m的CPU核心和每个节点4 MB的内存

在Amazon EKS集群上安装Kubernetes Metrics Server

在Amazon EKS Cluster上开始安装Kubernetes Metrics Server之前,请确认我们有EKS集群正在工作。我们可以使用eksctl命令检查可用的EKS群集。

$eksctl get cluster
NAME			REGION
prod-eks-cluster	eu-west-1

如果本地有kubeconfig,请使用它来确认Kubernetes API服务器是否响应。

$kubectl --kubeconfig=/Users/jkmutai/.kube/eksctl/clusters/prod-eks-cluster get nodes
NAME                                            STATUS   ROLES    AGE   VERSION
ip-192-168-138-244.eu-west-1.compute.internal   Ready    <none>   13h   v1.17.9-eks-4c6976
ip-192-168-176-247.eu-west-1.compute.internal   Ready    <none>   13h   v1.17.9-eks-4c6976

指标服务器要求

Metrics Server对群集和网络配置有特定要求。这些要求是所有群集分发的默认设置。在使用Metrics Server之前,请确保集群分发支持这些要求:必须从kube-apiserver可以访问Metrics Server必须正确配置kube-apiserver以启用聚合层节点必须配置kubelet授权以匹配Metrics Server配置容器运行时必须实现容器度量RPC

如何在Amazon EKS集群上安装Kubernetes Metrics Server

将kubeconfig保存到环境变量。

export KUBECONFIG=/Users/jkmutai/.kube/eksctl/clusters/prod-eks-cluster

确认我们可以运行kubectl命令,而无需手动将路径传递到kubeconfig文件。

$kubectl get nodes
NAME                                            STATUS   ROLES    AGE   VERSION
ip-192-168-138-244.eu-west-1.compute.internal   Ready    <none>   13h   v1.17.9-eks-4c6976
ip-192-168-176-247.eu-west-1.compute.internal   Ready    <none>   13h   v1.17.9-eks-4c6976

应用Metrics Server版本中可用的Metrics Server列表,使其可通过url安装:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.1/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

还可以使用kubectl 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

我们还可以访问use 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"
      }
    }
  ]
}