AWS: EKS - 5

EKS - Part 5

Metrics Server

The Kubernetes metrics server is an aggregator of resource usage data in your cluster, and it is not deployed by default in Amazon EKS clusters. The metrics server is commonly used by other Kubernetes add ons, such as the Horizontal Pod Autoscaler or the Kubernetes Dashboard.

  • Deploy the metrics server

    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
    
  • Verify that the metrics-server deployment

    kubectl get deployment metrics-server -n kube-system
    

Prometheus

The Kubernetes API server exposes a number of metrics that are useful for monitoring and analysis. These metrics are exposed internally through a metrics endpoint that refers to the /metrics HTTP API. Like other endpoints, this endpoint is exposed on the Amazon EKS control plane.

Prometheus is an open-source systems monitoring and alerting toolkit originally built at SoundCloud. Since its inception in 2012, many companies and organizations have adopted Prometheus, and the project has a very active developer and user community. It is now a standalone open source project and maintained independently of any company. To emphasize this, and to clarify the project’s governance structure, Prometheus joined the Cloud Native Computing Foundation in 2016 as the second hosted project, after Kubernetes.

Deploying Prometheus

  • Create a Prometheus namespace.

    kubectl create namespace prometheus
    
  • Install helm

    ## MAC
    brew install helm
    
    ## Linux
    curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
    chmod 700 get_helm.sh
    ./get_helm.sh
    
    ## Add stable repo to helm
    helm repo add stable https://kubernetes-charts.storage.googleapis.com/
    
  • Deploy Prometheus.

    helm install prometheus stable/prometheus \
            --namespace prometheus \
            --set alertmanager.persistentVolume.storageClass="gp2",server.persistentVolume.storageClass="gp2"
    
  • Verify that all of the pods in the prometheus namespace are in the READY state.

    kubectl get pods -n prometheus
    

Grafana

Set the storage class to gp2, admin password, configuring the datasource to point to Prometheus and creating an external load balancer for the service.

kubectl create namespace grafana
helm install grafana stable/grafana \
        --namespace grafana \
        --set persistence.storageClassName="gp2" \
        --set adminPassword='grafana' \
        --set datasources."datasources\.yaml".apiVersion=1 \
        --set datasources."datasources\.yaml".datasources[0]    name=Prometheus \
        --set datasources."datasources\.yaml".datasources[0]    type=prometheus \
        --set datasources."datasources\.yaml".datasources[0]    url=http://prometheus-server.prometheus.svc.cluster.local \
        --set datasources."datasources\.yaml".datasources[0]    access=proxy \
        --set datasources."datasources\.yaml".datasources[0]    isDefault=true \
        --set service.type=LoadBalancer

Get your ‘admin’ user password

kubectl get secret --namespace grafana grafana \
    -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

The Grafana server can be accessed via port 80 on the following DNS name from within your cluster: grafana.grafana.svc.cluster.local

Get the Grafana URL to visit by running these commands in the same shell:

 export SERVICE_IP=$(kubectl get svc --namespace grafana grafana -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
 http://$SERVICE_IP:80

Import dashboard

  • Cluster Monitoring Dashboard

    • Click ’+’ button on left panel and select ‘Import’.
    • Enter 3119 dashboard id under Grafana.com Dashboard.
    • Click ‘Load’.
    • Select ‘Prometheus’ as the endpoint under prometheus data sources drop down.
    • Click ‘Import’.
  • Pods Monitoring Dashboard

    • Click ’+’ button on left panel and select ‘Import’.
    • Enter 6417 dashboard id under Grafana.com Dashboard.
    • Click ‘Load’.
    • Enter Kubernetes Pods Monitoring as the Dashboard name.
    • Click change to set the Unique identifier (uid).
    • Select ‘Prometheus’ as the endpoint under prometheus data sources drop down.s
    • Click ‘Import’.

Kubernetes Dashboard

  • Deploy the Kubernetes Metrics Server

  • Deploy the Dashboard

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
    
  • Create an eks-admin Service Account and Cluster Role Binding

    cat<<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: eks-admin
    namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
    name: eks-admin
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: cluster-admin
    subjects:
    - kind: ServiceAccount
    name: eks-admin
    namespace: kube-system
    EOF
    
  • Get login token

    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')
    
  • Start the kubectl proxy

    kubectl proxy
    
  • Access dashboard via browser

    http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#!/login.
    
  • Use token from above to login

  • Expose the dashboard to public

    cat<<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Service
    metadata:
    annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"creationTimestamp":"2020-04-12T12:34:10Z","labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kubernetes-dashboard","resourceVersion":"380715","selfLink":"/api/v1/namespaces/kubernetes-dashboard/services/kubernetes-dashboard","uid":"31489c5f-2dff-4b88-9a36-46b248bf9ce2"},"spec":{"externalTrafficPolicy":"Cluster","ports":[{"port":80,"protocol":"TCP","targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"},"sessionAffinity":"None","type":"LoadBalancer"},"status":{"loadBalancer":{}}}
    creationTimestamp: "2020-04-12T13:23:52Z"
    labels:
    k8s-app: kubernetes-dashboard
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard
    resourceVersion: "402339"
    selfLink: /api/v1/namespaces/kubernetes-dashboard/services/kubernetes-dashboard
    uid: d29bab71-d159-4c33-9ba1-00f05138ecb6
    spec:
    externalTrafficPolicy: Cluster
    ports:
    - nodePort: 30556
    port: 443
    protocol: TCP
    targetPort: 8443
    selector:
    k8s-app: kubernetes-dashboard
    sessionAffinity: None
    type: LoadBalancer
    status:
    loadBalancer:{}