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 ""