<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Daniel Cardozo</title><link>/de/posts/</link><description>Recent content on Daniel Cardozo</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright>&lt;a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank" rel="noopener"&gt;cc by-nc 4.0&lt;/a&gt;</copyright><lastBuildDate>Fri, 10 May 2024 10:00:00 +0100</lastBuildDate><atom:link href="/de/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Helm-Templates im Detail</title><link>/de/posts/helm-templates/</link><pubDate>Fri, 10 May 2024 10:00:00 +0100</pubDate><guid>/de/posts/helm-templates/</guid><description>&lt;h2 id="einführung"&gt;Einführung&lt;/h2&gt;
&lt;p&gt;Helm-Templates sind Kubernetes-Manifeste, die mit der Go-Templatesprache &lt;code&gt;text/template&lt;/code&gt; angereichert wurden. Sie befinden sich im Verzeichnis &lt;code&gt;templates/&lt;/code&gt; Ihres Charts und werden von Helm mithilfe der Werte aus &lt;code&gt;values.yaml&lt;/code&gt; und benutzerseitiger Überschreibungen gerendert. Sie zu verstehen ist der Schlüssel zu wartbaren und wiederverwendbaren Charts.&lt;/p&gt;
&lt;h2 id="template-grundlagen"&gt;Template-Grundlagen&lt;/h2&gt;
&lt;p&gt;Ein minimales Deployment-Template:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apiVersion&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;apps/v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Deployment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: {{ &lt;span style="color:#ae81ff"&gt;.Release.Name }}-app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;: {{ &lt;span style="color:#ae81ff"&gt;.Chart.Name }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;replicas&lt;/span&gt;: {{ &lt;span style="color:#ae81ff"&gt;.Values.replicaCount }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;selector&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;matchLabels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;: {{ &lt;span style="color:#ae81ff"&gt;.Chart.Name }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;template&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;: {{ &lt;span style="color:#ae81ff"&gt;.Chart.Name }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;containers&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: {{ &lt;span style="color:#ae81ff"&gt;.Chart.Name }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ .Values.image.repository }}:{{ .Values.image.tag }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="eingebaute-objekte"&gt;Eingebaute Objekte&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Objekt&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.Release&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Aktuelle Release-Informationen: &lt;code&gt;.Release.Name&lt;/code&gt;, &lt;code&gt;.Release.Namespace&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.Chart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inhalt von &lt;code&gt;Chart.yaml&lt;/code&gt;: &lt;code&gt;.Chart.Name&lt;/code&gt;, &lt;code&gt;.Chart.Version&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.Values&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Zusammengeführte Werte aus &lt;code&gt;values.yaml&lt;/code&gt; und Benutzerüberschreibungen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.Files&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Zugriff auf nicht-Template-Dateien im Chart&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="template-funktionen"&gt;Template-Funktionen&lt;/h2&gt;
&lt;p&gt;Helm enthält die Go-Sprig-Bibliothek mit über 60 Hilfsfunktionen:&lt;/p&gt;</description><content type="html"><![CDATA[<h2 id="einführung">Einführung</h2>
<p>Helm-Templates sind Kubernetes-Manifeste, die mit der Go-Templatesprache <code>text/template</code> angereichert wurden. Sie befinden sich im Verzeichnis <code>templates/</code> Ihres Charts und werden von Helm mithilfe der Werte aus <code>values.yaml</code> und benutzerseitiger Überschreibungen gerendert. Sie zu verstehen ist der Schlüssel zu wartbaren und wiederverwendbaren Charts.</p>
<h2 id="template-grundlagen">Template-Grundlagen</h2>
<p>Ein minimales Deployment-Template:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">apps/v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">Deployment</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: {{ <span style="color:#ae81ff">.Release.Name }}-app</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">labels</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">app</span>: {{ <span style="color:#ae81ff">.Chart.Name }}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">replicas</span>: {{ <span style="color:#ae81ff">.Values.replicaCount }}</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">selector</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">app</span>: {{ <span style="color:#ae81ff">.Chart.Name }}</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">template</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">labels</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">app</span>: {{ <span style="color:#ae81ff">.Chart.Name }}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">containers</span>:
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">name</span>: {{ <span style="color:#ae81ff">.Chart.Name }}</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">image</span>: <span style="color:#e6db74">&#34;{{ .Values.image.repository }}:{{ .Values.image.tag }}&#34;</span>
</span></span></code></pre></div><h2 id="eingebaute-objekte">Eingebaute Objekte</h2>
<table>
	<thead>
			<tr>
					<th>Objekt</th>
					<th>Beschreibung</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>.Release</code></td>
					<td>Aktuelle Release-Informationen: <code>.Release.Name</code>, <code>.Release.Namespace</code></td>
			</tr>
			<tr>
					<td><code>.Chart</code></td>
					<td>Inhalt von <code>Chart.yaml</code>: <code>.Chart.Name</code>, <code>.Chart.Version</code></td>
			</tr>
			<tr>
					<td><code>.Values</code></td>
					<td>Zusammengeführte Werte aus <code>values.yaml</code> und Benutzerüberschreibungen</td>
			</tr>
			<tr>
					<td><code>.Files</code></td>
					<td>Zugriff auf nicht-Template-Dateien im Chart</td>
			</tr>
	</tbody>
</table>
<h2 id="template-funktionen">Template-Funktionen</h2>
<p>Helm enthält die Go-Sprig-Bibliothek mit über 60 Hilfsfunktionen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#75715e"># Standardwert wenn leer</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">image</span>: {{ <span style="color:#ae81ff">.Values.image | default &#34;nginx:latest&#34; }}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># String sicher in Anführungszeichen setzen</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">annotation</span>: {{ <span style="color:#ae81ff">.Values.description | quote }}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># In Großbuchstaben umwandeln</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">name</span>: {{ <span style="color:#ae81ff">.Values.name | upper }}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Strings formatieren</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">fullname</span>: {{ <span style="color:#ae81ff">printf &#34;%s-%s&#34; .Release.Name .Chart.Name }}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Mehrzeiligen Block einrücken (entscheidend für verschachteltes YAML)</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">resources</span>:
</span></span><span style="display:flex;"><span>  {{- <span style="color:#ae81ff">toYaml .Values.resources | nindent 2 }}</span>
</span></span></code></pre></div><h2 id="bedingungen">Bedingungen</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  {{- <span style="color:#ae81ff">if .Values.resources }}</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">resources</span>:
</span></span><span style="display:flex;"><span>    {{- <span style="color:#ae81ff">toYaml .Values.resources | nindent 4 }}</span>
</span></span><span style="display:flex;"><span>  {{- <span style="color:#ae81ff">end }}</span>
</span></span><span style="display:flex;"><span>  {{- <span style="color:#ae81ff">if .Values.nodeSelector }}</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">nodeSelector</span>:
</span></span><span style="display:flex;"><span>    {{- <span style="color:#ae81ff">toYaml .Values.nodeSelector | nindent 4 }}</span>
</span></span><span style="display:flex;"><span>  {{- <span style="color:#ae81ff">else }}</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">nodeSelector</span>: {}
</span></span><span style="display:flex;"><span>  {{- <span style="color:#ae81ff">end }}</span>
</span></span></code></pre></div><p>Das <code>-</code> in <code>{{-</code> entfernt führende Leerzeichen; <code>-}}</code> entfernt nachfolgende Leerzeichen. Das ist entscheidend für saubere YAML-Ausgabe.</p>
<h2 id="schleifen-mit-range">Schleifen mit range</h2>
<p>Über eine Liste iterieren:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">env</span>:
</span></span><span style="display:flex;"><span>{{- <span style="color:#ae81ff">range .Values.envVars }}</span>
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">name</span>: {{ <span style="color:#ae81ff">.name }}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">value</span>: {{ <span style="color:#ae81ff">.value | quote }}</span>
</span></span><span style="display:flex;"><span>{{- <span style="color:#ae81ff">end }}</span>
</span></span></code></pre></div><p>Über eine Map iterieren:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">annotations</span>:
</span></span><span style="display:flex;"><span>{{- <span style="color:#ae81ff">range $key, $val := .Values.annotations }}</span>
</span></span><span style="display:flex;"><span>  {{ <span style="color:#f92672">$key }}</span>: {{ <span style="color:#ae81ff">$val | quote }}</span>
</span></span><span style="display:flex;"><span>{{- <span style="color:#ae81ff">end }}</span>
</span></span></code></pre></div><h2 id="benannte-templates">Benannte Templates</h2>
<p>Benannte Templates vermeiden Wiederholungen über Dateien hinweg. Üblicherweise leben sie in <code>_helpers.tpl</code> (das <code>_</code>-Präfix verhindert, dass Helm die Datei als Manifest rendert):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>{{<span style="color:#ae81ff">/* _helpers.tpl */}}</span>
</span></span><span style="display:flex;"><span>{{- <span style="color:#ae81ff">define &#34;myapp.labels&#34; -}}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">helm.sh/chart</span>: {{ <span style="color:#ae81ff">.Chart.Name }}-{{ .Chart.Version }}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">app.kubernetes.io/name</span>: {{ <span style="color:#ae81ff">.Chart.Name }}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">app.kubernetes.io/instance</span>: {{ <span style="color:#ae81ff">.Release.Name }}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">app.kubernetes.io/managed-by</span>: {{ <span style="color:#ae81ff">.Release.Service }}</span>
</span></span><span style="display:flex;"><span>{{- <span style="color:#ae81ff">end }}</span>
</span></span></code></pre></div><p>In anderen Templates mit <code>include</code> verwenden:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">labels</span>:
</span></span><span style="display:flex;"><span>    {{- <span style="color:#ae81ff">include &#34;myapp.labels&#34; . | nindent 4 }}</span>
</span></span></code></pre></div><blockquote>
<p>Bevorzugen Sie immer <code>include</code> gegenüber der eingebauten <code>template</code>-Aktion, da <code>include</code> einen String zurückgibt, der an Funktionen wie <code>nindent</code> weitergeleitet werden kann.</p>
</blockquote>
<h2 id="templates-debuggen">Templates debuggen</h2>
<p>Templates lokal rendern ohne Deployment im Cluster:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Alle Templates rendern</span>
</span></span><span style="display:flex;"><span>helm template my-release ./my-chart
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Mit benutzerdefinierten Werten rendern</span>
</span></span><span style="display:flex;"><span>helm template my-release ./my-chart -f custom-values.yaml
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Validieren und linten</span>
</span></span><span style="display:flex;"><span>helm lint ./my-chart
</span></span></code></pre></div><p>Um ein gerendertes Objekt während der Entwicklung zu inspizieren, können Sie es temporär als YAML ausgeben:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>{{- <span style="color:#ae81ff">toYaml .Values | nindent 0 }}</span>
</span></span></code></pre></div><hr>
<p>Wenn Sie mich unterstützen möchten, <a href="https://www.buymeacoffee.com/danieljcardozo"><strong>kaufen Sie mir einen Kaffee</strong></a>.</p>
]]></content></item><item><title>Helm-Tutorial: Kubernetes-Anwendungen verwalten</title><link>/de/posts/helm-tutorial/</link><pubDate>Wed, 20 Mar 2024 10:00:00 +0100</pubDate><guid>/de/posts/helm-tutorial/</guid><description>&lt;h2 id="was-ist-helm"&gt;Was ist Helm?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Helm&lt;/strong&gt; ist der Paketmanager für Kubernetes. Er ermöglicht es, komplexe Kubernetes-Anwendungen mithilfe wiederverwendbarer Pakete, sogenannter &lt;strong&gt;Charts&lt;/strong&gt;, zu definieren, zu installieren und zu aktualisieren. Stellen Sie sich Helm als &lt;code&gt;apt&lt;/code&gt; oder &lt;code&gt;brew&lt;/code&gt; für Kubernetes vor.&lt;/p&gt;
&lt;h2 id="schlüsselkonzepte"&gt;Schlüsselkonzepte&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Begriff&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chart&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Paket mit allen Kubernetes-Ressourcendefinitionen einer Anwendung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Release&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Eine laufende Instanz eines im Cluster installierten Charts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Repository&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ort, an dem Charts gespeichert und geteilt werden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Values&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Konfigurationsparameter, die ein Chart zur Installationszeit anpassen&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# macOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install helm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Installation überprüfen:&lt;/p&gt;</description><content type="html"><![CDATA[<h2 id="was-ist-helm">Was ist Helm?</h2>
<p><strong>Helm</strong> ist der Paketmanager für Kubernetes. Er ermöglicht es, komplexe Kubernetes-Anwendungen mithilfe wiederverwendbarer Pakete, sogenannter <strong>Charts</strong>, zu definieren, zu installieren und zu aktualisieren. Stellen Sie sich Helm als <code>apt</code> oder <code>brew</code> für Kubernetes vor.</p>
<h2 id="schlüsselkonzepte">Schlüsselkonzepte</h2>
<table>
	<thead>
			<tr>
					<th>Begriff</th>
					<th>Beschreibung</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Chart</strong></td>
					<td>Paket mit allen Kubernetes-Ressourcendefinitionen einer Anwendung</td>
			</tr>
			<tr>
					<td><strong>Release</strong></td>
					<td>Eine laufende Instanz eines im Cluster installierten Charts</td>
			</tr>
			<tr>
					<td><strong>Repository</strong></td>
					<td>Ort, an dem Charts gespeichert und geteilt werden</td>
			</tr>
			<tr>
					<td><strong>Values</strong></td>
					<td>Konfigurationsparameter, die ein Chart zur Installationszeit anpassen</td>
			</tr>
	</tbody>
</table>
<h2 id="installation">Installation</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># macOS</span>
</span></span><span style="display:flex;"><span>brew install helm
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Linux</span>
</span></span><span style="display:flex;"><span>curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
</span></span></code></pre></div><p>Installation überprüfen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm version
</span></span></code></pre></div><h2 id="ein-chart-repository-hinzufügen">Ein Chart-Repository hinzufügen</h2>
<p>Fügen Sie das Bitnami-Repository hinzu – eine der beliebtesten Quellen für produktionsreife Charts:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm repo add bitnami https://charts.bitnami.com/bitnami
</span></span><span style="display:flex;"><span>helm repo update
</span></span></code></pre></div><p>Verfügbare Charts suchen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm search repo nginx
</span></span></code></pre></div><h2 id="ein-chart-installieren">Ein Chart installieren</h2>
<p>NGINX von Bitnami installieren:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm install my-nginx bitnami/nginx
</span></span></code></pre></div><p>Das Format lautet <code>helm install &lt;release-name&gt; &lt;repo/chart&gt;</code>. Helm erstellt alle erforderlichen Kubernetes-Ressourcen und verfolgt den Release-Zustand.</p>
<p>Laufende Releases auflisten:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm list
</span></span></code></pre></div><h2 id="mit-values-anpassen">Mit Values anpassen</h2>
<p>Jedes Chart bietet konfigurierbare Werte. Standardwerte anzeigen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm show values bitnami/nginx
</span></span></code></pre></div><p>Werte bei der Installation mit <code>--set</code> oder einer Values-Datei überschreiben:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Direktes Überschreiben</span>
</span></span><span style="display:flex;"><span>helm install my-nginx bitnami/nginx --set replicaCount<span style="color:#f92672">=</span><span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Dateibasiertes Überschreiben</span>
</span></span><span style="display:flex;"><span>helm install my-nginx bitnami/nginx -f custom-values.yaml
</span></span></code></pre></div><p>Beispiel <code>custom-values.yaml</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">replicaCount</span>: <span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">service</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">type</span>: <span style="color:#ae81ff">ClusterIP</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">resources</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">requests</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">cpu</span>: <span style="color:#ae81ff">100m</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">memory</span>: <span style="color:#ae81ff">128Mi</span>
</span></span></code></pre></div><h2 id="einen-release-aktualisieren">Einen Release aktualisieren</h2>
<p>Konfigurationsänderungen oder eine neue Chart-Version auf einen laufenden Release anwenden:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm upgrade my-nginx bitnami/nginx --set replicaCount<span style="color:#f92672">=</span><span style="color:#ae81ff">3</span>
</span></span></code></pre></div><p>Mit <code>--install</code> wird installiert, falls noch nicht vorhanden (Upsert-Muster):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm upgrade --install my-nginx bitnami/nginx -f custom-values.yaml
</span></span></code></pre></div><h2 id="zurückrollen">Zurückrollen</h2>
<p>Bei Problemen können Sie zu einer früheren Revision zurückrollen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Revisionsverlauf anzeigen</span>
</span></span><span style="display:flex;"><span>helm history my-nginx
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Zu Revision 1 zurückrollen</span>
</span></span><span style="display:flex;"><span>helm rollback my-nginx <span style="color:#ae81ff">1</span>
</span></span></code></pre></div><h2 id="einen-release-deinstallieren">Einen Release deinstallieren</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm uninstall my-nginx
</span></span></code></pre></div><p>Dadurch werden alle mit dem Release verbundenen Kubernetes-Ressourcen entfernt. Fügen Sie <code>--keep-history</code> hinzu, wenn Sie den Release-Eintrag für Audits behalten möchten.</p>
<h2 id="ein-eigenes-chart-erstellen">Ein eigenes Chart erstellen</h2>
<p>Chart-Gerüst generieren:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm create my-app
</span></span></code></pre></div><p>Dies erzeugt das Standard-Verzeichnis-Layout:</p>
<pre tabindex="0"><code>my-app/
├── Chart.yaml        # Chart-Metadaten (Name, Version, Beschreibung)
├── values.yaml       # Standard-Konfigurationswerte
└── templates/        # Kubernetes-Manifest-Vorlagen
    ├── deployment.yaml
    ├── service.yaml
    └── _helpers.tpl  # Wiederverwendbare Template-Schnipsel
</code></pre><hr>
<p>Wenn Sie mich unterstützen möchten, <a href="https://www.buymeacoffee.com/danieljcardozo"><strong>kaufen Sie mir einen Kaffee</strong></a>.</p>
]]></content></item><item><title>Einstieg in ArgoCD</title><link>/de/posts/argocd-getting-started/</link><pubDate>Mon, 15 Jan 2024 10:00:00 +0100</pubDate><guid>/de/posts/argocd-getting-started/</guid><description>&lt;h2 id="was-ist-argocd"&gt;Was ist ArgoCD?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ArgoCD&lt;/strong&gt; ist ein deklaratives, GitOps-basiertes Continuous-Delivery-Tool für Kubernetes. Es automatisiert den Anwendungs-Deployment, indem es den in einem Git-Repository definierten Sollzustand kontinuierlich mit dem Kubernetes-Cluster synchronisiert – das Git-Repository wird zur einzigen Quelle der Wahrheit.&lt;/p&gt;
&lt;h2 id="voraussetzungen"&gt;Voraussetzungen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ein laufender Kubernetes-Cluster (oder &lt;a href="https://kind.sigs.k8s.io/"&gt;kind&lt;/a&gt; für lokale Tests)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubectl&lt;/code&gt; konfiguriert für den Cluster-Zugriff&lt;/li&gt;
&lt;li&gt;Ein Git-Repository mit Kubernetes-Manifesten&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="argocd-installieren"&gt;ArgoCD installieren&lt;/h2&gt;
&lt;p&gt;Erstellen Sie den ArgoCD-Namespace und wenden Sie das offizielle Installationsmanifest an:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl create namespace argocd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Warten Sie, bis alle Pods bereit sind:&lt;/p&gt;</description><content type="html"><![CDATA[<h2 id="was-ist-argocd">Was ist ArgoCD?</h2>
<p><strong>ArgoCD</strong> ist ein deklaratives, GitOps-basiertes Continuous-Delivery-Tool für Kubernetes. Es automatisiert den Anwendungs-Deployment, indem es den in einem Git-Repository definierten Sollzustand kontinuierlich mit dem Kubernetes-Cluster synchronisiert – das Git-Repository wird zur einzigen Quelle der Wahrheit.</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein laufender Kubernetes-Cluster (oder <a href="https://kind.sigs.k8s.io/">kind</a> für lokale Tests)</li>
<li><code>kubectl</code> konfiguriert für den Cluster-Zugriff</li>
<li>Ein Git-Repository mit Kubernetes-Manifesten</li>
</ul>
<h2 id="argocd-installieren">ArgoCD installieren</h2>
<p>Erstellen Sie den ArgoCD-Namespace und wenden Sie das offizielle Installationsmanifest an:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kubectl create namespace argocd
</span></span><span style="display:flex;"><span>kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
</span></span></code></pre></div><p>Warten Sie, bis alle Pods bereit sind:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kubectl wait --for<span style="color:#f92672">=</span>condition<span style="color:#f92672">=</span>Ready pod --all -n argocd --timeout<span style="color:#f92672">=</span>120s
</span></span></code></pre></div><h2 id="zugriff-auf-die-argocd-oberfläche">Zugriff auf die ArgoCD-Oberfläche</h2>
<p>Standardmäßig ist der ArgoCD-Server nicht extern erreichbar. Verwenden Sie Port-Forwarding für den lokalen Zugriff:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kubectl port-forward svc/argocd-server -n argocd 8080:443
</span></span></code></pre></div><p>Öffnen Sie <a href="https://localhost:8080">https://localhost:8080</a> in Ihrem Browser und rufen Sie das initiale Admin-Passwort ab:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kubectl -n argocd get secret argocd-initial-admin-secret <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -o jsonpath<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;{.data.password}&#34;</span> | base64 -d
</span></span></code></pre></div><p>Melden Sie sich mit dem Benutzer <code>admin</code> und dem abgerufenen Passwort an.</p>
<h2 id="argocd-cli-installieren">ArgoCD CLI installieren</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># macOS</span>
</span></span><span style="display:flex;"><span>brew install argocd
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Linux</span>
</span></span><span style="display:flex;"><span>curl -sSL -o argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
</span></span><span style="display:flex;"><span>chmod +x argocd <span style="color:#f92672">&amp;&amp;</span> sudo mv argocd /usr/local/bin/
</span></span></code></pre></div><p>CLI authentifizieren:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>argocd login localhost:8080 --username admin --password &lt;ihr-passwort&gt; --insecure
</span></span></code></pre></div><h2 id="erste-anwendung-deployen">Erste Anwendung deployen</h2>
<p>Erstellen Sie eine Anwendung, die auf das offizielle ArgoCD-Beispiel-Repository zeigt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>argocd app create guestbook <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --repo https://github.com/argoproj/argocd-example-apps.git <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --path guestbook <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --dest-server https://kubernetes.default.svc <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --dest-namespace default
</span></span></code></pre></div><p>Lösen Sie die erste Synchronisierung aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>argocd app sync guestbook
</span></span></code></pre></div><p>Status überprüfen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>argocd app get guestbook
</span></span></code></pre></div><h2 id="automatische-synchronisierung-aktivieren">Automatische Synchronisierung aktivieren</h2>
<p>Standardmäßig wendet ArgoCD Änderungen aus Git nicht automatisch an. Aktivieren Sie Auto-Sync mit Self-Healing, damit der Cluster immer den Repository-Zustand widerspiegelt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>argocd app set guestbook --sync-policy automated --self-heal --auto-prune
</span></span></code></pre></div><p>Mit <code>--auto-prune</code> werden Ressourcen, die aus Git entfernt wurden, auch aus dem Cluster gelöscht.</p>
<h2 id="argocd-aktualisieren">ArgoCD aktualisieren</h2>
<p>Wenden Sie das Installationsmanifest der Zielversion an:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kubectl apply -n argocd <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -f https://raw.githubusercontent.com/argoproj/argo-cd/&lt;neue-version&gt;/manifests/install.yaml
</span></span></code></pre></div><p>Die neueste Version finden Sie auf der <a href="https://github.com/argoproj/argo-cd/releases">Releases-Seite</a>. Wenden Sie nach einem Upgrade individuelle ConfigMaps (<code>argocd-cm</code>) erneut an, um Ihre Konfiguration beizubehalten.</p>
<hr>
<p>Wenn Sie mich unterstützen möchten, <a href="https://www.buymeacoffee.com/danieljcardozo"><strong>kaufen Sie mir einen Kaffee</strong></a>.</p>
]]></content></item><item><title>Telekom Speedport als Modem (Bridge-Modus) mit ASUS RT-AC86U nutzen</title><link>/de/posts/telekom-modem/</link><pubDate>Sun, 24 Jul 2022 16:45:08 +0000</pubDate><guid>/de/posts/telekom-modem/</guid><description>&lt;h2 id="einführung"&gt;Einführung&lt;/h2&gt;
&lt;p&gt;Vor Kurzem wechselte ich meinen Internetanbieter zu Telekom, da ich mit meinem vorherigen Anbieter Probleme hatte. Nach dem Wechsel und der ersten Begutachtung des Telekom Speedport Smart 4 waren die Konfigurationsmöglichkeiten vielversprechend – sogar WireGuard, Mesh-Netzwerk und vieles mehr war enthalten. Zunächst lief alles gut, bis ich merkwürdige Probleme feststellte: Auf Mobiltelefonen brach die Verbindung manchmal plötzlich ab, Videoanrufe funktionierten ebenfalls nicht – sie liefen ein paar Minuten und brachen dann zusammen.&lt;/p&gt;</description><content type="html"><![CDATA[<h2 id="einführung">Einführung</h2>
<p>Vor Kurzem wechselte ich meinen Internetanbieter zu Telekom, da ich mit meinem vorherigen Anbieter Probleme hatte. Nach dem Wechsel und der ersten Begutachtung des Telekom Speedport Smart 4 waren die Konfigurationsmöglichkeiten vielversprechend – sogar WireGuard, Mesh-Netzwerk und vieles mehr war enthalten. Zunächst lief alles gut, bis ich merkwürdige Probleme feststellte: Auf Mobiltelefonen brach die Verbindung manchmal plötzlich ab, Videoanrufe funktionierten ebenfalls nicht – sie liefen ein paar Minuten und brachen dann zusammen.</p>
<p>Nach der Fehlersuche schien es, als ob der Router schlicht nicht mit allen verbundenen Geräten zurechtkam. Ich hatte den Eindruck, dass Mobilverbindungen standardmäßig eingeschränkt wurden. Das alles war sehr seltsam, da ich zu Hause nicht besonders viele Geräte im Netzwerk habe.</p>
<p>Aufgrund all dieser Probleme entschied ich mich, meinen bewährten ASUS RT-AC86U Router zu verwenden. Hier erkläre ich, wie man den Speedport Smart 4 in den Bridge-Modus (DSL-Modem) versetzt und ihn mit dem ASUS Router zum Laufen bringt.</p>
<blockquote>
<p><strong>Hinweis</strong>: Der ASUS Router unterstützt keine Telefonie. Da ich kein Festnetztelefon nutze, ist das für mich nicht relevant.</p>
</blockquote>
<h2 id="telekom-verbindungseinstellungen">Telekom-Verbindungseinstellungen</h2>
<p>Stellen Sie vor der Aktivierung des Bridge-Modus sicher, dass Sie Ihre Telekom-Zugangsdaten zur Hand haben, um später Ihren ASUS Router damit zu konfigurieren.</p>
<p>Der Benutzername setzt sich aus <code>Anschlußkennung</code>, <code>Zugangsnummer</code> und <code>Mitbenutzer</code> zusammen, zum Beispiel:</p>
<pre tabindex="0"><code>Anschlußkennung: 00112233445566
Zugangsnummer: 551122334455
Mitbenutzer: 0001

Benutzername: 001122334455665511223344550001@t-online.de
</code></pre><p>Falls Ihre <code>Zugangsnummer</code> nur 11 Stellen hat, fügen Sie ein <code>#</code>-Symbol ein:</p>
<pre tabindex="0"><code>Anschlußkennung: 00112233445566
Zugangsnummer: 55112233445
Mitbenutzer: 0001

Benutzername: 0011223344556655112233445#0001@t-online.de
</code></pre><h2 id="speedport-in-den-dsl-modus-versetzen">Speedport in den DSL-Modus versetzen</h2>
<p>Öffnen Sie die Speedport-Einstellungen und aktivieren Sie den DSL-Modem-Modus. Das Gerät fordert Sie auf, die aktuelle Konfiguration zu speichern, da der Router-Modus nur über einen Werksreset deaktiviert werden kann. Nach dem Speichern aktivieren Sie den DSL-Modus und warten, bis der Speedport neu gestartet ist.</p>
<h2 id="asus-router-konfigurieren">ASUS Router konfigurieren</h2>
<p>Wählen Sie <code>PPPoE</code> als Verbindungstyp und geben Sie Ihren Benutzernamen und Ihr Passwort ein. Damit die Verbindung funktioniert, muss die PPPoE-Verbindung mit <code>VLAN7</code> getaggt werden. Gehen Sie dazu zu <strong>LAN &gt; IPTV</strong> und wählen Sie unter <strong>ISP-Profil</strong> <code>Manuelle Einstellung</code>.</p>
<p>
    <img src="/telekom-asus/wan-settings.png"  alt="WAN-Einstellungen"  class="center"  style="border-radius: 8px;"  />



    <img src="/telekom-asus/iptv-settings.png"  alt="IPTV-Einstellungen"  class="center"  style="border-radius: 8px;"  />

</p>
<p>Übernehmen Sie die Änderungen und überprüfen Sie, ob Sie eine WAN-IP von Telekom erhalten haben.</p>
]]></content></item><item><title>Backups mit Velero erstellen</title><link>/de/posts/velero/</link><pubDate>Thu, 30 Jun 2022 19:46:08 +0000</pubDate><guid>/de/posts/velero/</guid><description>&lt;h2 id="einführung"&gt;Einführung&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Velero&lt;/strong&gt; ist ein Open-Source-Tool zur Erstellung von Backups Ihrer Kubernetes-Cluster – einschließlich Ihrer Kubernetes-Volumes! Velero funktioniert, indem es die &lt;code&gt;Kubernetes API&lt;/code&gt; nach den gewünschten Manifests fragt, ohne direkten Zugriff auf die &lt;code&gt;etcd&lt;/code&gt;-Datenbank zu benötigen. Das ist besonders nützlich bei verwalteten Kubernetes-Clustern wie &lt;code&gt;AWS&lt;/code&gt;, &lt;code&gt;GCP&lt;/code&gt; oder &lt;code&gt;Digital Ocean&lt;/code&gt;, bei denen kein direkter Zugang zu den Master-Nodes besteht.&lt;/p&gt;
&lt;img src="/velero/backup-process.png" alt="Velero Backup-Prozess" class="center" style="border-radius: 8px;" /&gt;
&lt;p&gt;Wie im Diagramm dargestellt, erstellt der Benutzer eine Velero-Backup-Ressource. Der auf dem Cluster installierte Velero-Controller fragt daraufhin die Kubernetes API ab und führt das Backup der gewünschten Ressourcen durch. Die Backup-Daten können dann in einen S3-Bucket oder einen anderen Backup-Speicherort hochgeladen werden.&lt;/p&gt;</description><content type="html"><![CDATA[<h2 id="einführung">Einführung</h2>
<p><strong>Velero</strong> ist ein Open-Source-Tool zur Erstellung von Backups Ihrer Kubernetes-Cluster – einschließlich Ihrer Kubernetes-Volumes! Velero funktioniert, indem es die <code>Kubernetes API</code> nach den gewünschten Manifests fragt, ohne direkten Zugriff auf die <code>etcd</code>-Datenbank zu benötigen. Das ist besonders nützlich bei verwalteten Kubernetes-Clustern wie <code>AWS</code>, <code>GCP</code> oder <code>Digital Ocean</code>, bei denen kein direkter Zugang zu den Master-Nodes besteht.</p>

    <img src="/velero/backup-process.png"  alt="Velero Backup-Prozess"  class="center"  style="border-radius: 8px;"  />


<p>Wie im Diagramm dargestellt, erstellt der Benutzer eine Velero-Backup-Ressource. Der auf dem Cluster installierte Velero-Controller fragt daraufhin die Kubernetes API ab und führt das Backup der gewünschten Ressourcen durch. Die Backup-Daten können dann in einen S3-Bucket oder einen anderen Backup-Speicherort hochgeladen werden.</p>
<p>Das Wiederherstellen aus einem Backup funktioniert ähnlich. Wenn der Benutzer eine Restore-Ressource erstellt, lädt der Velero-Controller die Backup-Daten herunter und stellt sie im Cluster wieder her. Velero führt eine <code>nicht-destruktive</code> Wiederherstellung durch – bestehende Ressourcen im Cluster werden nicht gelöscht, sondern übersprungen.</p>
<p>Mehr Informationen zur Funktionsweise von Velero finden Sie <a href="https://velero.io/docs/v1.9/how-velero-works/">hier</a>.</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<p>Vor der Nutzung von Velero benötigen wir:</p>
<ol>
<li>Einen eigenen Kubernetes-Cluster – für Testzwecke eignet sich <a href="https://kind.sigs.k8s.io/">Kind</a>.</li>
<li>Einen S3-Bucket zur Speicherung der Backups. Hier verwenden wir <a href="https://min.io/">MinIO</a>.</li>
<li>Den Velero-Client. Dies ist meiner Meinung nach der einfachste Weg, Backups mit Velero zu installieren, zu erstellen und wiederherzustellen.</li>
</ol>
<h3 id="minio">MinIO</h3>
<p>Dieses einfache <code>docker-compose</code>-Setup startet MinIO. Kopieren Sie die Datei und führen Sie <code>docker-compose up</code> aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#75715e"># docker-compose.yaml</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">version</span>: <span style="color:#e6db74">&#39;3&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">services</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">minio</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">quay.io/minio/minio:latest</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">command</span>: <span style="color:#ae81ff">server /data --console-address &#34;:9001&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MINIO_ROOT_USER=admin</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MINIO_ROOT_PASSWORD=password</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;9001:9001&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;9000:9000&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">/data</span>
</span></span></code></pre></div><p>Öffnen Sie <a href="http://localhost:9001">http://localhost:9001</a>, melden Sie sich mit <code>admin/password</code> an und erstellen Sie einen Bucket namens <code>velero-backups</code>.</p>
<h3 id="velero-client">Velero-Client</h3>
<p>Laden Sie die <a href="https://github.com/vmware-tanzu/velero/releases/latest">neueste Version</a> herunter und entpacken Sie sie:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>tar -xvf &lt;RELEASE-TARBALL-NAME&gt;.tar.gz
</span></span></code></pre></div><p>Verschieben Sie das <code>velero</code>-Binary in Ihren <code>bin</code>-Ordner (<code>/usr/local/bin</code>) oder fügen Sie es Ihrem <code>$PATH</code> hinzu.</p>
<h2 id="velero-im-cluster-installieren">Velero im Cluster installieren</h2>
<p>Die Standardinstallation von Velero erfordert einen Speicherort. Da wir MinIO verwenden, erstellen Sie zunächst eine Datei namens <code>credentials-velero</code> mit den MinIO-Zugangsdaten:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># credentials-velero</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>default<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>aws_access_key_id <span style="color:#f92672">=</span> admin
</span></span><span style="display:flex;"><span>aws_secret_access_key <span style="color:#f92672">=</span> password
</span></span></code></pre></div><blockquote>
<p><strong>HINWEIS:</strong> In der Cloud müssen Sie einen echten <code>accessKey</code> und <code>secretKey</code> mit den richtigen Berechtigungen verwenden. Je nach Cloud-Anbieter gibt es eine Liste unterstützter Provider <a href="https://velero.io/docs/v1.9/supported-providers/">hier</a>. Da MinIO mit AWS S3 kompatibel ist, verwenden wir das Velero-Plugin für AWS.</p>
</blockquote>
<p>Installieren Sie Velero mit Provider, Plugin, Secret-Datei und Backup-Speicherkonfiguration:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>velero install --provider aws --bucket velero-backups --plugins velero/velero-plugin-for-aws:v1.4.1 --secret-file ./credentials-velero --use-volume-snapshots<span style="color:#f92672">=</span>false --backup-location-config region<span style="color:#f92672">=</span>minio,s3ForcePathStyle<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;true&#34;</span>,s3Url<span style="color:#f92672">=</span>http://localhost:9000 --use-restic
</span></span></code></pre></div><p>Dadurch wird der Velero-Controller im Namespace <code>velero</code> installiert. In diesem Beispiel verwenden wir auch die <a href="https://velero.io/docs/v1.9/restic/">restic</a>-Integration, die Backups von Volumes ermöglicht.</p>
<blockquote>
<p><strong>TIPP:</strong> Velero kann auch Snapshots von Volumes erstellen, wenn ein unterstützter Cloud-Anbieter verwendet wird – in diesem Fall ist die restic-Integration nicht erforderlich.</p>
</blockquote>
<h2 id="ein-backup-erstellen">Ein Backup erstellen</h2>
<p>Mit dem Velero-Client können verschiedene Arten von Backups erstellt werden. Am schnellsten geht es mit Namespace-basierten Backups:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>velero backup create &lt;Backup-Name&gt; --include-namespaces &lt;namespace1,namespace2,...,namespaceN&gt;
</span></span></code></pre></div><p>Standardmäßig werden Volumes nicht gesichert. Dazu muss die Annotation <code>backup.velero.io/backup-volumes=&lt;volume-name&gt;</code> an den Pods hinzugefügt werden, an denen ein Volume eingehängt ist.</p>
<p>Beispiel: Ein RabbitMQ-Pod mit einem Volume:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">Pod</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">annotations</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">backup.velero.io/backup-volumes</span>: <span style="color:#ae81ff">persistence</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">labels</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">app.kubernetes.io/component</span>: <span style="color:#ae81ff">rabbitmq</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">rabbitmq-server-0</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">****</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">persistence</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">persistentVolumeClaim</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">claimName</span>: <span style="color:#ae81ff">persistence-rabbitmq-server-0</span>
</span></span></code></pre></div><p>In diesem Fall müsste die Annotation wie folgt gesetzt werden: <code>kubectl annotate pod rabbitmq-server-0 backup.velero.io/backup-volumes=persistence</code>.</p>
<h2 id="backup-zeitpläne">Backup-Zeitpläne</h2>
<p>Es ist auch möglich, wiederkehrende Backups über Zeitpläne einzurichten. Im folgenden Beispiel wird jeden Samstag um 23:00 Uhr ein Backup für bestimmte Namespaces erstellt, mit einer Aufbewahrungszeit von 21 Tagen. Backups, die älter als 21 Tage sind, werden automatisch aus dem Speicherort und der Backup-Liste im Cluster entfernt.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>velero schedule create sat-23uhr --schedule<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;0 23 * * 6&#34;</span> --ttl <span style="color:#e6db74">&#34;504h&#34;</span> --include-namespaces namespace1,namespace2,namespace3
</span></span></code></pre></div><p>Nach dem Einrichten des Zeitplans können Sie die erstellten Backups anzeigen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>velero backup get
</span></span></code></pre></div><p>Um Informationen zum erstellten Zeitplan abzurufen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>velero schedule get
</span></span></code></pre></div><h2 id="ein-backup-wiederherstellen">Ein Backup wiederherstellen</h2>
<p>So stellen Sie ein Backup wieder her:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>velero restore create --from-backup &lt;backup-name&gt;
</span></span></code></pre></div><p>Um vorhandene Backups aufzulisten:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>velero backups get
</span></span></code></pre></div><hr>
<p>Wenn Sie mich unterstützen möchten, <a href="https://www.buymeacoffee.com/danieljcardozo"><strong>kaufen Sie mir einen Kaffee</strong></a>.</p>
]]></content></item></channel></rss>