GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Einführung in die Verwaltung von Linux-Containern

Linux-Container gibt es schon seit einiger Zeit, sie wurden jedoch allgemein verfügbar, als sie 2008 im Linux-Kernel eingeführt wurden. Container sind leichtgewichtige, ausführbare Anwendungskomponenten, die App-Quellcode mit Betriebssystembibliotheken und Abhängigkeiten kombinieren, die erforderlich sind, um den Code in jeder Umgebung auszuführen. Darüber hinaus bieten sie Anwendungsverpackungs- und -bereitstellungstechnologien und nutzen gleichzeitig die Vorteile der Anwendungsisolierung mit der Flexibilität imagebasierter Bereitstellungsmethoden.

Linux-Container verwenden Kontrollgruppen für die Ressourcenverwaltung, Namespaces für die Isolierung von Systemprozessen und SELinux-Sicherheit, um eine sichere Tenancy zu ermöglichen und Sicherheitsbedrohungen oder Exploits zu reduzieren. Diese Technologien bieten eine Umgebung zum Erstellen, Ausführen, Verwalten und Orchestrieren von Containern.

Der Artikel ist ein einführender Leitfaden zu den Hauptelementen der Linux-Containerarchitektur, wie Container im Vergleich zu KVM-Virtualisierung, Image-basierten Containern, Docker-Containern und Container-Orchestrierungstools abschneiden.

Containerarchitektur

Ein Linux-Container verwendet wichtige Linux-Kernel-Elemente wie cgroups, SELinux und Namespaces. Namespaces gewährleisten die Isolierung von Systemprozessen, während cgroups (Kontrollgruppen), wie der Name schon sagt, zur Steuerung von Linux-Systemressourcen verwendet werden. SELinux wird verwendet, um die Trennung zwischen Host und Containern sowie zwischen einzelnen Containern sicherzustellen. Sie können SELinux einsetzen, um eine sichere Mandantenfähigkeit zu ermöglichen und das Potenzial für Sicherheitsbedrohungen und Exploits zu reduzieren. Nach dem Kernel haben wir die Verwaltungsschnittstelle, die mit anderen Komponenten interagiert, um Container zu entwickeln, zu verwalten und zu orchestrieren.

SELinux

Sicherheit ist eine kritische Komponente jedes Linux-Systems oder jeder Linux-Architektur. SELinux sollte die erste Verteidigungslinie für eine sichere Containerumgebung sein. SELinux ist eine Sicherheitsarchitektur für Linux-Systeme, die Systemadministratoren mehr Kontrolle über den Zugriff auf die Architektur Ihres Containers gibt. Sie können die Container des Hostsystems und andere Container voneinander isolieren.

Eine zuverlässige Containerumgebung erfordert, dass ein Systemadministrator maßgeschneiderte Sicherheitsrichtlinien erstellt. Linux-Systeme bieten verschiedene Tools wie Podman oder Udica zum Generieren von SELinux-Container-Richtlinien. Einige Containerrichtlinien steuern, wie Container auf Hostressourcen wie Speicherlaufwerke, Geräte und Netzwerktools zugreifen. Eine solche Richtlinie schützt Ihre Containerumgebung vor Sicherheitsbedrohungen und schafft eine Umgebung, die die Einhaltung gesetzlicher Vorschriften gewährleistet.

Die Architektur schafft eine sichere Trennung, die verhindert, dass Root-Prozesse innerhalb des Containers andere Dienste stören, die außerhalb eines Containers ausgeführt werden. Beispielsweise weist ein System einem Docker-Container automatisch einen SELinux-Kontext zu, der in der SELinux-Richtlinie angegeben ist. Infolgedessen scheint SELinux in einem Container immer deaktiviert zu sein, obwohl es auf dem Host-Betriebssystem oder -System im erzwingenden Modus ausgeführt wird.
Hinweis:Durch das Deaktivieren oder Ausführen von SELinux im zulässigen Modus auf einem Hostcomputer werden Container nicht sicher getrennt .

Namespaces

