Kubernetes-native Builds
Erste Schritte
Um das Kubernetes-Plugin in Jenkins zu aktivieren, setzen Sie einfach enable_kubernetes_agents in der dogu-Konfiguration auf "true".
Eine sinnvolle Standardkonfiguration wird automatisch bereitgestellt, kann aber an Ihre Bedürfnisse angepasst werden.
Um einen Namespace und eine Zugriffskontrolle für die Agenten einzurichten, kann die Komponente k8s-jenkins-agent-integration installiert werden. Deren Standardkonfiguration sollte auch für die gängigsten Szenarien funktionieren, hängt jedoch von Kyverno ab, um Agenten nur auf bestimmten Knoten zu planen. Wenn Sie Kyverno nicht installiert haben, möchten Sie diese Integration möglicherweise deaktivieren, siehe Konfigurationsoptionen der Komponente.
Verwendung
Eine kleine Beispiel-Pipeline könnte wie folgt aussehen:
podTemplate {
node(POD_LABEL) {
stage('Run shell') {
sh 'echo hello world'
}
}
}Weitere Informationen zur Verwendung finden Sie in der offiziellen Dokumentation.
Plugin-Konfiguration
Die folgenden Konfigurationsoptionen stehen zur Verfügung. Sie decken nicht alles ab, was mit dem Jenkins Kubernetes-Plugin möglich ist, aber die gängigsten Anwendungsfälle sollten möglich sein. Andere könnten möglich sein, wenn Sie Ihre eigene Cloud-Konfiguration erstellen.
enable_kubernetes_agents
Standard: "false"
Gibt an, ob die Kubernetes-Agenten-Integration aktiviert werden soll. Irrelevant, wenn Jenkins nicht auf Kubernetes läuft.
ecosystem_kubernetes_namespace
Standard: "ecosystem"
Kubernetes-Namespace, in dem diese Jenkins-Instanz bereitgestellt wird.
agent_kubernetes_namespace
Standard: "jenkins-ci"
Kubernetes-Namespace, in dem die Jenkins-Agenten bereitgestellt werden.
agent_kubernetes_pod_labels
Standard: "{\"cloudogu.com/pod-kind\": \"jenkins-ci\"}"
Labels, die den Agenten-Pods hinzugefügt werden sollen.
agent_kubernetes_restricted_pss_security_context
Standard: "false"
Gibt an, ob den Agenten-Pods ein Security Context hinzugefügt werden soll, der für die Verwendung des 'restricted' Pod Security Standards geeignet ist.
agent_kubernetes_docker_registry
Standard: ""
Docker-Registry, die für das Agenten-Image verwendet werden soll, falls keine angegeben ist.
agent_kubernetes_enable_garbage_collection
Standard: "false"
Wenn aktiviert, prüft Jenkins regelmäßig auf verwaiste Pods, die seit 300 Sekunden nicht mehr berührt wurden, und löscht diese.
Erstellen Sie Ihre eigene Cloud-Konfiguration
Wenn die bereitgestellten Einstellungen nicht Ihren Anforderungen entsprechen oder wenn Sie weitere Clouds hinzufügen möchten, ist es möglich, eigene hinzuzufügen.
Nennen Sie diese nur nicht kubernetes, da dies der Name ist, den unsere Integration verwendet.
Wenn Ihre Cloud Zugriff auf den lokalen Kubernetes-Cluster benötigt, wird ein jenkins ServiceAccount bereitgestellt und eingebunden.
Diesen können Sie verwenden, um die benötigten Rollen zu binden.
Rollen und RoleBindings für die enthaltene kubernetes Cloud werden bereits durch die oben genannte Komponente bereitgestellt.
Komponenten-Konfiguration
NetworkPolicies
global.networkPolicies.enabled
Standard: true
Ob NetworkPolicies überhaupt verwendet werden sollen. Normalerweise verwendet das Cloudogu EcoSystem NetworkPolicies, daher ist dies notwendig. Wenn Sie aus irgendeinem Grund keine NetworkPolicies wünschen oder benötigen, können diese hier deaktiviert werden.
global.networkPolicies.doguSelector
Standard:
matchLabels:
dogu.name: jenkinsDer Selektor, der für NetworkPolicies verwendet werden soll, um den Pod des Dogus auszuwählen. Normalerweise muss dies nicht angepasst werden.
global.networkPolicies.agentSelector
Standard:
matchLabels:
cloudogu.com/pod-kind: jenkins-ciDer Selektor, der für NetworkPolicies verwendet werden soll, um die Jenkins-Agenten-Pods auszuwählen. Dieser muss mit den für die Agenten-Pods gesetzten Labels in der Konfiguration des Dogus übereinstimmen.
Namespaces
namespaces.create
Standard: true
Gibt an, ob die in namespaces.names angegebenen Namespaces erstellt werden sollen.
namespaces.names
Standard: [jenkins-ci]
Liste der Namespaces, für die Ressourcen (NetworkPolicies, RBAC, ...) erstellt werden sollen.
RBAC
serviceAccount.name
Standard: jenkins
Der ServiceAccount, an den Rollen gebunden werden sollen. Da der ServiceAccount vom Jenkins-Dogu bereitgestellt wird, muss dies normalerweise nicht angepasst werden.
Builds auf bestimmte Knoten einschränken
Da ressourcenintensive Builds andere Workloads stören oder die Sicherheit beeinträchtigen könnten, möchten Sie Ihre Jenkins-Builds möglicherweise auf bestimmte Knoten ohne andere Workloads beschränken.
Es ist möglich, zu verhindern, dass andere Workloads auf einem Knoten geplant werden, indem man einen Taint setzt:
kubectl taint nodes <node-name> reserved-node=jenkins-ci:NoScheduleDies muss geschehen, bevor Workloads geplant werden. Wenn bereits Workloads darauf geplant sind, sollten Sie den Knoten leeren (drain).
Ggf. ist es sinnvoll, unseren Knoten zu labeln, um es einfacher zu machen, unseren Pods später eine Affinity dafür zu geben:
kubectl label node <node-name> reserved-node=jenkins-ciJenkins-Builds sind standardmäßig bereits mit cloudogu.com/pod-kind: jenkins-ci markiert, sodass sie leicht isoliert werden können.
Das Mutieren dieser Pods, um sie nur auf einem bestimmten Knoten auszuführen, wird üblicherweise mit einem Admission-Controller erreicht.
Wir könnten zwar einen eigenen implementieren, aber es stehen bereits mehrere Optionen zur Verfügung:
- PodNodeSelector ist ein integrierter Kubernetes Admission-Controller, der sich derzeit in der Alpha-Phase befindet. Seine Aktivierung ermöglicht es, einen Namespace zu annotieren, um Pods auf einem bestimmten Knoten auszuführen.
- Kyverno ist eine Policy-Engine und ein Admission-Controller, den Sie möglicherweise bereits installiert haben.
- Gatekeeper ist eine Alternative zu Kyverno.
Kyverno- und Gatekeeper-Policies sind bereits Teil der k8s-jenkins-agent-integration Komponente und können einzeln aktiviert oder deaktiviert werden.
policies.kyverno.enabled
Standard: true
Ob die Kyverno ClusterPolicy angewendet werden soll, um Agenten-Pods bestimmten Knoten zuzuweisen.
policies.gatekeeper.enabled
Standard: false
Ob die Gatekeeper Assign-Policies angewendet werden sollen, um Agenten-Pods bestimmten Knoten zuzuweisen.
Pod-Matching
policies.matchPods.namespaces.enabled
Standard: true
Gibt an, ob Pods aus den in namespaces.names angegebenen Namespaces abgeglichen werden sollen.
policies.matchPods.labelSelector.enabled
Standard: false
Gibt an, ob Pods über ihre Labels abgeglichen werden sollen.
policies.matchPods.labelSelector.matchLabels
Standard:
cloudogu.com/pod-kind: jenkins-ciLabels, mit denen die Pods abgeglichen werden sollen.
policies.matchPods.namespaceSelector.enabled
Standard: false
Gibt an, ob Namespaces über ihre Labels abgeglichen werden sollen.
policies.matchPods.namespaceSelector.matchLabels
Standard:
kubernetes.io/metadata.name: jenkins-ciLabels, mit denen die Namespaces abgeglichen werden sollen.
policies.affinity
Standard:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: reserved-node
operator: In
values:
- jenkins-ciAffinity, die in den Agenten-Pods gesetzt werden soll.
policies.tolerations
Standard:
- key: reserved-node
operator: Equal
value: jenkins-ci
effect: NoScheduleTolerations, die in den Agenten-Pods gesetzt werden soll.