Zum Hauptinhalt springen

Blogs

Kubeopsctl – Nahtlose Beherrschung von Kubernetes-Clustern ohne Ausfallzeiten

Kubernetes hat die Cloud-Computing-Welt im Sturm erobert, doch kann das Verwalten eines solchen Clusters eine gar überwältigende Aufgabe sein. Aus diesem Grund haben wir Kubeopsctl entwickelt. Ein CLI-Tool welches darauf abzielt, den Erstellungs- und Verwaltungsprozess Ihres Kubernetes-Clusters zu vereinfachen. Mit Hilfe von Kubeopsctl können Sie ein gesamtes Kubernetes-Cluster hochziehen, mitsamt aller Worker- und Master Nodes, dem Monitoring, Storage System, Logging-Stack, einer privaten Image-Registry, einem Open Policy Agent (OPA) als auch gängigen Tools wie dem NGINX Controller und Keycloak und dies alles innerhalb einer einzigen Yaml-Datei.

Einführung

In der Welt des Cloud-Computing spielt Kubernetes inzwischen ganz groß mit. Jedoch ist das Managen dessen Cluster nicht immer leicht und da kommt Kubeopsctl in’s Spiel. Dieses CLI-Tool ist in der Simplifizierung der Erstellung und Verwaltung Ihres Kubernetes-Clusters behilflich. Eine Yaml-Datei genügt für das Erstellen eines vollwertigen Clusters mit allen Worker- und Master Nodes, Monitoring etc.

Was genau ist Kubeopsctl? 

Kubeopsctl stellt ein Command-Line-Interface-Tool dar und vereinfacht den Prozess der Erstellung als auch Verwaltung eines Kubernetes-Clusters. Ob Sie nun Neueinsteiger sind oder Erfahrung mit Kubernetes haben, Kubeopsctl hilft Ihnen allen gleichermaßen.

Haupt-Features 

  • Einmalige Konfiguration: Wie bereits oben erwähnt kann mithilfe einer Yaml-Datei ein gesamtes Cluster erstellt werden. 

  • Upgrade ohne Ausfälle: Die Zonen-Konfiguration erlaubt Ihnen Ihr Cluster ohne Downtime auf das nächste Level zu bringen. Sie können die Master- als auch Worker Nodes in verschiedene Zonen setzen und Operationen im Zonen-Level vollführen. Dies hat zur Folge, dass es nie zu Ausfällen kommt.

  • Personalisierung: Sie können mühelos Ihren Master als auch Ihre Worker festlegen und auch deren Anforderungen spezifizieren.

  • Extra-Tools: Prometheus für’s Monitoring, Keycloak für mehr Sicherheit oder Certman für’s Zertifikat-Management wie auch andere Software kann problemlos hinzugefügt werden. Die Werte dieser Tools können Sie auch in Yaml ändern.

  • Sicherheit: Kubeopsctl besitzt eingebaute Sicherheits-Einstellungen, wie etwa vordefinierte Port-Nummern, SSL-Force-Optionen oder Konfigurationen zu Passwörtern und Secrets.

Sample-Konfiguration: Ein genauer Blick

Die Yaml-Datei bildet das Fundament von Kubeopsctl’s Funktionalität. Scrollen Sie an‘s Ende der Seite, um ein Beispiels-Exemplar zu finden und Ihr Verständnis der jeweiligen Komponenten zu vertiefen:

Cluster und User-Information: Am Beginn einer jeden Yaml-Datei steht eine rudimentäre aber dafür umso wichtigere Information über den Aufbau Ihres Kubernetes-Clusters. So etwa den bevorzugten Namen des Clusters, die zu wählende Kubernetes-Version oder die Login-Informationen, um auf Ihr Cluster zuzugreifen.

Master- und Worker-Nodes: Hier kommt die Topologie Ihres Clusters so richtig in Form. Innerhalb der designierten Zonen können Sie den Nodes Ihre Rolle zuschreiben und darüber hinaus auch deren IP-Adresse, System-Konfigurationen oder sogar Ressource-Quotas festlegen.

Optionale Komponenten: Kubeopsctl bietet Ihnen den Luxus zusätzliche Services wie Rook-Ceph für den Storage, Harbor für die Container-Registry oder Opensearch für die verteilte Suche und Analyse zu wählen. Sie können zudem den NGINX Ingress Controller, Keycloak oder ähnliches beifügen und diese Komponenten nach Bedarf Ihres Projekts einfach an- und abschalten via Toggles.