Kernel-Namespaces bieten Prozessisolation für Linux-Container. Sie ermöglichen die Erstellung einer Abstraktion von Systemressourcen, wobei jede als separate Instanz für Prozesse innerhalb eines Namensraums erscheint. Im Wesentlichen können Container Systemressourcen gleichzeitig verwenden, ohne Konflikte zu verursachen. Namespaces umfassen Netzwerk-, Mount-, UTS-Namespaces, IPC-Namespaces, PID-Namespaces.

  • Mount-Namespaces isolieren Dateisystem-Mount-Punkte, die für eine Gruppe von Prozessen verfügbar sind. Andere Dienste in einem anderen Mount-Namespace können alternative Ansichten der Dateisystemhierarchie haben. Beispielsweise kann jeder Container in Ihrer Umgebung sein eigenes /var-Verzeichnis haben.
  • UTS-Namensräume:Isolieren Sie die Knotennamen- und Domänennamensystem-IDs. Es erlaubt jedem Container, einen eindeutigen Hostnamen und NIS-Domänennamen zu haben.
  • Netzwerk-Namespaces schaffen Isolation von Netzwerkcontrollern, Firewalls und Routing-IP-Tabellen. Im Wesentlichen können Sie eine Containerumgebung entwerfen, um separate virtuelle Netzwerkstacks mit virtuellen oder physischen Geräten zu verwenden und ihnen sogar eindeutige IP-Adressen oder iptable-Regeln zuzuweisen.
  • PID-Namespaces ermöglichen es Systemprozessen in verschiedenen Containern, dieselbe PID zu verwenden. Im Wesentlichen kann jeder Container einen einzigartigen Init-Prozess haben, um den Lebenszyklus des Containers zu verwalten oder Systemaufgaben zu initialisieren. Jeder Container hat sein eigenes eindeutiges /proc-Verzeichnis, um Prozesse zu überwachen, die innerhalb des Containers ausgeführt werden. Beachten Sie, dass ein Container nur seine Prozesse/Dienste kennt und keine anderen Prozesse sehen kann, die in anderen Teilen des Linux-Systems ausgeführt werden. Ein Host-Betriebssystem erkennt jedoch Prozesse, die in einem Container ausgeführt werden.
  • IPC-Namespaces – Isolieren Sie System-Interprozess-Kommunikationsressourcen (System V, IPC-Objekte, POSIX-Nachrichtenwarteschlangen), damit verschiedene Container gemeinsam genutzte Speichersegmente mit demselben Namen erstellen können. Sie können jedoch nicht mit den Speichersegmenten oder dem gemeinsamen Speicher anderer Container interagieren.
  • Benutzernamensräume – ermöglicht einem Systemadministrator, Host-UIDs anzugeben, die einem Container zugeordnet sind. Beispielsweise kann ein Systemprozess Root-Privilegien innerhalb eines Containers haben, aber auf ähnliche Weise für Operationen außerhalb des Containers unprivilegiert sein.

Kontrollgruppen

Kernel-cgroups ermöglichen die Verwaltung von Systemressourcen zwischen verschiedenen Gruppen von Prozessen. Cgroups weisen benutzerdefinierten Aufgaben CPU-Zeit, Netzwerkbandbreite oder Systemspeicher zu.

Container vs. KVM-Virtualisierung

Sowohl Container- als auch KVM-Virtualisierungstechnologien haben Vor- und Nachteile, die den Anwendungsfall oder die bereitzustellende Umgebung bestimmen. Für den Anfang benötigen virtuelle KVM-Maschinen einen eigenen Kernel, während Container den Host-Kernel gemeinsam nutzen. Ein wesentlicher Vorteil von Containern besteht also darin, mehr Container als virtuelle Maschinen mit denselben Hardwareressourcen zu starten.

Linux-Container

Vorteile Nachteile
Entwickelt, um die Isolation von containerisierten Anwendungen zu verwalten. Container-Isolierung ist nicht auf derselben Ebene wie KVM-Virtualisierung.
Systemweite Hostkonfigurationen oder Änderungen sind in jedem Container sichtbar. Erhöhte Komplexität bei der Verwaltung von Containern.
Container sind leichtgewichtig und bieten eine schnellere Skalierbarkeit Ihrer Architektur. Erfordert umfangreiche Sysadmin-Kenntnisse bei der Verwaltung von Protokollen und persistenten Daten mit der richtigen Lese- und Schreibberechtigung.
Es ermöglicht die schnelle Erstellung und Verteilung von Anwendungen.
Es ermöglicht niedrigere Speicher- und Betriebskosten in Bezug auf die Entwicklung und Beschaffung von Container-Images.

Anwendungsbereiche:

  •  Anwendungsarchitektur, die umfassend skaliert werden muss.
  • Microservice-Architektur.
  • Lokale Anwendungsentwicklung.

KVM-Virtualisierung

