<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.alpinelinux.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rtyler</id>
	<title>Alpine Linux - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.alpinelinux.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rtyler"/>
	<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/wiki/Special:Contributions/Rtyler"/>
	<updated>2026-05-03T09:36:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=K8s&amp;diff=26674</id>
		<title>K8s</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=K8s&amp;diff=26674"/>
		<updated>2024-05-04T01:00:46Z</updated>

		<summary type="html">&lt;p&gt;Rtyler: update for new versions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Alpine Linux &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;evergreen_tree&amp;quot;&amp;gt;🌲&amp;lt;/span&amp;gt; K8s in 10 Minutes =&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
This guide will allow you to deploy a fresh Alpine Linux install into a Kubernetes K8 cluster in less than 10 minutes.&lt;br /&gt;
&lt;br /&gt;
== Why &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;sparkles&amp;quot;&amp;gt;✨&amp;lt;/span&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
I went to learn Kubernetes recently and I built a k3 cluster using Alpine in an hour or so, it was a great experience. I figured the next step would be K8s, but I found no material on K8s for Alpine. This guide is the result of my first pass and the incorporations of high quality notes from the contributers. Kubernetes &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;unicorn&amp;quot;&amp;gt;🦄&amp;lt;/span&amp;gt; is awesome.&lt;br /&gt;
&lt;br /&gt;
== Contributers ==&lt;br /&gt;
&lt;br /&gt;
* Matthew Rogers [https://github.com/RamboRogers Github] [https://www.linkedin.com/in/matthewrogerscissp/ LinkedIn]&lt;br /&gt;
* Mike Zolla [https://github.com/Zolla-Zolla Github] [https://www.linkedin.com/in/mike-zolla-5903b8/ LinkedIn]&lt;br /&gt;
* Matthew Emmett [https://github.com/mattemmett Github] [https://www.linkedin.com/in/mattemmett/ LinkedIn]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
= Build K8s on Alpine Linux &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;evergreen_tree&amp;quot;&amp;gt;🌲&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;mag&amp;quot;&amp;gt;🔍&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
You need an [https://alpinelinux.org/ Alpine Linux] install (this guide is written against version 3.17 standard image) with internet access. I recommend at least 2 CPU with 4GB of ram and 10GB of disk for each node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;For HA control planes you&#039;ll need a mininum of three nodes&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 1. Setup the Repositories &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;green_book&amp;quot;&amp;gt;📗&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Update you repositories under {{Path|/etc/apk/repositories}} to include &#039;&#039;&#039;community&#039;&#039;&#039;, &#039;&#039;&#039;edge community&#039;&#039;&#039; and &#039;&#039;&#039;testing&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{{Cat|/etc/apk/repositories|#/media/cdrom/apks&lt;br /&gt;
http://dl-cdn.alpinelinux.org/alpine/v3.17/main&lt;br /&gt;
http://dl-cdn.alpinelinux.org/alpine/v3.17/community&lt;br /&gt;
#http://dl-cdn.alpinelinux.org/alpine/edge/main&lt;br /&gt;
http://dl-cdn.alpinelinux.org/alpine/edge/community&lt;br /&gt;
http://dl-cdn.alpinelinux.org/alpine/edge/testing}}&lt;br /&gt;
&lt;br /&gt;
=== 2. Node Setup &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;desktop_computer&amp;quot;&amp;gt;🖥️&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
This series of commands solves a series is incremental problems and sets up the system (if the first control node) for kubectl/kubeadm to run properly on next login by linking the config.&lt;br /&gt;
&lt;br /&gt;
The result here gives you a functional node that can be joined to an existing cluster or can become the first control plane of a new cluster. &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;notes&amp;quot;&amp;gt;🎶&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&amp;lt;span class{{=}}&amp;quot;emoji&amp;quot; data-emoji{{=}}&amp;quot;bell&amp;quot;&amp;gt;🔔&amp;lt;/span&amp;gt; This build assumes CNI usage of flannel for networking &amp;lt;span class{{=}}&amp;quot;emoji&amp;quot; data-emoji{{=}}&amp;quot;bell&amp;quot;&amp;gt;🔔&amp;lt;/span&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Add kernel module for networking stuff&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# echo &amp;quot;br_netfilter&amp;quot; &amp;gt; /etc/modules-load.d/k8s.conf&lt;br /&gt;
&amp;amp;#35; modprobe br_netfilter&lt;br /&gt;
&amp;amp;#35; sysctl net.ipv4.ip_forward{{=}}1&lt;br /&gt;
&amp;amp;#35; echo &amp;quot;net.ipv4.ip_forward{{=}}1&amp;quot; &amp;gt;&amp;gt; /etc/sysctl.conf&lt;br /&gt;
&amp;amp;#35; apk add {{Pkg|cni-plugin-flannel}}&lt;br /&gt;
&amp;amp;#35; apk add {{Pkg|cni-plugins}}&lt;br /&gt;
&amp;amp;#35; apk add {{Pkg|flannel}}&lt;br /&gt;
&amp;amp;#35; apk add {{Pkg|flannel-contrib-cni}}&lt;br /&gt;
&amp;amp;#35; apk add {{Pkg|kubelet}}&lt;br /&gt;
&amp;amp;#35; apk add {{Pkg|kubeadm}}&lt;br /&gt;
&amp;amp;#35; apk add {{Pkg|kubectl}}&lt;br /&gt;
&amp;amp;#35; apk add {{Pkg|containerd}}&lt;br /&gt;
&amp;amp;#35; apk add {{Pkg|uuidgen}}&lt;br /&gt;
&amp;amp;#35; apk add {{Pkg|nfs-utils}}}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Get rid of swap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# cat /etc/fstab | grep -v swap &amp;gt; temp.fstab&lt;br /&gt;
&amp;amp;#35; cat temp.fstab &amp;gt; /etc/fstab&lt;br /&gt;
&amp;amp;#35; rm temp.fstab&lt;br /&gt;
&amp;amp;#35; swapoff -a}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fix prometheus errors&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# mount --make-rshared /&lt;br /&gt;
# echo &amp;quot;#!/bin/sh&amp;quot; &amp;gt; /etc/local.d/sharemetrics.start&lt;br /&gt;
# echo &amp;quot;mount --make-rshared /&amp;quot; &amp;gt;&amp;gt; /etc/local.d/sharemetrics.start&lt;br /&gt;
# chmod +x /etc/local.d/sharemetrics.start&lt;br /&gt;
# rc-update add local}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fix id error messages&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# uuidgen &amp;gt; /etc/machine-id}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Add services&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# rc-update add containerd&lt;br /&gt;
&amp;amp;#35; rc-update add kubelet}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sync time&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# rc-update add ntpd&lt;br /&gt;
&amp;amp;#35; rc-service ntpd start&lt;br /&gt;
&amp;amp;#35; rc-service containerd start}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fix flannel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;NOTE: This may no longer be necessary on newer versions of the flannel package&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# ln -s /usr/libexec/cni/flannel-amd64 /usr/libexec/cni/flannel}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kernel stuff&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# echo &amp;quot;net.bridge.bridge-nf-call-iptables{{=}}1&amp;quot; &amp;gt;&amp;gt; /etc/sysctl.conf&lt;br /&gt;
&amp;amp;#35; sysctl net.bridge.bridge-nf-call-iptables{{=}}1}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pin your versions!&#039;&#039;&#039;  If you update and the nodes get out of sync, it implodes.&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# apk add &#039;kubelet{{=}}~1.27&#039;&lt;br /&gt;
&amp;amp;#35; apk add &#039;kubeadm{{=}}~1.27&#039;&lt;br /&gt;
&amp;amp;#35; apk add &#039;kubectl{{=}}~1.27&#039;}}&lt;br /&gt;
&lt;br /&gt;
{{Note|In the future you will manually have to add a newer version the same way to upgrade.}}&lt;br /&gt;
&lt;br /&gt;
Your blank node is now ready! If it&#039;s the first, you&#039;ll want to make a control node.&lt;br /&gt;
&lt;br /&gt;
=== 3. Setup the Control Plane (New Cluster!) &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;mechanical_arm&amp;quot;&amp;gt;🦾&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Run this command to start the cluster and then apply a network.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#do not change subnet&lt;br /&gt;
kubeadm init --pod-network-cidr=10.244.0.0/16 --node-name=$(hostname)&lt;br /&gt;
mkdir ~/.kube&lt;br /&gt;
ln -s /etc/kubernetes/admin.conf /root/.kube/config&lt;br /&gt;
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You now have a control plane. This also gives you the command to run on our blank nodes to add them to this cluster as workers.&lt;br /&gt;
&lt;br /&gt;
=== 4. Join the cluster. &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;ant&amp;quot;&amp;gt;🐜&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Run this to get the join command from the control plane which you would then run on your new worker.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubeadm token create --print-join-command &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bonus &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;moneybag&amp;quot;&amp;gt;💰&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Setup NFS Mounts on K8s ==&lt;br /&gt;
&lt;br /&gt;
This can be shared NFS storage to allow for auto persistent claim fulfilment. You&#039;ll need your IP updated and export information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/&lt;br /&gt;
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \&lt;br /&gt;
    --set nfs.server=192.168.1.31 \&lt;br /&gt;
    --set nfs.path=/exports/cluster00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now set the default storage class for the cluster.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;kubectl get storageclass&lt;br /&gt;
kubectl patch storageclass nfs-client -p &#039;{&amp;amp;quot;metadata&amp;amp;quot;: {&amp;amp;quot;annotations&amp;amp;quot;:{&amp;amp;quot;storageclass.kubernetes.io/is-default-class&amp;amp;quot;:&amp;amp;quot;true&amp;amp;quot;}}}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Check on System &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;eyes&amp;quot;&amp;gt;👀&amp;lt;/span&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Check on your system.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get all&lt;br /&gt;
kubectl events -A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
= Cloud Bonus &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;cloud&amp;quot;&amp;gt;🌦️&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
A description of the cloud init version is avalable at [[K8s_with_cloud-init]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Virtualization]]&lt;/div&gt;</summary>
		<author><name>Rtyler</name></author>
	</entry>
</feed>