使用 cloud-init 的 K8s
Alpine Linux 🌦️ 使用 nocloud cloud-init 镜像在 1 分钟内搭建 K8s
这是一个非常早期的版本,包含一些 hack
摘要
这是一个关于如何使用 cloud-init 设置 Alpine 的想法。当前版本已使用 nocloud Alpine 3.19 cloudinit 基础镜像进行了测试。这个想法受到了 k8s 的启发,旨在为虚拟和裸金属机器提供无需管理员的设置。目前,这仅是一个概念验证,还需要扩展到真正的多服务器部署。
k8s 的必要修复
runcmd 命令 修复了镜像的几个问题以及服务启动的方式。
- 添加了另一个用户 k8s
- 将名称和 IP 地址添加到 /etc/hosts
- 通过 /lib/modules 中的一个快速 hack 链接来对齐模块版本
- 一些使用 sed 的配置补丁
- 由于某些原因,需要启动 croup 服务,否则 containerd 无法启动
其余的安装都开箱即用。完整代码可在 github 上找到。
你需要两个文件:metadata 用于标识系统
alpine local-hostname: alpine
以及 user-data,其中包含实际配置。
package_update: true package_upgrade: true package_reboot_if_required: true #package_reboot: true write_files: - path: /etc/apk/repositories content: | #https://dl-cdn.alpinelinux.org/alpine/v3.19/testing http://dl-cdn.alpinelinux.org/alpine/edge/community http://dl-cdn.alpinelinux.org/alpine/edge/testing append: true - path: /etc/modules-load.d/k8s.conf content: | br_netfilter - path: /etc/sysctl.conf content: | net.bridge.bridge-nf-call-iptables=1 net.ipv4.ip_forward=1 - path: /etc/crictl.yaml content: | runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 2 pull-image-on-create: false packages: - cni-plugin-flannel - cni-plugins - flannel - flannel-contrib-cni - kubelet - kubeadm - kubectl - containerd - containerd-ctr - k9s - uuidgen - openssh-server-pam ssh_pwauth: true # sshd service will be configured to accept password authentication method password: changeme # Set a password for alpine chpasswd: expire: false # Don't ask for password reset after the first log-in ssh_authorized_keys: - ssh-ed25519 your key you@example.com users: - default - name: k8s doas: - permit nopass k8s as root ssh_authorized_keys: - ssh-ed25519 your key you@example.com runcmd: - | # mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup uuidgen > /etc/machine-id sed -i 's/^#UsePAM no/UsePAM yes/' /etc/ssh/sshd_config && /etc/init.d/sshd restart echo $(ifconfig eth0 | grep 'inet addr:' | cut -d: -f2| cut -d' ' -f1) $(hostname) >> /etc/hosts (cd /lib/modules && ln -s 6.6.28-0-virt 6.6.14-0-virt && depmod) modprobe br_netfilter sed -ie '/swap/ s/^/#/' /etc/fstab && swapoff -a mount --make-rshared / echo "#!/bin/sh" > /etc/local.d/sharedmetrics.start echo "mount --make-rshared /" >> /etc/local.d/sharedmetrics.start chmod +x /etc/local.d/sharedmetrics.start rc-update add local default rc-update add cgroups rc-update add containerd rc-update add kubelet rc-update add ntpd rc-service ntpd start rc-service cgroups start rc-service containerd start echo 1 > /proc/sys/net/ipv4/ip_forward kubeadm config images pull 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 mkdir ~/.kube mkdir -p /root/.kube/ && ln -s /etc/kubernetes/admin.conf /root/.kube/config export KUBECONFIG=/etc/kubernetes/admin.conf while ! kubectl cluster-info ; do echo waiting for api server ; sleep 1; done kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml kubectl taint nodes --all node-role.kubernetes.io/control-plane- echo "cloud-init schema" cloud-init schema --system echo "cloud-init status" cloud-init status --long