Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Panel
bgColor#FFEBE6

Kubernetes

Kubernetes (k8s) clusters are scanned via 2 different methods:

  • Kubernetes API Server for topology information

  • BVQ Prometheus Server for topology & performance information


Kubernetes API Server

To gain access to the k8s API server the following preparations must be made:

  1. Create a Compute_layer#CustomResourceDefinition (CRD) to set up a k8s cluster as master grouping object (MGO) definition for BVQ

  2. Create a Compute_layer#MasterGroupingObject instance (binded to the CRD) for the k8s cluster

  3. Create a Compute_layer#ClusterRole to get read-only (get, list, watch) access to the k8s cluster

  4. Create a Compute_layer#ServiceAccount for authentication

  5. Create a Compute_layer#ClusterRoleBinding to bind the ServiceAccount to the ClusterRole

ℹ Use kubectl apply -f  to create the expected objects. You can edit & use the all in one preparation YAML file to set up all requirements in one step.(make sure all 5 objects are created properly - sometimes Compute_layer#MasterGroupingObject creation fails due to the delayed creation of the Compute_layer#CustomResourceDefinition)

Panel
bgColor#FFEBE6

CustomResourceDefinition

Create a CustomResourceDefinition (CRD) to set up a k8s cluster as master grouping object (MGO) definition for BVQ

mgo-crd.yaml 

Code Block
languageyml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: mastergroupingobjects.bvq.sva
spec:
  group: bvq.sva
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                clusterName:
                  type: string
                  description: Cluster-Name
                customer:
                  type: string
                  description: Customer-Name
                location:
                  type: string
                  description: Location where the Cluster is located at
                dc:
                  type: string
                  description: Datacenter-Name
                contact:
                  type: string
                  description: Customer-Contact-Name
                email:
                  type: string
                  description: E-Mail-Address of the Contact
                phone:
                  type: string
                  description: Phone-Number of the Contact
  scope: Cluster
  names:
    plural: mastergroupingobjects
    singular: mastergroupingobject
    kind: MasterGroupingObject
    shortNames:
    - mgo
Panel
bgColor#FFEBE6

MasterGroupingObject

Create a MasterGroupingObject instance (binded to the CRD) for the k8s cluster

ℹ Edit/adjust the values for clusterName, customer, location, dc, contact, email  & phone  to the required information

IMPORTANT: clusterName  will represent the name of the k8s cluster within BVQ, so choose a meaningful name (example would be: Prod-Cluster-01)

mgo-instance.yaml

Code Block
languageyml
apiVersion: bvq.sva/v1
kind: MasterGroupingObject
metadata:
  name: bvq-mgo-k8s
  labels:
    bvq: mgo
spec:
  clusterName: Prod-Cluster-01
  customer: Customer Inc.
  location: Berlin, Germany
  dc: Example-DC-01
  contact: Max Mustermann
  email: max.mustermann@customer.de
  phone: +49-171-1234-56789
Panel
bgColor#FFEBE6

ClusterRole

Create a ClusterRole to get read-only (get, list, watch) access to the k8s cluster

ℹ Read only permissions (get, list, watch) are required apiGroups may required 

apiGroups may be applied via a wildcard ('*') to get access to all api groups, otherwise apiGroups given in the example must be set

cluster-role-bvqscan.yaml 

Code Block
languageyml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: bvq-scanner-rl
rules:
  - verbs:
      - get
      - watch
      - list
    apiGroups:
      - ''
      - apiextensions.k8s.io
      - apps
      - batch
      - bvq.sva
      - networking.k8s.io
      - storage.k8s.io
      - discovery.k8s.io
      - scheduling.k8s.io
    resources:
      - '*'
Panel
bgColor#FFEBE6

ServiceAccount

Create a ServiceAccount for authentication

ℹ The Token created for this ServiceAccount is needed to set up a BVQ scanner config for the k8s cluster namespace may cluster 

namespace may be adjusted to another kubernetes namespace. Remember to edit the namspace set in the Compute_layer#ClusterRoleBinding

IMPORTANT: With k8s version 1.24 the LegacyServiceAccountTokenNoAutoGeneration feature gate is beta, and enabled by default (see here). Use this guide to create a non-expiring token (recommended)

bvq-serviceaccount.yaml

Code Block
languageyml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bvqscan
  namespace: default
Panel
bgColor#FFEBE6

ClusterRoleBinding

Create a ClusterRoleBinding to bind the Compute_layer#ServiceAccount to the Compute_layer#ClusterRole

cluster-role-binding-bvqscan-sa.yaml

Code Block
languageyml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: bvq-scanner-sa-bnd
subjects:
- kind: ServiceAccount
  name: bvqscan
  namespace: default
roleRef:
  kind: ClusterRole
  name: bvq-scanner-rl
  apiGroup: rbac.authorization.k8s.io
Panel
bgColor#FFEBE6

BVQ Prometheus Server

To get performance and topology data a custom bvq-prometheus stack must be deployed in the k8s cluster via helm. This helm chart will install a bvq-prometheus server as a deployment with a 8GB persistent volume (configurable via values.yaml) and bvq-prometheus-node-erxprters as a DaemonSet (helm dependency).

See values.yaml and other configuration files in the bvq-prometheus-helm.zip file for further information about the bvq-prometheus configuration.

Execute the following steps to deploy the bvq-prometheus helm chart to the k8s cluster:

  • Create a namespace (e.g. bvq-prometheus) for the prometheus stack:
    kubectl create namespace bvq-prometheus 

  • Unzip helm files → bvq-prometheus-helm.zip

  • For external communication an ingress for the bvq-prometheus server is needed. Edit prometheus.ingress.hosts  in values.yaml to set a proper ingress.

  • Run helm dependency build / helm dependency update 

  • Install the helm chart via helm install -n bvq-prometheus -f values.yaml bvq-prometheus ./ 

    helm install -n bvq-prometheus -f values.yaml bvq-prometheus ./ Quelle erweitern

Code Block
languagebash
▶ helm install -n bvq-prometheus -f values.yaml bvq-prometheus ./
NAME: bvq-prometheus
LAST DEPLOYED: Thu Dec 15 11:00:08 2022
NAMESPACE: bvq-prometheus
STATUS: deployed
REVISION: 1
TEST SUITE: None
  • Check the installation with kubectl get pods -n bvq-prometheus  - A pod called bvq-prometheus-* and a set of bvq-prometheus-bvq-node-exporter-* pods should be in running state

    kubectl get pods -n bvq-prometheus

Code Block
languagebash
▶ kubectl get pods -n bvq-prometheus
NAME                                     READY   STATUS    RESTARTS   AGE
bvq-prometheus-5b8cd79d79-r587m          1/1     Running   0          64s
bvq-prometheus-bvq-node-exporter-jz46z   1/1     Running   0          2s

Panel
bgColor#FFEBE6

Gather information for BVQ Scanner configuration

BVQ scanners need the following information to be configured for each k8s cluster:

  • API server IP address or DNS name (FQDN) - Default TCP port: 6443

  • API Token of the bvqscan Compute_layer#ServiceAccount

  • Prometheus URL or IP (if NodePort service is used)

  • Prometheus user & password (optional, if BasicAuth of Prometheus is used)

Preparation for the BVQ Server

For BVQ Servers which are gathering information from Kubernetes clusters, the correct DNS configuration is important.
Make sure that the BVQ Server & Kubernetes clusters are in the same domain and have the same DNS server configured. 

...