Fortgeschrittene Einstellungen: Denen, welche noch tiefer abzutauchen beabsichtigen, erlaubt Kubeopsctl auf fortgeschrittenere Konfigurationen zuzugreifen. Darunter befinden sich zum Beispiel Custom-Storage-Klassen, spezifische Volume-Größe, das Nutzen von existierenden Secrets, vordefinierter Passwörter und vieles mehr. Auch einem granularen Level an Kontrolle können wir also nachkommen.

Sicherheits-Features: Jenseits klassischer Firewall-Einstellungen bietet Kubeopsctl eine Vielzahl an Möglichkeiten, um sogenannte „nftables“ oder Container-Runtimes wie Containerd, vordefinierte Ports festzulegen und lässt Sie somit schon die ersten Schritte im Thema Sicherheit angehen.

Beispiel Code:

apiVersion: kubeops/kubeopsctl/alpha/v1  # mandatory
kubeOpsUser: "demo" # mandatory,  change to your username
kubeOpsUserPassword: "Password" # mandatory,  change to your password
kubeOpsUserMail: "Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein." # change to your email
imagePullRegistry: "registry1.kubernative.net/lima" # mandatory
localRegistry: false # mandatory
### Values for setup configuration ###
clusterName: "testkubeopsctl"  # mandatory
clusterUser: "mnyuser"  # mandatory
kubernetesVersion: "1.26.4" # mandatory, check lima documentation
#masterHost: optional if you have an hostname, default value in "masterIP"
masterIP: 10.2.10.11 # mandatory
firewall: "nftables" # mandatory, default "nftables"
pluginNetwork: "calico" # mandatory, default "nftables"
containerRuntime: "containerd" # mandatory, default "containerd"
limaRoot: "/home/myuser/kubeops/lima" # optional, default: "/var/lima" 
clusterOS: "Red Hat Enterprise Linux" # optional, can be "Red Hat Enterprise Linux" or "openSUSE Leap", remove this line if you want to use default installed OS on admin machine but it has to be "Red Hat Enterprise Linux" or "openSUSE Leap"
### Additional values for cluster configuration
useInsecureRegistry: false # optional, default is false
ignoreFirewallError: false # optional, default is false
serviceSubnet: 192.168.128.0/17 # optional, default "192.168.128.0/17"
podSubnet: 192.168.0.0/17 # optional, default "192.168.0.0/17"
debug: true # optional, default is true
logLevel: vvvvv # optional, default "vvvvv"
systemCpu: "1" # optional, default "1"
systemMemory: "2G" # optional, default "2G"
sudo: true # optional, default is true
# at least 3 masters and 3 workers are needed
zones:
  - name: zone1
    nodes:
      master:
        - name: cluster1master1
          ipAdress: 10.2.10.11
          user: myuser
          systemCpu: 100m
          systemMemory: 100Mi 
          status: active
          kubeversion: 1.26.4
        - name: cluster1master2
          ipAdress: 10.2.10.12
          user: myuser
          systemCpu: 100m
          systemMemory: 100Mi 
          status: active
          kubeversion: 1.27.2
      worker:
        - name: cluster1worker1
          ipAdress: 10.2.10.14
          user: myuser
          systemCpu: 100m
          systemMemory: 100Mi 
          status: active
          kubeversion: 1.26.4
        - name: cluster1worker2
          ipAdress: 10.2.10.15
          systemCpu: 100m
          systemMemory: 100Mi 
          status: active
          kubeversion: 1.27.2
  - name: zone2
    nodes:
      master:
        - name: cluster1master3
          ipAdress: 10.2.10.13
          user: myuser
          systemCpu: 100m
          systemMemory: 100Mi 
          status: drained
          kubeversion: 1.26.4  
      worker:
        - name: cluster1worker1
          ipAdress: 10.2.10.16
          user: myuser
          systemCpu: 100m
          systemMemory: 100Mi 
          status: active
          kubeversion: 1.26.4

# set to true if you want to install it into your cluster
rook-ceph: false # mandatory
harbor: false # mandatory
opensearch: false # mandatory
opensearch-dashboards: false # mandatory
logstash: false # mandatory
filebeat: false # mandatory
prometheus: false # mandatory
opa: false # mandatory
headlamp: false # mandatory
certman: false # mandatory
ingress: false # mandatory
keycloak: false # mandatory

nameSpace: "kubeops" #optional, the default value is different for each application
storageClass: "rook-cephfs" # optional, default value is "rook-cephfs"