Vorteile Nachteile
KVM ermöglicht das vollständige Booten von Betriebssystemen wie Linux, Unix, macOS und Windows. Erfordert umfangreiche Verwaltung der gesamten virtuellen Umgebung
Eine virtuelle Gastmaschine ist von den Hoständerungen und Systemkonfigurationen isoliert. Sie können verschiedene Versionen einer Anwendung auf dem Host und der virtuellen Maschine ausführen. Es kann länger dauern, eine neue virtuelle Umgebung einzurichten, selbst mit Automatisierungstools.
Das Ausführen separater Kernel bietet eine bessere Sicherheit und Trennung. Höhere Betriebskosten im Zusammenhang mit der virtuellen Maschine, Verwaltung und Anwendungsentwicklung
Eindeutige Zuordnung von Ressourcen.

Anwendungsbereiche:

  • Systemumgebungen, die klare dedizierte Ressourcen erfordern.
  • Systeme, die einen unabhängigen laufenden Kernel benötigen.

Bildbasierter Container

Image-basierte Container verpacken Anwendungen mit individuellen Laufzeitstapeln, wodurch bereitgestellte Container unabhängig vom Host-Betriebssystem werden. Im Wesentlichen können Sie mehrere Instanzen einer Anwendung ausführen, jede auf einer anderen Plattform. Um eine solche Architektur zu ermöglichen, müssen Sie den Container und die Anwendungslaufzeit als Image bereitstellen und ausführen.

Eine Systemarchitektur aus Image-basierten Containern ermöglicht es Ihnen, mehrere Instanzen einer Anwendung mit minimalem Overhead und Flexibilität zu hosten. Es ermöglicht die Portabilität von Containern, die nicht von hostspezifischen Konfigurationen abhängig sind. Images können ohne Container existieren. Ein Container muss jedoch ein Image ausführen, um zu existieren. Im Wesentlichen sind Container von Images abhängig, um eine Laufzeitumgebung zum Ausführen einer Anwendung zu erstellen.

Behälter

Ein Container wird basierend auf einem Image erstellt, das die erforderlichen Konfigurationsdaten enthält, um eine aktive Komponente zu erstellen, die als Anwendung ausgeführt wird. Beim Starten eines Containers wird eine beschreibbare Ebene über dem angegebenen Image erstellt, um Konfigurationsänderungen zu speichern.

Bild

Ein Image ist ein statischer Schnappschuss der Konfigurationsdaten eines Containers zu einem bestimmten Zeitpunkt. Es ist eine schreibgeschützte Schicht, in der Sie alle Konfigurationsänderungen in der obersten beschreibbaren Schicht definieren können. Sie können es nur speichern, indem Sie ein neues Bild erstellen. Jedes Bild hängt von einem oder mehreren übergeordneten Bildern ab.

Plattform-Bild

Ein Plattform-Image hat kein übergeordnetes Element. Stattdessen können Sie es verwenden, um die Laufzeitumgebung, Pakete und Dienstprogramme zu definieren, die zum Starten und Ausführen einer containerisierten Anwendung erforderlich sind. Um beispielsweise mit Docker-Containern zu arbeiten, ziehen Sie ein schreibgeschütztes Plattform-Image. Alle definierten Änderungen spiegeln sich in den kopierten Images wider, die über dem ursprünglichen Docker-Image gestapelt sind. Als Nächstes erstellt es eine Anwendungsschicht, die hinzugefügte Bibliotheken und Abhängigkeiten für die containerisierte Anwendung enthält.

Ein Container kann je nach Anzahl der in der Anwendungsschicht enthaltenen Pakete und Abhängigkeiten sehr groß oder klein sein. Darüber hinaus ist eine weitere Schichtung des Bildes mit unabhängiger Software von Drittanbietern und Abhängigkeiten möglich. Aus betrieblicher Sicht können sich also viele Schichten hinter einem Image befinden. Die Ebenen erscheinen einem Benutzer jedoch nur als ein Container.

Docker-Container

Docker ist eine containerisierte virtuelle Umgebung zum Entwickeln, Warten, Bereitstellen und Orchestrieren von Anwendungen und Diensten. Docker-Container bieten weniger Overhead bei der Konfiguration oder Einrichtung virtueller Umgebungen. Die Container haben keinen separaten Kernel und werden direkt vom Host-Betriebssystem ausgeführt. Es verwendet Namespaces und Kontrollgruppen, um die Ressourcen des Host-Betriebssystems effizient zu nutzen.

Eine Instanz eines Containers führt einen Prozess isoliert aus, ohne andere Anwendungen zu beeinträchtigen. Im Wesentlichen hat jede containerisierte Anwendung eindeutige Konfigurationsdateien.

