<?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=Thomas</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=Thomas"/>
	<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/wiki/Special:Contributions/Thomas"/>
	<updated>2026-04-30T05:16:04Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=K8s_with_cloud-init&amp;diff=26669</id>
		<title>K8s with cloud-init</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=K8s_with_cloud-init&amp;diff=26669"/>
		<updated>2024-05-02T07:08:52Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Alpine Linux 🌲 K8s in 1 Minute with the nocloud cloud-init image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Alpine Linux &amp;lt;span class=&amp;quot;emoji&amp;quot; data-emoji=&amp;quot;sun_behind_rain_cloud&amp;quot;&amp;gt;🌦️&amp;lt;/span&amp;gt; K8s in 1 Minute with the nocloud cloud-init image =&lt;br /&gt;
&lt;br /&gt;
= &#039;&#039;&#039;This is a very early version and contains some hacks&#039;&#039;&#039; =&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
This is an idea how to set up Alpine with cloud init. The current version has been tested with the  [https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/cloud/nocloud_alpine-3.19.1-x86_64-bios-tiny-r0.qcow2 nocloud Alpine 3.19 cloudinit] base image. It has been inspired by [[k8s]] and intended for the adminless set up of virtual and bare metal machines. &lt;br /&gt;
At the moment it is only a proof of concept and needs to be extended to a real multi server setup.&lt;br /&gt;
&lt;br /&gt;
=== Necessary fixes to [[k8s]] ===&lt;br /&gt;
&lt;br /&gt;
The {{Path|runcmd command}} fixes several issues with the image and the way how services are started.&lt;br /&gt;
&lt;br /&gt;
# added another user {{Path|k8s}}&lt;br /&gt;
# added name and ip address to {{Path|/etc/hosts}}&lt;br /&gt;
# align the versions of the modules by a quick hack link in {{Path|/lib/modules}} &lt;br /&gt;
# some config patches using {{Path|sed}}&lt;br /&gt;
# for some reason in need to start the {{Path|croup}} service otherwise {{Path|containerd}} did not come up&lt;br /&gt;
&lt;br /&gt;
The rest of the installations worked out of the box. Full code available at [https://github.com/thomasfricke/k8s-alpine-cloudinit github] &lt;br /&gt;
&lt;br /&gt;
You need two files  {{Path|metadata}} identifying the system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alpine&lt;br /&gt;
local-hostname: alpine&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and {{Path|user-data}} with the actual configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package_update: true&lt;br /&gt;
package_upgrade: true&lt;br /&gt;
package_reboot_if_required: true&lt;br /&gt;
#package_reboot: true&lt;br /&gt;
&lt;br /&gt;
write_files:&lt;br /&gt;
  - path: /etc/apk/repositories&lt;br /&gt;
    content: |&lt;br /&gt;
      #https://dl-cdn.alpinelinux.org/alpine/v3.19/testing&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;
    append: true&lt;br /&gt;
  - path: /etc/modules-load.d/k8s.conf&lt;br /&gt;
    content: |&lt;br /&gt;
      br_netfilter&lt;br /&gt;
  - path: /etc/sysctl.conf&lt;br /&gt;
    content: |&lt;br /&gt;
      net.bridge.bridge-nf-call-iptables=1&lt;br /&gt;
      net.ipv4.ip_forward=1&lt;br /&gt;
  - path: /etc/crictl.yaml&lt;br /&gt;
    content: |&lt;br /&gt;
      runtime-endpoint: unix:///run/containerd/containerd.sock&lt;br /&gt;
      image-endpoint: unix:///run/containerd/containerd.sock&lt;br /&gt;
      timeout: 2&lt;br /&gt;
      pull-image-on-create: false&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
packages:&lt;br /&gt;
 - cni-plugin-flannel&lt;br /&gt;
 - cni-plugins&lt;br /&gt;
 - flannel&lt;br /&gt;
 - flannel-contrib-cni&lt;br /&gt;
 - kubelet&lt;br /&gt;
 - kubeadm&lt;br /&gt;
 - kubectl&lt;br /&gt;
 - containerd&lt;br /&gt;
 - containerd-ctr&lt;br /&gt;
 - k9s&lt;br /&gt;
 - uuidgen&lt;br /&gt;
 - openssh-server-pam&lt;br /&gt;
&lt;br /&gt;
ssh_pwauth: true # sshd service will be configured to accept password authentication method&lt;br /&gt;
password: changeme # Set a password for alpine&lt;br /&gt;
chpasswd:&lt;br /&gt;
    expire: false # Don&#039;t ask for password reset after the first log-in&lt;br /&gt;
ssh_authorized_keys:&lt;br /&gt;
- ssh-ed25519 your key you@example.com&lt;br /&gt;
&lt;br /&gt;
users:&lt;br /&gt;
- default&lt;br /&gt;
- name: k8s&lt;br /&gt;
  doas:&lt;br /&gt;
  - permit nopass k8s as root&lt;br /&gt;
  ssh_authorized_keys:&lt;br /&gt;
  - ssh-ed25519 your key you@example.com&lt;br /&gt;
&lt;br /&gt;
runcmd:&lt;br /&gt;
  - |&lt;br /&gt;
    # mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup&lt;br /&gt;
    uuidgen &amp;gt; /etc/machine-id&lt;br /&gt;
    sed -i &#039;s/^#UsePAM no/UsePAM yes/&#039; /etc/ssh/sshd_config &amp;amp;&amp;amp; /etc/init.d/sshd restart&lt;br /&gt;
    echo $(ifconfig eth0 | grep &#039;inet addr:&#039; | cut -d: -f2| cut -d&#039; &#039; -f1) $(hostname) &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
    (cd /lib/modules &amp;amp;&amp;amp; ln -s 6.6.28-0-virt 6.6.14-0-virt &amp;amp;&amp;amp; depmod)&lt;br /&gt;
    modprobe br_netfilter&lt;br /&gt;
    sed -ie &#039;/swap/ s/^/#/&#039; /etc/fstab &amp;amp;&amp;amp; swapoff -a&lt;br /&gt;
    mount --make-rshared /&lt;br /&gt;
    echo &amp;quot;#!/bin/sh&amp;quot; &amp;gt; /etc/local.d/sharedmetrics.start&lt;br /&gt;
    echo &amp;quot;mount --make-rshared /&amp;quot; &amp;gt;&amp;gt; /etc/local.d/sharedmetrics.start&lt;br /&gt;
    chmod +x /etc/local.d/sharedmetrics.start&lt;br /&gt;
    rc-update add local default&lt;br /&gt;
    rc-update add cgroups&lt;br /&gt;
    rc-update add containerd&lt;br /&gt;
    rc-update add kubelet&lt;br /&gt;
    rc-update add ntpd&lt;br /&gt;
    rc-service ntpd start&lt;br /&gt;
    rc-service cgroups start&lt;br /&gt;
    rc-service containerd start&lt;br /&gt;
    echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
    kubeadm config images pull&lt;br /&gt;
    kubeadm init --pod-network-cidr=10.244.0.0/16 --node-name=$(hostname) --apiserver-advertise-address $(hostname -i) --control-plane-endpoint=$(hostname -i) --upload-certs&lt;br /&gt;
    mkdir ~/.kube&lt;br /&gt;
    mkdir -p /root/.kube/ &amp;amp;&amp;amp; ln -s /etc/kubernetes/admin.conf /root/.kube/config&lt;br /&gt;
    export KUBECONFIG=/etc/kubernetes/admin.conf&lt;br /&gt;
    while ! kubectl cluster-info ; do echo waiting for api server ; sleep 1; done&lt;br /&gt;
    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml&lt;br /&gt;
    kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
    echo &amp;quot;cloud-init schema&amp;quot;&lt;br /&gt;
    cloud-init schema --system&lt;br /&gt;
    echo &amp;quot;cloud-init status&amp;quot;&lt;br /&gt;
    cloud-init status --long&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=K8s&amp;diff=26668</id>
		<title>K8s</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=K8s&amp;diff=26668"/>
		<updated>2024-05-02T07:06:04Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Bonus 🌦️ */&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; echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&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;
{{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>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=K8s&amp;diff=26667</id>
		<title>K8s</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=K8s&amp;diff=26667"/>
		<updated>2024-05-02T07:05:43Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &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; echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&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;
{{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;
= 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>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=K8s_with_cloud-init&amp;diff=26666</id>
		<title>K8s with cloud-init</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=K8s_with_cloud-init&amp;diff=26666"/>
		<updated>2024-05-02T07:01:19Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Alpine Linux 🌲 K8s in 1 Minute with the nocloud cloud-init image */&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 1 Minute with the nocloud cloud-init image =&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
This is an idea how to set up Alpine with cloud init. The current version has been tested with the  [https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/cloud/nocloud_alpine-3.19.1-x86_64-bios-tiny-r0.qcow2 nocloud Alpine 3.19 cloudinit] base image. It has been inspired by [[k8s]] and intended for the adminless set up of virtual and bare metal machines. &lt;br /&gt;
At the moment it is only a proof of concept and needs to be extended to a real multi server setup.&lt;br /&gt;
&lt;br /&gt;
=== Necessary fixes to [[k8s]] ===&lt;br /&gt;
&lt;br /&gt;
The {{Path|runcmd command}} fixes several issues with the image and the way how services are started.&lt;br /&gt;
&lt;br /&gt;
# added another user {{Path|k8s}}&lt;br /&gt;
# added name and ip address to {{Path|/etc/hosts}}&lt;br /&gt;
# align the versions of the modules by a quick hack link in {{Path|/lib/modules}} &lt;br /&gt;
# some config patches using {{Path|sed}}&lt;br /&gt;
# for some reason in need to start the {{Path|croup}} service otherwise {{Path|containerd}} did not come up&lt;br /&gt;
&lt;br /&gt;
The rest of the installations worked out of the box. Full code available at [https://github.com/thomasfricke/k8s-alpine-cloudinit github] &lt;br /&gt;
&lt;br /&gt;
You need two files  {{Path|metadata}} identifying the system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alpine&lt;br /&gt;
local-hostname: alpine&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and {{Path|user-data}} with the actual configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package_update: true&lt;br /&gt;
package_upgrade: true&lt;br /&gt;
package_reboot_if_required: true&lt;br /&gt;
#package_reboot: true&lt;br /&gt;
&lt;br /&gt;
write_files:&lt;br /&gt;
  - path: /etc/apk/repositories&lt;br /&gt;
    content: |&lt;br /&gt;
      #https://dl-cdn.alpinelinux.org/alpine/v3.19/testing&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;
    append: true&lt;br /&gt;
  - path: /etc/modules-load.d/k8s.conf&lt;br /&gt;
    content: |&lt;br /&gt;
      br_netfilter&lt;br /&gt;
  - path: /etc/sysctl.conf&lt;br /&gt;
    content: |&lt;br /&gt;
      net.bridge.bridge-nf-call-iptables=1&lt;br /&gt;
      net.ipv4.ip_forward=1&lt;br /&gt;
  - path: /etc/crictl.yaml&lt;br /&gt;
    content: |&lt;br /&gt;
      runtime-endpoint: unix:///run/containerd/containerd.sock&lt;br /&gt;
      image-endpoint: unix:///run/containerd/containerd.sock&lt;br /&gt;
      timeout: 2&lt;br /&gt;
      pull-image-on-create: false&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
packages:&lt;br /&gt;
 - cni-plugin-flannel&lt;br /&gt;
 - cni-plugins&lt;br /&gt;
 - flannel&lt;br /&gt;
 - flannel-contrib-cni&lt;br /&gt;
 - kubelet&lt;br /&gt;
 - kubeadm&lt;br /&gt;
 - kubectl&lt;br /&gt;
 - containerd&lt;br /&gt;
 - containerd-ctr&lt;br /&gt;
 - k9s&lt;br /&gt;
 - uuidgen&lt;br /&gt;
 - openssh-server-pam&lt;br /&gt;
&lt;br /&gt;
ssh_pwauth: true # sshd service will be configured to accept password authentication method&lt;br /&gt;
password: changeme # Set a password for alpine&lt;br /&gt;
chpasswd:&lt;br /&gt;
    expire: false # Don&#039;t ask for password reset after the first log-in&lt;br /&gt;
ssh_authorized_keys:&lt;br /&gt;
- ssh-ed25519 your key you@example.com&lt;br /&gt;
&lt;br /&gt;
users:&lt;br /&gt;
- default&lt;br /&gt;
- name: k8s&lt;br /&gt;
  doas:&lt;br /&gt;
  - permit nopass k8s as root&lt;br /&gt;
  ssh_authorized_keys:&lt;br /&gt;
  - ssh-ed25519 your key you@example.com&lt;br /&gt;
&lt;br /&gt;
runcmd:&lt;br /&gt;
  - |&lt;br /&gt;
    # mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup&lt;br /&gt;
    uuidgen &amp;gt; /etc/machine-id&lt;br /&gt;
    sed -i &#039;s/^#UsePAM no/UsePAM yes/&#039; /etc/ssh/sshd_config &amp;amp;&amp;amp; /etc/init.d/sshd restart&lt;br /&gt;
    echo $(ifconfig eth0 | grep &#039;inet addr:&#039; | cut -d: -f2| cut -d&#039; &#039; -f1) $(hostname) &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
    (cd /lib/modules &amp;amp;&amp;amp; ln -s 6.6.28-0-virt 6.6.14-0-virt &amp;amp;&amp;amp; depmod)&lt;br /&gt;
    modprobe br_netfilter&lt;br /&gt;
    sed -ie &#039;/swap/ s/^/#/&#039; /etc/fstab &amp;amp;&amp;amp; swapoff -a&lt;br /&gt;
    mount --make-rshared /&lt;br /&gt;
    echo &amp;quot;#!/bin/sh&amp;quot; &amp;gt; /etc/local.d/sharedmetrics.start&lt;br /&gt;
    echo &amp;quot;mount --make-rshared /&amp;quot; &amp;gt;&amp;gt; /etc/local.d/sharedmetrics.start&lt;br /&gt;
    chmod +x /etc/local.d/sharedmetrics.start&lt;br /&gt;
    rc-update add local default&lt;br /&gt;
    rc-update add cgroups&lt;br /&gt;
    rc-update add containerd&lt;br /&gt;
    rc-update add kubelet&lt;br /&gt;
    rc-update add ntpd&lt;br /&gt;
    rc-service ntpd start&lt;br /&gt;
    rc-service cgroups start&lt;br /&gt;
    rc-service containerd start&lt;br /&gt;
    echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
    kubeadm config images pull&lt;br /&gt;
    kubeadm init --pod-network-cidr=10.244.0.0/16 --node-name=$(hostname) --apiserver-advertise-address $(hostname -i) --control-plane-endpoint=$(hostname -i) --upload-certs&lt;br /&gt;
    mkdir ~/.kube&lt;br /&gt;
    mkdir -p /root/.kube/ &amp;amp;&amp;amp; ln -s /etc/kubernetes/admin.conf /root/.kube/config&lt;br /&gt;
    export KUBECONFIG=/etc/kubernetes/admin.conf&lt;br /&gt;
    while ! kubectl cluster-info ; do echo waiting for api server ; sleep 1; done&lt;br /&gt;
    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml&lt;br /&gt;
    kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
    echo &amp;quot;cloud-init schema&amp;quot;&lt;br /&gt;
    cloud-init schema --system&lt;br /&gt;
    echo &amp;quot;cloud-init status&amp;quot;&lt;br /&gt;
    cloud-init status --long&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=K8s_with_cloud-init&amp;diff=26665</id>
		<title>K8s with cloud-init</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=K8s_with_cloud-init&amp;diff=26665"/>
		<updated>2024-05-02T06:57:47Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Alpine Linux 🌲 K8s in 1 Minute */&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 1 Minute with the nocloud cloud-init image =&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
This is an idea how to set up Alpine with cloud init. The current version has been tested with the  [https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/cloud/nocloud_alpine-3.19.1-x86_64-bios-tiny-r0.qcow2 nocloud Alpine 3.19 cloudinit] base image. It has been inspired by [[k8s]] and intended for the adminless set up of virtual and bare metal machines. &lt;br /&gt;
At the moment it is only a proof of concept and needs to be extended to a real multi server setup.&lt;br /&gt;
&lt;br /&gt;
=== Necessary fixes to [[k8s]] ===&lt;br /&gt;
&lt;br /&gt;
The {{Path|runcmd command}} fixes several issues with the image and the way how services are started.&lt;br /&gt;
&lt;br /&gt;
# added another user {{Path|k8s}}&lt;br /&gt;
# added name and ip address to {{Path|/etc/hosts}}&lt;br /&gt;
# align the versions of the modules by a quick hack link in {{Path|/lib/modules}} &lt;br /&gt;
# some config patches using {{Path|sed}}&lt;br /&gt;
# for some reason in need to start the {{Path|croup}} service otherwise {{Path|containerd}} did not come up&lt;br /&gt;
&lt;br /&gt;
The rest of the installations worked out of the box.&lt;br /&gt;
&lt;br /&gt;
You need two files  {{Path|metadata}} identifying the system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alpine&lt;br /&gt;
local-hostname: alpine&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and {{Path|user-data}} with the actual configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package_update: true&lt;br /&gt;
package_upgrade: true&lt;br /&gt;
package_reboot_if_required: true&lt;br /&gt;
#package_reboot: true&lt;br /&gt;
&lt;br /&gt;
write_files:&lt;br /&gt;
  - path: /etc/apk/repositories&lt;br /&gt;
    content: |&lt;br /&gt;
      #https://dl-cdn.alpinelinux.org/alpine/v3.19/testing&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;
    append: true&lt;br /&gt;
  - path: /etc/modules-load.d/k8s.conf&lt;br /&gt;
    content: |&lt;br /&gt;
      br_netfilter&lt;br /&gt;
  - path: /etc/sysctl.conf&lt;br /&gt;
    content: |&lt;br /&gt;
      net.bridge.bridge-nf-call-iptables=1&lt;br /&gt;
      net.ipv4.ip_forward=1&lt;br /&gt;
  - path: /etc/crictl.yaml&lt;br /&gt;
    content: |&lt;br /&gt;
      runtime-endpoint: unix:///run/containerd/containerd.sock&lt;br /&gt;
      image-endpoint: unix:///run/containerd/containerd.sock&lt;br /&gt;
      timeout: 2&lt;br /&gt;
      pull-image-on-create: false&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
packages:&lt;br /&gt;
 - cni-plugin-flannel&lt;br /&gt;
 - cni-plugins&lt;br /&gt;
 - flannel&lt;br /&gt;
 - flannel-contrib-cni&lt;br /&gt;
 - kubelet&lt;br /&gt;
 - kubeadm&lt;br /&gt;
 - kubectl&lt;br /&gt;
 - containerd&lt;br /&gt;
 - containerd-ctr&lt;br /&gt;
 - k9s&lt;br /&gt;
 - uuidgen&lt;br /&gt;
 - openssh-server-pam&lt;br /&gt;
&lt;br /&gt;
ssh_pwauth: true # sshd service will be configured to accept password authentication method&lt;br /&gt;
password: changeme # Set a password for alpine&lt;br /&gt;
chpasswd:&lt;br /&gt;
    expire: false # Don&#039;t ask for password reset after the first log-in&lt;br /&gt;
ssh_authorized_keys:&lt;br /&gt;
- ssh-ed25519 your key you@example.com&lt;br /&gt;
&lt;br /&gt;
users:&lt;br /&gt;
- default&lt;br /&gt;
- name: k8s&lt;br /&gt;
  doas:&lt;br /&gt;
  - permit nopass k8s as root&lt;br /&gt;
  ssh_authorized_keys:&lt;br /&gt;
  - ssh-ed25519 your key you@example.com&lt;br /&gt;
&lt;br /&gt;
runcmd:&lt;br /&gt;
  - |&lt;br /&gt;
    # mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup&lt;br /&gt;
    uuidgen &amp;gt; /etc/machine-id&lt;br /&gt;
    sed -i &#039;s/^#UsePAM no/UsePAM yes/&#039; /etc/ssh/sshd_config &amp;amp;&amp;amp; /etc/init.d/sshd restart&lt;br /&gt;
    echo $(ifconfig eth0 | grep &#039;inet addr:&#039; | cut -d: -f2| cut -d&#039; &#039; -f1) $(hostname) &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
    (cd /lib/modules &amp;amp;&amp;amp; ln -s 6.6.28-0-virt 6.6.14-0-virt &amp;amp;&amp;amp; depmod)&lt;br /&gt;
    modprobe br_netfilter&lt;br /&gt;
    sed -ie &#039;/swap/ s/^/#/&#039; /etc/fstab &amp;amp;&amp;amp; swapoff -a&lt;br /&gt;
    mount --make-rshared /&lt;br /&gt;
    echo &amp;quot;#!/bin/sh&amp;quot; &amp;gt; /etc/local.d/sharedmetrics.start&lt;br /&gt;
    echo &amp;quot;mount --make-rshared /&amp;quot; &amp;gt;&amp;gt; /etc/local.d/sharedmetrics.start&lt;br /&gt;
    chmod +x /etc/local.d/sharedmetrics.start&lt;br /&gt;
    rc-update add local default&lt;br /&gt;
    rc-update add cgroups&lt;br /&gt;
    rc-update add containerd&lt;br /&gt;
    rc-update add kubelet&lt;br /&gt;
    rc-update add ntpd&lt;br /&gt;
    rc-service ntpd start&lt;br /&gt;
    rc-service cgroups start&lt;br /&gt;
    rc-service containerd start&lt;br /&gt;
    echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
    kubeadm config images pull&lt;br /&gt;
    kubeadm init --pod-network-cidr=10.244.0.0/16 --node-name=$(hostname) --apiserver-advertise-address $(hostname -i) --control-plane-endpoint=$(hostname -i) --upload-certs&lt;br /&gt;
    mkdir ~/.kube&lt;br /&gt;
    mkdir -p /root/.kube/ &amp;amp;&amp;amp; ln -s /etc/kubernetes/admin.conf /root/.kube/config&lt;br /&gt;
    export KUBECONFIG=/etc/kubernetes/admin.conf&lt;br /&gt;
    while ! kubectl cluster-info ; do echo waiting for api server ; sleep 1; done&lt;br /&gt;
    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml&lt;br /&gt;
    kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
    echo &amp;quot;cloud-init schema&amp;quot;&lt;br /&gt;
    cloud-init schema --system&lt;br /&gt;
    echo &amp;quot;cloud-init status&amp;quot;&lt;br /&gt;
    cloud-init status --long&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=K8s_with_cloud-init&amp;diff=26664</id>
		<title>K8s with cloud-init</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=K8s_with_cloud-init&amp;diff=26664"/>
		<updated>2024-05-02T06:57:05Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &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 1 Minute =&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
This is an idea how to set up Alpine with cloud init. The current version has been tested with the  [https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/cloud/nocloud_alpine-3.19.1-x86_64-bios-tiny-r0.qcow2 nocloud Alpine 3.19 cloudinit] base image. It has been inspired by [[k8s]] and intended for the adminless set up of virtual and bare metal machines. &lt;br /&gt;
At the moment it is only a proof of concept and needs to be extended to a real multi server setup.&lt;br /&gt;
&lt;br /&gt;
=== Necessary fixes to [[k8s]] ===&lt;br /&gt;
&lt;br /&gt;
The {{Path|runcmd command}} fixes several issues with the image and the way how services are started.&lt;br /&gt;
&lt;br /&gt;
# added another user {{Path|k8s}}&lt;br /&gt;
# added name and ip address to {{Path|/etc/hosts}}&lt;br /&gt;
# align the versions of the modules by a quick hack link in {{Path|/lib/modules}} &lt;br /&gt;
# some config patches using {{Path|sed}}&lt;br /&gt;
# for some reason in need to start the {{Path|croup}} service otherwise {{Path|containerd}} did not come up&lt;br /&gt;
&lt;br /&gt;
The rest of the installations worked out of the box.&lt;br /&gt;
&lt;br /&gt;
You need two files  {{Path|metadata}} identifying the system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alpine&lt;br /&gt;
local-hostname: alpine&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and {{Path|user-data}} with the actual configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package_update: true&lt;br /&gt;
package_upgrade: true&lt;br /&gt;
package_reboot_if_required: true&lt;br /&gt;
#package_reboot: true&lt;br /&gt;
&lt;br /&gt;
write_files:&lt;br /&gt;
  - path: /etc/apk/repositories&lt;br /&gt;
    content: |&lt;br /&gt;
      #https://dl-cdn.alpinelinux.org/alpine/v3.19/testing&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;
    append: true&lt;br /&gt;
  - path: /etc/modules-load.d/k8s.conf&lt;br /&gt;
    content: |&lt;br /&gt;
      br_netfilter&lt;br /&gt;
  - path: /etc/sysctl.conf&lt;br /&gt;
    content: |&lt;br /&gt;
      net.bridge.bridge-nf-call-iptables=1&lt;br /&gt;
      net.ipv4.ip_forward=1&lt;br /&gt;
  - path: /etc/crictl.yaml&lt;br /&gt;
    content: |&lt;br /&gt;
      runtime-endpoint: unix:///run/containerd/containerd.sock&lt;br /&gt;
      image-endpoint: unix:///run/containerd/containerd.sock&lt;br /&gt;
      timeout: 2&lt;br /&gt;
      pull-image-on-create: false&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
packages:&lt;br /&gt;
 - cni-plugin-flannel&lt;br /&gt;
 - cni-plugins&lt;br /&gt;
 - flannel&lt;br /&gt;
 - flannel-contrib-cni&lt;br /&gt;
 - kubelet&lt;br /&gt;
 - kubeadm&lt;br /&gt;
 - kubectl&lt;br /&gt;
 - containerd&lt;br /&gt;
 - containerd-ctr&lt;br /&gt;
 - k9s&lt;br /&gt;
 - uuidgen&lt;br /&gt;
 - openssh-server-pam&lt;br /&gt;
&lt;br /&gt;
ssh_pwauth: true # sshd service will be configured to accept password authentication method&lt;br /&gt;
password: changeme # Set a password for alpine&lt;br /&gt;
chpasswd:&lt;br /&gt;
    expire: false # Don&#039;t ask for password reset after the first log-in&lt;br /&gt;
ssh_authorized_keys:&lt;br /&gt;
- ssh-ed25519 your key you@example.com&lt;br /&gt;
&lt;br /&gt;
users:&lt;br /&gt;
- default&lt;br /&gt;
- name: k8s&lt;br /&gt;
  doas:&lt;br /&gt;
  - permit nopass k8s as root&lt;br /&gt;
  ssh_authorized_keys:&lt;br /&gt;
  - ssh-ed25519 your key you@example.com&lt;br /&gt;
&lt;br /&gt;
runcmd:&lt;br /&gt;
  - |&lt;br /&gt;
    # mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup&lt;br /&gt;
    uuidgen &amp;gt; /etc/machine-id&lt;br /&gt;
    sed -i &#039;s/^#UsePAM no/UsePAM yes/&#039; /etc/ssh/sshd_config &amp;amp;&amp;amp; /etc/init.d/sshd restart&lt;br /&gt;
    echo $(ifconfig eth0 | grep &#039;inet addr:&#039; | cut -d: -f2| cut -d&#039; &#039; -f1) $(hostname) &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
    (cd /lib/modules &amp;amp;&amp;amp; ln -s 6.6.28-0-virt 6.6.14-0-virt &amp;amp;&amp;amp; depmod)&lt;br /&gt;
    modprobe br_netfilter&lt;br /&gt;
    sed -ie &#039;/swap/ s/^/#/&#039; /etc/fstab &amp;amp;&amp;amp; swapoff -a&lt;br /&gt;
    mount --make-rshared /&lt;br /&gt;
    echo &amp;quot;#!/bin/sh&amp;quot; &amp;gt; /etc/local.d/sharedmetrics.start&lt;br /&gt;
    echo &amp;quot;mount --make-rshared /&amp;quot; &amp;gt;&amp;gt; /etc/local.d/sharedmetrics.start&lt;br /&gt;
    chmod +x /etc/local.d/sharedmetrics.start&lt;br /&gt;
    rc-update add local default&lt;br /&gt;
    rc-update add cgroups&lt;br /&gt;
    rc-update add containerd&lt;br /&gt;
    rc-update add kubelet&lt;br /&gt;
    rc-update add ntpd&lt;br /&gt;
    rc-service ntpd start&lt;br /&gt;
    rc-service cgroups start&lt;br /&gt;
    rc-service containerd start&lt;br /&gt;
    echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
    kubeadm config images pull&lt;br /&gt;
    kubeadm init --pod-network-cidr=10.244.0.0/16 --node-name=$(hostname) --apiserver-advertise-address $(hostname -i) --control-plane-endpoint=$(hostname -i) --upload-certs&lt;br /&gt;
    mkdir ~/.kube&lt;br /&gt;
    mkdir -p /root/.kube/ &amp;amp;&amp;amp; ln -s /etc/kubernetes/admin.conf /root/.kube/config&lt;br /&gt;
    export KUBECONFIG=/etc/kubernetes/admin.conf&lt;br /&gt;
    while ! kubectl cluster-info ; do echo waiting for api server ; sleep 1; done&lt;br /&gt;
    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml&lt;br /&gt;
    kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
    echo &amp;quot;cloud-init schema&amp;quot;&lt;br /&gt;
    cloud-init schema --system&lt;br /&gt;
    echo &amp;quot;cloud-init status&amp;quot;&lt;br /&gt;
    cloud-init status --long&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=K8s_with_cloud-init&amp;diff=26663</id>
		<title>K8s with cloud-init</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=K8s_with_cloud-init&amp;diff=26663"/>
		<updated>2024-05-02T06:56:26Z</updated>

		<summary type="html">&lt;p&gt;Thomas: Created page with &amp;quot;= 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 1 Minute =  == Summary ==  This is an idea how to set up Alpine with cloud init. The current version has been tested with the  [https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/cloud/nocloud_alpine-3.19.1-x86_64-bios-tiny-r0.qcow2 nocloud Alpine 3.19 cloudinit] base image. It has been inspired by k8s and intended for the adminless set up of virtual and bare metal machines.  At the m...&amp;quot;&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 1 Minute =&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
This is an idea how to set up Alpine with cloud init. The current version has been tested with the  [https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/cloud/nocloud_alpine-3.19.1-x86_64-bios-tiny-r0.qcow2 nocloud Alpine 3.19 cloudinit] base image. It has been inspired by [[k8s]] and intended for the adminless set up of virtual and bare metal machines. &lt;br /&gt;
At the moment it is only a proof of concept and needs to be extended to a real multi server setup.&lt;br /&gt;
&lt;br /&gt;
=== Necessary fixes to [[k8s]] ===&lt;br /&gt;
&lt;br /&gt;
The {{Path|runcmd command}} fixes several issues with the image and the way how services are started.&lt;br /&gt;
&lt;br /&gt;
# added another user {{Path|k8s}}&lt;br /&gt;
# added name and ip address to {{Path|/etc/hosts}}&lt;br /&gt;
# align the versions of the modules by a quick hack link in {{Path|/lib/modules}} &lt;br /&gt;
# some config patches using {{Path|sed}}&lt;br /&gt;
# for some reason in need to start the {{Path|croup}} service otherwise {{Path|containerd}} did not come up&lt;br /&gt;
&lt;br /&gt;
The rest of the installations worked out of the box.&lt;br /&gt;
&lt;br /&gt;
You need two files  {{Path|metadata}} identifying the system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alpine&lt;br /&gt;
local-hostname: alpine&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and {{Path|user-data}} with the actual configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package_update: true&lt;br /&gt;
package_upgrade: true&lt;br /&gt;
package_reboot_if_required: true&lt;br /&gt;
#package_reboot: true&lt;br /&gt;
&lt;br /&gt;
write_files:&lt;br /&gt;
  - path: /etc/apk/repositories&lt;br /&gt;
    content: |&lt;br /&gt;
      #https://dl-cdn.alpinelinux.org/alpine/v3.19/testing&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;
    append: true&lt;br /&gt;
  - path: /etc/modules-load.d/k8s.conf&lt;br /&gt;
    content: |&lt;br /&gt;
      br_netfilter&lt;br /&gt;
  - path: /etc/sysctl.conf&lt;br /&gt;
    content: |&lt;br /&gt;
      net.bridge.bridge-nf-call-iptables=1&lt;br /&gt;
      net.ipv4.ip_forward=1&lt;br /&gt;
  - path: /etc/crictl.yaml&lt;br /&gt;
    content: |&lt;br /&gt;
      runtime-endpoint: unix:///run/containerd/containerd.sock&lt;br /&gt;
      image-endpoint: unix:///run/containerd/containerd.sock&lt;br /&gt;
      timeout: 2&lt;br /&gt;
      pull-image-on-create: false&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
packages:&lt;br /&gt;
 - cni-plugin-flannel&lt;br /&gt;
 - cni-plugins&lt;br /&gt;
 - flannel&lt;br /&gt;
 - flannel-contrib-cni&lt;br /&gt;
 - kubelet&lt;br /&gt;
 - kubeadm&lt;br /&gt;
 - kubectl&lt;br /&gt;
 - containerd&lt;br /&gt;
 - containerd-ctr&lt;br /&gt;
 - k9s&lt;br /&gt;
 - uuidgen&lt;br /&gt;
 - openssh-server-pam&lt;br /&gt;
&lt;br /&gt;
ssh_pwauth: true # sshd service will be configured to accept password authentication method&lt;br /&gt;
password: changeme # Set a password for alpine&lt;br /&gt;
chpasswd:&lt;br /&gt;
    expire: false # Don&#039;t ask for password reset after the first log-in&lt;br /&gt;
ssh_authorized_keys:&lt;br /&gt;
- ssh-ed25519 your key you@example.com&lt;br /&gt;
&lt;br /&gt;
users:&lt;br /&gt;
- default&lt;br /&gt;
- name: k8s&lt;br /&gt;
  doas:&lt;br /&gt;
  - permit nopass k8s as root&lt;br /&gt;
  ssh_authorized_keys:&lt;br /&gt;
  - ssh-ed25519 your key you@example.com&lt;br /&gt;
&lt;br /&gt;
runcmd:&lt;br /&gt;
  - |&lt;br /&gt;
    # mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup&lt;br /&gt;
    uuidgen &amp;gt; /etc/machine-id&lt;br /&gt;
    sed -i &#039;s/^#UsePAM no/UsePAM yes/&#039; /etc/ssh/sshd_config &amp;amp;&amp;amp; /etc/init.d/sshd restart&lt;br /&gt;
    echo $(ifconfig eth0 | grep &#039;inet addr:&#039; | cut -d: -f2| cut -d&#039; &#039; -f1) $(hostname) &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
    (cd /lib/modules &amp;amp;&amp;amp; ln -s 6.6.28-0-virt 6.6.14-0-virt &amp;amp;&amp;amp; depmod)&lt;br /&gt;
    modprobe br_netfilter&lt;br /&gt;
    sed -ie &#039;/swap/ s/^/#/&#039; /etc/fstab &amp;amp;&amp;amp; swapoff -a&lt;br /&gt;
    mount --make-rshared /&lt;br /&gt;
    echo &amp;quot;#!/bin/sh&amp;quot; &amp;gt; /etc/local.d/sharedmetrics.start&lt;br /&gt;
    echo &amp;quot;mount --make-rshared /&amp;quot; &amp;gt;&amp;gt; /etc/local.d/sharedmetrics.start&lt;br /&gt;
    chmod +x /etc/local.d/sharedmetrics.start&lt;br /&gt;
    rc-update add local default&lt;br /&gt;
    rc-update add cgroups&lt;br /&gt;
    rc-update add containerd&lt;br /&gt;
    rc-update add kubelet&lt;br /&gt;
    rc-update add ntpd&lt;br /&gt;
    rc-service ntpd start&lt;br /&gt;
    rc-service cgroups start&lt;br /&gt;
    rc-service containerd start&lt;br /&gt;
    echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
    kubeadm config images pull&lt;br /&gt;
    kubeadm init --pod-network-cidr=10.244.0.0/16 --node-name=$(hostname) --apiserver-advertise-address $(hostname -i) --control-plane-endpoint=$(hostname -i) --upload-certs&lt;br /&gt;
    mkdir ~/.kube&lt;br /&gt;
    mkdir -p /root/.kube/ &amp;amp;&amp;amp; ln -s /etc/kubernetes/admin.conf /root/.kube/config&lt;br /&gt;
    export KUBECONFIG=/etc/kubernetes/admin.conf&lt;br /&gt;
    while ! kubectl cluster-info ; do echo waiting for api server ; sleep 1; done&lt;br /&gt;
    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml&lt;br /&gt;
    kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
    echo &amp;quot;cloud-init schema&amp;quot;&lt;br /&gt;
    cloud-init schema --system&lt;br /&gt;
    echo &amp;quot;cloud-init status&amp;quot;&lt;br /&gt;
    cloud-init status --long}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User_talk:Bbbhltz&amp;diff=26661</id>
		<title>User talk:Bbbhltz</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User_talk:Bbbhltz&amp;diff=26661"/>
		<updated>2024-05-01T15:08:31Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi,&lt;br /&gt;
&lt;br /&gt;
I would like to add a page to the Wiki and contribute a my five cent.&lt;br /&gt;
&lt;br /&gt;
But I get a spammers not welcome error. How to proceed?&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
&lt;br /&gt;
Thomas&lt;br /&gt;
&lt;br /&gt;
: Hi, &amp;lt;br&amp;gt;I would help but I don&#039;t have the privilege to add you to a different group. I mean, maybe I can? I saw your message on Mastodon, btw.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;--[[User:Bbbhltz|bbbhltz]] ([[User talk:Bbbhltz|talk]]) 14:50, 1 May 2024 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tnx for the answer. Just point me to the right person.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User_talk:Bbbhltz&amp;diff=26659</id>
		<title>User talk:Bbbhltz</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User_talk:Bbbhltz&amp;diff=26659"/>
		<updated>2024-05-01T14:23:26Z</updated>

		<summary type="html">&lt;p&gt;Thomas: Created page with &amp;quot;Hi,  I would like to add a page to the Wiki and contribute a my five cent.  But I get a spammers not welcome error. How to proceed?  Cheers,  Thomas&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi,&lt;br /&gt;
&lt;br /&gt;
I would like to add a page to the Wiki and contribute a my five cent.&lt;br /&gt;
&lt;br /&gt;
But I get a spammers not welcome error. How to proceed?&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
&lt;br /&gt;
Thomas&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
</feed>