###Values for Rook-Ceph###
rookValues:
  namespace: kubeops
  nodePort: 31931 # optional, default: 31931
  cluster:
    spec:
      dataDirHostPath: "/var/lib/rook" # optional, The path on the host where configuration files will be persisted. Default value: "/var/lib/rook"
    removeOSDsIfOutAndSafeToRemove: true # optional, default is true
    storage:
      useAllNodes: true # optional, default value: true
      useAllDevices: true # optional, default value: true
      # Global filter to only select certain devicesnames. This example matches names starting with sda or sdb.
      # Will only be used if useAllDevices is set to false and will be ignored if individual devices have been specified on a node.
      deviceFilter: "^sd[a-b]"
      # This setting can be used to store metadata on a different device. Only recommended if an additional metadata device is available.
      # Optional, will be overwritten by the corresponding node-level setting.
      config:
        metadataDevice: "sda"
      # Names of individual nodes in the cluster that should have their storage included.
      # Will only be used if useAllNodes is set to false.
      nodes:
        - name: "<ip-adress of node_1>"
          devices:
            - name: "sdb" 
        - name: "<ip-adress of node_2>"
          deviceFilter: "^sd[a-b]"
          config:
            metadataDevice: "sda" # optional
    # This setting allows the request of ressources for mgr, mon and osd pods.
    resources:
      mgr:
        requests:
          cpu: "500m" # optional, default is 500m
          memory: "1Gi" # optional, default is 1Gi
      mon:
        requests:
          cpu: "2" # optional, default is 2
          memory: "4Gi" # optional, default is 4Gi
      osd:
        requests:
          cpu: "2" # optional, default is 2
          memory: "4Gi" # optional, default is 4Gi
  operator:
    data:
      rookLogLevel: "DEBUG" # optional, default is DEBUG
  # Specify the filesystem type of the volume. Default value: "ext4"
  blockStorageClass:
    parameters:
      fstype: "ext4" # optional, default value is ext4
#-------------------------------------------------------------------------------------------------------------------------------
### Values for Postgres ###
postgrespass: "password" # mandatory, set password for harbor postgres access 
postgres:
  storageClassName: "rook-cephfs" # optional, default is rook-cephfs
  volumeMode: "Filesystem" # optional, default is  Filesystem
  accessModes: ["ReadWriteMany"] #optional, default is [ReadWriteMany]
  resources:
    requests:
      storage: 2Gi # mandatory, depending on storage capacity
#-------------------------------------------------------------------------------------------------------------------------------
### Values for Redis ###
redispass: "password" # mandatory set password for harbor redis access 
redis:
  storageClassName: "rook-cephfs" # optional, default is rook-cephfs
  volumeMode: "Filesystem" # optional, default is  Filesystem
  accessModes: ["ReadWriteMany"] #optional, default is [ReadWriteMany]
  resources:
    requests:
      storage: 2Gi # mandatory depending on storage capacity
#-------------------------------------------------------------------------------------------------------------------------------
### Values for Harbor deployment ###
## For detailed explaination for each key see: https://artifacthub.io/packages/helm/harbor/harbor/1.8.1#configuration ##
harborValues: 
  namespace: kubeops # optional, default is kubeops
  harborpass: "password" # mandatory: set password for harbor access 
  externalURL: https://10.2.10.13 # mandatory, the ip address, from which harbor is accessable outside of the cluster
  nodePort: 30003
  harborPersistence:
    persistentVolumeClaim:
      registry:
        size: 5Gi # mandatory, depending on storage capacity
        storageClass: "rook-cephfs" #optional, default is rook-cephfs
      chartmuseum:
        size: 5Gi # mandatory, depending on storage capacity
        storageClass: "rook-cephfs" #optional, default is rook-cephfs
      jobservice:
        jobLog:
          size: 1Gi # mandatory: Depending on storage capacity
          storageClass: "rook-cephfs" #optional, default is rook-cephfs
        scanDataExports:
          size: 1Gi # mandatory: Depending on storage capacity
          storageClass: "rook-cephfs" #optional, default is rook-cephfs
      database:
        size: 1Gi # mandatory, depending on storage capacity
        storageClass: "rook-cephfs" #optional, default is rook-cephfs
      redis:
        size: 1Gi # mandatory, depending on storage capacity
        storageClass: "rook-cephfs" #optional, default is rook-cephfs
      trivy: 
        size: 5Gi # mandatory, depending on storage capacity
        storageClass: "rook-cephfs" #optional, default is rook-cephfs