Ein Docker-Dämon ermöglicht Containern das Zurückpingen und weist einer containerisierten Anwendung Ressourcen zu, je nachdem, wie viel sie ausführen muss. Im Gegensatz zu einem Linux-Container (LXC) ist ein Docker-Container auf die Bereitstellung einzelner containerisierter Anwendungen spezialisiert. Es läuft nativ unter Linux, unterstützt aber auch andere Betriebssysteme wie macOS und Windows.

Hauptvorteile von Docker-Containern

  • Portabilität:– Sie können eine containerisierte Anwendung in jedem anderen System bereitstellen, auf dem eine Docker-Engine ausgeführt wird, und Ihre Anwendung wird genau so funktionieren, wie Sie sie in Ihrer Entwicklungsumgebung getestet haben. Als Entwickler können Sie eine Docker-App getrost freigeben, ohne zusätzliche Pakete oder Software installieren zu müssen, unabhängig davon, welches Betriebssystem Ihre Teams verwenden. Docker geht Hand in Hand mit der Versionierung, und Sie können containerisierte Anwendungen einfach freigeben, ohne den Code zu beschädigen.
  • Container können überall und auf jedem unterstützten Betriebssystem wie Windows, VMs, macOS, Linux, On-Prem und in der Public Cloud ausgeführt werden. Die weit verbreitete Popularität von Docker-Images hat zu einer umfassenden Akzeptanz durch Cloud-Anbieter wie Amazon Web Services (AWS), Google Compute Platform (GCP) und Microsoft Azure geführt.
  • Leistung:– Container enthalten kein Betriebssystem, das viel weniger Platz benötigt als virtuelle Maschinen und im Allgemeinen schneller zu erstellen und zu starten sind.
  • Agilität:– Die Leistung und Portabilität von Containern ermöglichen es einem Team, einen agilen Entwicklungsprozess zu erstellen, der Strategien für kontinuierliche Integration und kontinuierliche Bereitstellung (CI/CD) verbessert, um die richtige Software zur richtigen Zeit bereitzustellen.
  • Isolation:– Ein Docker-Container mit einer Anwendung enthält auch die relevanten Versionen aller Abhängigkeiten und Software, die Ihre Anwendung benötigt. Docker-Container sind voneinander unabhängig, und andere Container/Anwendungen, die andere Versionen der angegebenen Software-Abhängigkeiten benötigen, können problemlos in derselben Architektur existieren. Beispielsweise stellt es sicher, dass eine Anwendung wie Docker MariaDB ihre Ressourcen nur verwendet, um eine konsistente Systemleistung aufrechtzuerhalten.
  • Skalierbarkeit:– Mit Docker können Sie bei Bedarf neue Container und Anwendungen erstellen.
  • Zusammenarbeit:– Der Prozess der Containerisierung in Docker ermöglicht es Ihnen, einen Anwendungsentwicklungsprozess zu segmentieren. Es ermöglicht Entwicklern, potenzielle Probleme schnell zu teilen, zusammenzuarbeiten und zu lösen, ohne dass eine massive Überarbeitung erforderlich ist, wodurch ein kostengünstiger und zeitsparender Entwicklungsprozess entsteht.

Container-Orchestrierung

Container-Orchestrierung ist der Prozess der Automatisierung von Bereitstellung, Bereitstellung, Verwaltung, Skalierung, Sicherheit, Lebenszyklus, Lastausgleich und Vernetzung von containerisierten Diensten und Arbeitslasten. Der Hauptvorteil der Orchestrierung ist die Automatisierung. Die Orchestrierung unterstützt einen DevOps- oder agilen Entwicklungsprozess, der es Teams ermöglicht, in iterativen Zyklen zu entwickeln und bereitzustellen und neue Funktionen schneller freizugeben. Beliebte Orchestrierungstools sind Kubernetes, Amazon ECR Docker Swarm und Apache Mesos.

Die Container-Orchestrierung umfasst im Wesentlichen einen dreistufigen Prozess, bei dem ein Entwickler eine (YAML- oder JSON-) Konfigurationsdatei schreibt, die einen Konfigurationsstatus definiert. Das Orchestrierungstool führt dann die Datei aus, um den gewünschten Systemstatus zu erreichen. Die YAML- oder JSON-Datei definiert normalerweise die folgenden Komponenten:

  • Die Container-Images, aus denen eine Anwendung besteht, und die Image-Registrierung.
  • Es stellt einen Container mit Ressourcen wie Speicherplatz bereit.
  • Drittens definiert es Netzwerkkonfigurationen zwischen Containern.
  • Es spezifiziert die Image-Versionierung.

