K8s

来自 Alpine Linux

Alpine Linux 🌲 K8s 10 分钟速成

摘要

本指南将帮助您在 10 分钟内将全新的 Alpine Linux 安装部署到 Kubernetes K8 集群中。

为什么

我最近开始学习 Kubernetes,并在大约一个小时内使用 Alpine 构建了一个 k3 集群,这是一次很棒的体验。我认为下一步应该是 K8s,但我没有找到关于 Alpine 上 K8s 的任何资料。本指南是我第一次尝试的结果,并融入了贡献者的高质量笔记。Kubernetes 🦄 非常棒。

贡献者


在 Alpine Linux 🌲 上构建 K8s

前提条件 🔍

您需要安装 Alpine Linux(本指南基于 3.17 标准镜像编写),并具备互联网访问。我建议每个节点至少配备 2 个 CPU、4GB 内存和 10GB 磁盘空间。

对于 HA 控制平面,您至少需要三个节点

1. 设置仓库 📗

更新您的 /etc/apk/repositories 下的仓库,以包含 communityedge communitytesting

/etc/apk/repositories 的内容/etc/apk/repositories

#/media/cdrom/apks http://dl-cdn.alpinelinux.org/alpine/v3.20/main http://dl-cdn.alpinelinux.org/alpine/v3.20/community #http://dl-cdn.alpinelinux.org/alpine/edge/main http://dl-cdn.alpinelinux.org/alpine/edge/community http://dl-cdn.alpinelinux.org/alpine/edge/testing

2. 节点设置 🖥️

这一系列命令解决了一系列递增的问题,并设置系统(如果是第一个控制节点),以便 kubectl/kubeadm 在下次登录时通过链接配置正确运行。

这里的结果为您提供了一个功能正常的节点,该节点可以加入现有集群,或者成为新集群的第一个控制平面。 🎶

注意: 🔔 此构建假设 CNI 使用 flannel 进行网络连接。如果您想使用 calico,请跳过 flannel 软件包 🔔

添加用于网络连接的内核模块

# echo "br_netfilter" > /etc/modules-load.d/k8s.conf # modprobe br_netfilter # sysctl net.ipv4.ip_forward=1 # echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

内核配置

# echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf # sysctl net.bridge.bridge-nf-call-iptables=1


安装 Kubernetes 软件包

# apk add cni-plugin-flannel # apk add cni-plugins # apk add flannel # apk add flannel-contrib-cni # apk add kubelet # apk add kubeadm # apk add kubectl # apk add containerd # apk add uuidgen # apk add nfs-utils

移除 swap

# cp -av /etc/fstab /etc/fstab.bak # sed -i '/swap/s/^/#/' /etc/fstab # swapoff -a

修复 prometheus 错误

# mount --make-rshared /

  1. echo "#!/bin/sh" > /etc/local.d/sharemetrics.start
  2. echo "mount --make-rshared /" >> /etc/local.d/sharemetrics.start
  3. chmod +x /etc/local.d/sharemetrics.start
  4. rc-update add local

修复 id 错误消息

# uuidgen > /etc/machine-id

将 containerd sandbox_image 更新到最新版本(在 K8S v1.30 中为 pause:3.9)

# sed -i 's/pause:3.8/pause:3.9/' /etc/containerd/config.toml

在所有控制平面和工作节点上添加 Kubernetes 服务

# rc-update add containerd # rc-update add kubelet # rc-service containerd start

启用时间同步(如果使用默认 chrony,则在 3.20 中不需要)

# rc-update add ntpd # rc-service ntpd start

选项 1 - 使用 flannel 作为您的 CNI

注意:在较新版本的 flannel 软件包上,这可能不再必要

# ln -s /usr/libexec/cni/flannel-amd64 /usr/libexec/cni/flannel

选项 2 - 使用 calico 作为您的 CNI 注意:如果您使用 calico,则在 3.20 中这是必需的

# ln -s /opt/cni/bin/calico /usr/libexec/cni/calico # ln -s /opt/cni/bin/calico-ipam /usr/libexec/cni/calico-ipam

锁定您的版本!如果您更新并且节点失去同步,它会崩溃。

# apk add 'kubelet=~1.30' # apk add 'kubeadm=~1.30' # apk add 'kubectl=~1.30'

注意: 将来您将需要以相同的方式手动添加更新的版本以进行升级。

您的空白节点现在已准备就绪!如果是第一个节点,您需要创建一个控制节点。

3. 设置控制平面 (新集群!) 🦾

运行此命令以启动集群,然后应用网络。

#do not change subnet
kubeadm init --pod-network-cidr=10.244.0.0/16 --node-name=$(hostname)
mkdir ~/.kube
ln -s /etc/kubernetes/admin.conf /root/.kube/config
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

您现在拥有一个控制平面。这也为您提供了在空白节点上运行的命令,以将它们作为工作节点添加到此集群中。

4. 加入集群。 🐜

运行此命令从控制平面获取加入命令,然后您将在新的工作节点上运行该命令。

kubeadm token create --print-join-command 

奖励 💰

在 K8s 上设置 NFS 挂载

这可以是共享的 NFS 存储,以允许自动持久卷声明实现。您需要更新您的 IP 地址和导出信息。

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --set nfs.server=192.168.1.31 \
    --set nfs.path=/exports/cluster00

现在为集群设置默认存储类。

kubectl get storageclass
kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

系统检查 👀

检查您的系统。

kubectl get nodes
kubectl get all
kubectl events -A

云端奖励 🌦️

云初始化版本的描述可在 K8s_with_cloud-init 中找到