#--------------------------------------------------------------------------------------------------------------------------------------
###Values for filebeat deployment###
filebeatValues:
  namespace: kubeops # optional, default is kubeops   
#--------------------------------------------------------------------------------------------------------------------------------
###Values for Logstash deployment###
##For detailed explaination for each key see: https://github.com/elastic/helm-charts/releases/tag/v7.16.3###
logstashValues:
  namespace: kubeops
  volumeClaimTemplate:
    resources:
      requests:
        storage: 1Gi # mandatory, depending on storage capacity
    accessModes: 
      - ReadWriteMany #optional, default is [ReadWriteMany]
    storageClassName: "rook-cephfs" #optional, default is rook-cephfs
#--------------------------------------------------------------------------------------------------------------------------------------
###Values for OpenSearch-Dashboards deployment###
##For detailed explaination for each key see: https://github.com/opensearch-project/helm-charts/tree/main/charts/opensearch-dashboards###
openSearchDashboardValues:
  namespace: kubeops
  nodePort: 30050
#--------------------------------------------------------------------------------------------------------------------------------
###Values for OpenSearch deployment###
##For detailed explaination for each key see: https://github.com/opensearch-project/helm-charts/tree/main/charts/opensearch###
openSearchValues:
  namespace: kubeops
  opensearchJavaOpts: "-Xmx512M -Xms512M" # optional, default is -Xmx512M -Xms512M
  resources:
    requests:
      cpu: "250m" # optional, default is 250m
      memory: "1024Mi" # optional, default is 1024Mi
    limits:
      cpu: "300m" # optional, default is 300m
      memory: "3072Mi" # optional, default is 3072Mi
  persistence:
    size: 4Gi # mandatory
    enabled: "true" # optional, default is true
    enableInitChown: "false" # optional, default is false
    labels:
      enabled: "false" # optional, default is false
    storageClass: "rook-cephfs" # optional, default is rook-cephfs
    accessModes:
      - "ReadWriteMany" # optional, default is {ReadWriteMany}
  securityConfig:
    enabled: false # optional, default value: false
    ### Additional values can be set, if securityConfig is enabled:
    # path: "/usr/share/opensearch/plugins/opensearch-security/securityconfig"
    # actionGroupsSecret:
    # configSecret:
    # internalUsersSecret: internal-users-config-secret
    # rolesSecret:
    # rolesMappingSecret:
    # tenantsSecret:
    # config:
    #   securityConfigSecret: ""
    #   dataComplete: true
    #   data: {}
  replicas: "3" # optional, default is 3
#--------------------------------------------------------------------------------------------------------------------------------
###Values for Prometheus deployment###
prometheusValues:
  namespace: kubeops # optional, default is kubeops
  privateRegistry: false # optional, default is false
  grafanaUsername: "user" # optional, default is user
  grafanaPassword: "password" # optional, default is password
  grafanaResources:
    storageClass: "rook-cephfs" # optional, default is rook-cephfs
    storage: 5Gi # optional, default is 5Gi
    nodePort: 30211 # optional, default is 30211

  prometheusResources:
    storageClass: "rook-cephfs" # optional, default is rook-cephfs
    storage: 25Gi # optional, default is 25Gi
    retention: 10d # optional, default is 10d
    retentionSize: "24GB" # optional, default is 24GB
    nodePort: 32090
#--------------------------------------------------------------------------------------------------------------------------------
###Values for OPA deployment###
opaValues:
  namespace: kubeops

#--------------------------------------------------------------------------------------------------------------------------------
###Values for Headlamp deployment###
headlampValues:
  service:
    nodePort: 30007
#--------------------------------------------------------------------------------------------------------------------------------
###Values for cert-manager deployment###
certmanValues:
  namespace: kubeops
  replicaCount: 3
  logLevel: 2
#--------------------------------------------------------------------------------------------------------------------------------
###Values for ingress-nginx deployment###
ingressValues:
  namespace: kubeops
keycloakValues:
  namespace: "kubeops" # Optional, default is "keycloak"
  storageClass: "rook-cephfs" # Optional, default is "rook-cephfs"
  keycloak:
    auth:
      adminUser: admin # Optional, default is admin
      adminPassword: admin # Optional, default is admin
      existingSecret: "" # Optional, default is ""
  postgresql:
    auth:
      postgresPassword: "" # Optional, default is ""
      username: bn_keycloak # Optional, default is "bn_keycloak"
      password: "" # Optional, default is ""
      database: bitnami_keycloak # Optional, default is "bitnami_keycloak"
      existingSecret: "" # Optional, default is ""