Das Orchestrierungstool plant die Bereitstellung der Container oder Containerreplikate auf dem Host basierend auf der verfügbaren CPU-Kapazität, dem Arbeitsspeicher oder anderen Einschränkungen, die in der Konfigurationsdatei angegeben sind. Sobald Sie Container bereitgestellt haben, verwaltet das Orchestrierungstool den Lebenszyklus einer App basierend auf einer Containerdefinitionsdatei (Dockerfile). Beispielsweise können Sie ein Dockerfile verwenden, um die folgenden Aspekte zu verwalten:

  • Verwalten Sie Skalierbarkeit nach oben oder unten, Ressourcenzuweisung und Lastenausgleich.
  • Aufrechterhaltung der Verfügbarkeit und Leistung von Containern im Falle eines Ausfalls oder Mangels an Systemressourcen.
  • Erfassen und speichern Sie Protokolldaten, um den Zustand und die Leistung von Containeranwendungen zu überwachen.

Kubernetes

Kubernetes ist eine der beliebtesten Container-Orchestrierungsplattformen, die verwendet wird, um die Architektur und den Betrieb von Cloud-nativen Anwendungen zu definieren, damit sich Entwickler auf die Produktentwicklung, Programmierung und Innovation konzentrieren können. Mit Kubernetes können Sie Anwendungen erstellen, die sich über mehrere Container erstrecken, sie über einen Cluster hinweg planen, sie skalieren und ihren Zustand und ihre Leistung im Laufe der Zeit verwalten. Im Wesentlichen eliminiert es die manuellen Prozesse, die mit der Bereitstellung und Skalierung von containerisierten Anwendungen verbunden sind.

Schlüsselkomponenten von Kubernetes

  • Cluster:Eine Steuerungsebene mit einem oder mehreren Computern/Knoten.
  • Steuerungsebene:Eine Sammlung von Prozessen, die verschiedene Knoten steuert.
  • Kubelet:Es wird auf Knoten ausgeführt und stellt sicher, dass Container effektiv gestartet und ausgeführt werden können.
  • Pod:Eine Gruppe von Containern, die auf einem einzelnen Knoten bereitgestellt werden. Alle Container in einem Pod teilen sich eine IP-Adresse, einen Hostnamen, einen IPC und andere Ressourcen.

Kubernetes hat sich zum Industriestandard in der Container-Orchestrierung entwickelt. Es bietet umfangreiche Containerfunktionen, verfügt über eine dynamische Contributor-Community, ist in hohem Maße erweiterbar und portabel. Sie können es in einer Vielzahl von Umgebungen wie lokal, öffentlich oder in der Cloud ausführen und effektiv mit anderen Containertechnologien verwenden.

Abschluss

Container sind leichtgewichtige, ausführbare Anwendungskomponenten, die aus Quellcode, Betriebssystembibliotheken und Abhängigkeiten bestehen, die erforderlich sind, um den Code in jeder Umgebung auszuführen. Container wurden 2013 allgemein verfügbar, als die Docker-Plattform erstellt wurde. Infolgedessen finden Sie häufig Benutzer in der Linux-Community, die Docker-Container und Container synonym verwenden, um sich auf dasselbe zu beziehen.

Die Verwendung von Docker-Containern bietet mehrere Vorteile. Allerdings sind nicht alle Anwendungen für die Ausführung in Containern geeignet. Als Faustregel gilt, dass Anwendungen mit einer grafischen Benutzeroberfläche nicht für die Verwendung mit Docker geeignet sind. Daher sind containerisierte Microservices oder serverlose Architekturen für Cloud-native Anwendungen unerlässlich.

Der Artikel hat Ihnen eine Einführung in Container in Linux, Docker-Images und Container-Orchestrierungstools wie Kubernetes gegeben. Dieser Leitfaden baut auf der Arbeit mit Containern, Docker Engine und Kubernetes auf, wo ein Entwickler lernen kann, containerisierte Anwendungen zu entwickeln und zu teilen.


Linux
  1. Eine Einführung in Udev:Das Linux-Subsystem zum Verwalten von Geräteereignissen

  2. Eine Geschichte der Low-Level-Laufzeiten von Linux-Containern

  3. Einführung in Nmap unter Kali Linux

  4. Linux-Berechtigungen:Eine Einführung in chmod

  5. Einführung in den Alternativen-Befehl in Linux

Einführung in das Linux-Dateisystem

Eine Einführung in den Vivaldi-Browser unter Linux

Die Einführung eines Linux-Systemadministrators in cgroups

Eine Einführung in die Containerregistrierung von Quay

Erste Schritte mit Buildah zum Verwalten von Linux-Containern

So verwalten Sie Docker-Container