|
| 1 | +# Deploy kubernetes via kubeadm. |
| 2 | +# $ limactl start ./k8s.yaml |
| 3 | +# $ limactl shell k8s kubectl |
| 4 | + |
| 5 | +# It can be accessed from the host by exporting the kubeconfig file; |
| 6 | +# the ports are already forwarded automatically by lima: |
| 7 | +# |
| 8 | +# $ export KUBECONFIG=$(limactl list k8s --format 'unix://{{.Dir}}/copied-from-guest/kubeconfig.yaml') |
| 9 | +# $ kubectl get no |
| 10 | +# NAME STATUS ROLES AGE VERSION |
| 11 | +# lima-k8s Ready control-plane,master 44s v1.22.3 |
| 12 | + |
| 13 | +cpuType: |
| 14 | + "x86_64": "max" |
| 15 | + |
| 16 | +# This template requires Lima v0.20.0 or later. |
| 17 | +images: |
| 18 | + # Try to use release-yyyyMMdd image if available. Note that release-yyyyMMdd will be removed after several months. |
| 19 | + - location: "https://cloud-images.ubuntu.com/releases/24.04/release-20240423/ubuntu-24.04-server-cloudimg-amd64.img" |
| 20 | + arch: "x86_64" |
| 21 | + digest: "sha256:32a9d30d18803da72f5936cf2b7b9efcb4d0bb63c67933f17e3bdfd1751de3f3" |
| 22 | + - location: "https://cloud-images.ubuntu.com/releases/24.04/release-20240423/ubuntu-24.04-server-cloudimg-arm64.img" |
| 23 | + arch: "aarch64" |
| 24 | + digest: "sha256:c841bac00925d3e6892d979798103a867931f255f28fefd9d5e07e3e22d0ef22" |
| 25 | + # Fallback to the latest release image. |
| 26 | + # Hint: run `limactl prune` to invalidate the cache |
| 27 | + - location: "https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img" |
| 28 | + arch: "x86_64" |
| 29 | + - location: "https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-arm64.img" |
| 30 | + arch: "aarch64" |
| 31 | + |
| 32 | +# Mounts are disabled in this template, but can be enabled optionally. |
| 33 | +mounts: [] |
| 34 | +containerd: |
| 35 | + system: true |
| 36 | + user: false |
| 37 | +provision: |
| 38 | + # See <https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/> |
| 39 | + - mode: system |
| 40 | + script: | |
| 41 | + #!/bin/bash |
| 42 | + set -eux -o pipefail |
| 43 | + command -v kubeadm >/dev/null 2>&1 && exit 0 |
| 44 | + # Install and configure prerequisites |
| 45 | + cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf |
| 46 | + overlay |
| 47 | + br_netfilter |
| 48 | + EOF |
| 49 | + modprobe overlay |
| 50 | + modprobe br_netfilter |
| 51 | + cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf |
| 52 | + net.bridge.bridge-nf-call-iptables = 1 |
| 53 | + net.ipv4.ip_forward = 1 |
| 54 | + net.bridge.bridge-nf-call-ip6tables = 1 |
| 55 | + EOF |
| 56 | + sysctl --system |
| 57 | + # Installing kubeadm, kubelet and kubectl |
| 58 | + export DEBIAN_FRONTEND=noninteractive |
| 59 | + apt-get update |
| 60 | + apt-get install -y apt-transport-https ca-certificates curl |
| 61 | + VERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt | sed -e 's/v//' | cut -d'.' -f1-2) |
| 62 | + echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v${VERSION}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list |
| 63 | + curl -fsSL https://pkgs.k8s.io/core:/stable:/v${VERSION}/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg |
| 64 | + apt-get update |
| 65 | + # cri-tools |
| 66 | + apt-get install -y cri-tools |
| 67 | + cat <<EOF | sudo tee /etc/crictl.yaml |
| 68 | + runtime-endpoint: unix:///run/containerd/containerd.sock |
| 69 | + EOF |
| 70 | + # cni-plugins |
| 71 | + apt-get install -y kubernetes-cni |
| 72 | + rm -f /etc/cni/net.d/*.conf* |
| 73 | + apt-get install -y kubelet kubeadm kubectl && apt-mark hold kubelet kubeadm kubectl |
| 74 | + systemctl enable --now kubelet |
| 75 | + # See <https://kubernetes.io/docs/setup/production-environment/container-runtimes/> |
| 76 | + - mode: system |
| 77 | + script: | |
| 78 | + #!/bin/bash |
| 79 | + set -eux -o pipefail |
| 80 | + grep SystemdCgroup /etc/containerd/config.toml && exit 0 |
| 81 | + grep "version = 2" /etc/containerd/config.toml || exit 1 |
| 82 | + # Configuring the systemd cgroup driver |
| 83 | + # Overriding the sandbox (pause) image |
| 84 | + cat <<EOF >>/etc/containerd/config.toml |
| 85 | + [plugins] |
| 86 | + [plugins."io.containerd.grpc.v1.cri"] |
| 87 | + sandbox_image = "$(kubeadm config images list | grep pause | sort -r | head -n1)" |
| 88 | + [plugins."io.containerd.grpc.v1.cri".containerd] |
| 89 | + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] |
| 90 | + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] |
| 91 | + runtime_type = "io.containerd.runc.v2" |
| 92 | + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] |
| 93 | + SystemdCgroup = true |
| 94 | + EOF |
| 95 | + systemctl restart containerd |
| 96 | + # See <https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/> |
| 97 | + - mode: system |
| 98 | + script: | |
| 99 | + #!/bin/bash |
| 100 | + set -eux -o pipefail |
| 101 | + test -e /etc/kubernetes/admin.conf && exit 0 |
| 102 | + export KUBECONFIG=/etc/kubernetes/admin.conf |
| 103 | + kubeadm config images list |
| 104 | + kubeadm config images pull --cri-socket=unix:///run/containerd/containerd.sock |
| 105 | + # Initializing your control-plane node |
| 106 | + cat <<EOF >kubeadm-config.yaml |
| 107 | + kind: InitConfiguration |
| 108 | + apiVersion: kubeadm.k8s.io/v1beta3 |
| 109 | + nodeRegistration: |
| 110 | + criSocket: unix:///run/containerd/containerd.sock |
| 111 | + --- |
| 112 | + kind: ClusterConfiguration |
| 113 | + apiVersion: kubeadm.k8s.io/v1beta3 |
| 114 | + apiServer: |
| 115 | + certSANs: # --apiserver-cert-extra-sans |
| 116 | + - "127.0.0.1" |
| 117 | + networking: |
| 118 | + podSubnet: "10.244.0.0/16" # --pod-network-cidr |
| 119 | + --- |
| 120 | + kind: KubeletConfiguration |
| 121 | + apiVersion: kubelet.config.k8s.io/v1beta1 |
| 122 | + cgroupDriver: systemd |
| 123 | + EOF |
| 124 | + kubeadm init --config kubeadm-config.yaml |
| 125 | + # Installing a Pod network add-on |
| 126 | + kubectl apply -f https://github.com/flannel-io/flannel/releases/download/v0.24.0/kube-flannel.yml |
| 127 | + # Control plane node isolation |
| 128 | + kubectl taint nodes --all node-role.kubernetes.io/control-plane- |
| 129 | + # Replace the server address with localhost, so that it works also from the host |
| 130 | + sed -e "/server:/ s|https://.*:\([0-9]*\)$|https://127.0.0.1:\1|" -i $KUBECONFIG |
| 131 | + mkdir -p ${HOME:-/root}/.kube && cp -f $KUBECONFIG ${HOME:-/root}/.kube/config |
| 132 | + - mode: system |
| 133 | + script: | |
| 134 | + #!/bin/bash |
| 135 | + set -eux -o pipefail |
| 136 | + export KUBECONFIG=/etc/kubernetes/admin.conf |
| 137 | + mkdir -p {{.Home}}/.kube |
| 138 | + cp -f $KUBECONFIG {{.Home}}/.kube/config |
| 139 | + chown -R {{.User}} {{.Home}}/.kube |
| 140 | +probes: |
| 141 | + - description: "kubeadm to be installed" |
| 142 | + script: | |
| 143 | + #!/bin/bash |
| 144 | + set -eux -o pipefail |
| 145 | + if ! timeout 30s bash -c "until command -v kubeadm >/dev/null 2>&1; do sleep 3; done"; then |
| 146 | + echo >&2 "kubeadm is not installed yet" |
| 147 | + exit 1 |
| 148 | + fi |
| 149 | + hint: | |
| 150 | + See "/var/log/cloud-init-output.log" in the guest |
| 151 | + - description: "kubeadm to be completed" |
| 152 | + script: | |
| 153 | + #!/bin/bash |
| 154 | + set -eux -o pipefail |
| 155 | + if ! timeout 300s bash -c "until test -f /etc/kubernetes/admin.conf; do sleep 3; done"; then |
| 156 | + echo >&2 "k8s is not running yet" |
| 157 | + exit 1 |
| 158 | + fi |
| 159 | + hint: | |
| 160 | + The k8s kubeconfig file has not yet been created. |
| 161 | + - description: "kubernetes cluster to be running" |
| 162 | + script: | |
| 163 | + #!/bin/bash |
| 164 | + set -eux -o pipefail |
| 165 | + if ! timeout 300s bash -c "until kubectl version >/dev/null 2>&1; do sleep 3; done"; then |
| 166 | + echo >&2 "kubernetes cluster is not up and running yet" |
| 167 | + exit 1 |
| 168 | + fi |
| 169 | + - description: "coredns deployment to be running" |
| 170 | + script: | |
| 171 | + #!/bin/bash |
| 172 | + set -eux -o pipefail |
| 173 | + kubectl wait -n kube-system --timeout=180s --for=condition=available deploy coredns |
| 174 | +copyToHost: |
| 175 | + - guest: "/etc/kubernetes/admin.conf" |
| 176 | + host: "{{.Dir}}/copied-from-guest/kubeconfig.yaml" |
| 177 | + deleteOnStop: true |
| 178 | +message: | |
| 179 | + To run `kubectl` on the host (assumes kubectl is installed), run the following commands: |
| 180 | + ------ |
| 181 | + export KUBECONFIG="{{.Dir}}/copied-from-guest/kubeconfig.yaml" |
| 182 | + kubectl ... |
| 183 | + ------ |
0 commit comments