从零开始基于Archlinux 安装 containerd + k8s

打印 上一主题 下一主题

主题 558|帖子 558|积分 1674

下载ISO文件:https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/
k8s: v1.26.4;calico: 3.25.1

目录

1. 准备工作

以虚拟机VMWare为例。
使用EFI 非默认BIOS启动。如果不使用EFI,那么后续安装引导时也使用非EFI。

  • Controller-Panel节点(master)
    节点列表:
    hostnameipk8s-master110.0.2.101/24k8s-master210.0.2.102/24k8s-master310.0.2.103/24CPU设置:2Core
    内存设置:2GB
    磁盘:20GB
    网卡设置:网卡1(ens33)为自定义NAT
  • Worker节点
    节点列表:
    hostnameipk8s-worker110.0.2.111/24k8s-worker210.0.2.112/24k8s-worker310.0.2.113/24CPU设置:2Core
    内存设置:4GB
    磁盘:20GB
    网卡设置:网卡1(ens33)为自定义NAT
2. 磁盘管理

2.1 磁盘分区

使用GUID分区表,分2个区:

  • 1)EFI System(EF00),Last sector: +500M (500MB)
  • 2)Linux filesystem(8300) ,Last sector:(为剩余容量)
  1. gdisk /dev/sda
复制代码
2.2 磁盘格式化
  1. mkfs.vfat -F32 /dev/sda1 # ESP分区 挂载 /boot
  2. mkfs.ext4 /dev/sda2 # LFS分区 挂载 /
复制代码
2.3 磁盘挂载
  1. mount /dev/sda2 /mnt # 挂载root分区
  2. mkdir /mnt/boot # 创建 /boot 目录
  3. mount /dev/sda2 /mnt/boot # 挂载boot分区
  4. lsblk # 查看分区挂载情况
复制代码
3. 安装系统

3.1 安装系统文件
  1. vim /etc/pacman.d/mirrorlist # 在顶部添加如下镜像服务器
  2. Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
  3. #Server = https://mirrors.aliyun.com/archlinux/$repo/os/$arch
复制代码
  1. # 安装系统
  2. pacstrap /mnt base base-devel
复制代码
3.2 配置fstab
  1. genfstab -U /mnt > /mnt/etc/fstab # 生成分区挂载表
复制代码
编辑 fstab
  1. vim /mnt/etc/fstab
  2. # SSD的追加options “discard,noatime”
复制代码
3.3 配置系统

编辑 /mnt/etc/pacman.conf文件,加入下面的内容:
  1. [archlinuxcn]
  2. Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
  3. #Server = https://mirrors.aliyun.com/archlinuxcn/$arch
复制代码
切换root目录到新系统
  1. arch-chroot /mnt /bin/bash
复制代码
现在可以全面升级系统:
  1. pacman -Syy # 切换了root目录,因此需要重新更新软件包缓存
  2. pacman -S archlinuxcn-keyring
  3. pacman -S vim bash-completion yay fakeroot
  4. ln -s /usr/bin/vim /usr/bin/vi
复制代码
3.4 安装引导程序
  1. # 安装linux内核
  2. pacman -S linux-lts linux-firmware
  3. # 安装 Micro Code
  4. pacman -S amd-ucode # intel安装 intel-ucode
复制代码
  1. bootctl install # boot-loader
  2. vim /boot/loader/entries/arch.conf
  3. title Arch Linux
  4. linux /vmlinuz-linux-lts
  5. initrd /amd-ucode.img # intel的为 /intel-ucode.img
  6. initrd /initramfs-linux-lts.img
  7. options root=/dev/sda2 rw
  8. vim /boot/loader/entries/arch-fallback.conf
  9. title Arch Linux (fallback initramfs)
  10. linux /vmlinuz-linux-lts
  11. initrd /amd-ucode.img # intel的为 /intel-ucode.img
  12. initrd /initramfs-linux-lts-fallback.img
  13. options root=/dev/sda2 rw
  14. vim /boot/efi/loader/loader.conf
  15. default arch.conf
  16. timeout 2
  17. console-mode max
  18. editor no
  19. # 验证文件路径是否正确
  20. bootctl list
  21. bootctl status
复制代码
3.5 安装OpenSSH
  1. pacman -S openssh
  2. sed -i 's/#PermitRootLogin\ prohibit-passwd/PermitRootLogin yes/g' /etc/ssh/sshd_config
  3. systemctl enable sshd
复制代码
3.6 主机名
  1. echo <host-name> > /etc/hostname
复制代码
3.7 设置root密码
  1. passwd
复制代码
3.8 网络配置

使用 systemd-networkd
  1. VMWare 网络配置:
  2. NAT模式
  3. 网段:10.0.2.0/24
  4. DHCP:10.0.2.200 - 10.0.2.254
  5. 网关:10.0.2.2 (不要设置为10.0.2.1,否则会导致无法访问外网)
复制代码
  1. vim /etc/systemd/network/20-wired.network
  2. [Match]
  3. Name=ens33
  4. [Network]
  5. #DHCP=ipv4 # 使用dhcp时启用
  6. Address=10.0.2.101/24
  7. Gateway=10.0.2.2
  8. DNS=223.5.5.5
  9. DNS=223.6.6.6
复制代码
  1. systemctl enable systemd-networkd
  2. systemctl enable systemd-resolved
复制代码
3.9 重启系统,并从硬盘引导
  1. exit # 退出chroot
  2. reboot # 重启后重新引导进入已安装的系统
复制代码
3.10 本地化配置
  1. vim /etc/locale.gen
  2. en_US.UTF-8 UTF-8
  3. zh_CN.GBK GBK
  4. zh_CN.UTF-8 UTF-8
  5. zh_CN GB2312
复制代码
  1. locale-gen # 生成locale
  2. echo 'LANG=en_US.UTF-8' > /etc/locale.conf # 设置默认的 locale
复制代码
3.11 时区配置
  1. ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
复制代码
3.12 硬件时间设置
  1. # date -s '2022-7-5 16:49:45'
  2. hwclock --systohc --utc #采用UTC,将系统时间写入硬件时钟
  3. # hwclock --hctosys --utc #采用UTC,将硬件时钟写入系统时间
复制代码
3.13 安装DNS服务
  1. pacman -S bind
  2. # 参见: https://wiki.archlinux.org/title/BIND
复制代码
4. 安装k8s

使用kubeadm安装: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
  1. pacman -S kubeadm kubelet kubectl containerd
  2. systemctl enable containerd
  3. systemctl start containerd
  4. systemctl enable kubelet
  5. systemctl start kubelet
复制代码
4.1 配置containerd

创建 /etc/modules-load.d/containerd.conf 配置文件:
  1. cat << EOF > /etc/modules-load.d/containerd.conf
  2. overlay
  3. br_netfilter
  4. EOF
复制代码
修改 containerd 配置
  1. # 修改配置
  2. mkdir -p /etc/containerd
  3. if [ ! -f /etc/containerd/config.toml ]; then
  4.     containerd config default > /etc/containerd/config.toml
  5. fi
  6. # 设置 systemd_cgroup 为 true
  7. sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
  8. sed -i 's/k8s.gcr.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml
  9. systemctl restart containerd
  10. echo 'alias docker="crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock"' > /etc/profile.d/containerd.sh
  11. source /etc/profile.d/containerd.sh
  12. # 确保containerd 的cgroup 为 SystemdCgroup
  13. crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock info | grep SystemdCgroup | awk -F ': ' '{ print $2 }'
  14. true
复制代码
4.2 拉取k8s镜像

通过参数 --image-repository 指定k8s镜像的仓库地址
  1. kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.26.4
复制代码
4.3 创建k8s集群
  1. # 应搭建负载均衡后,使用负载均衡IP,此处用自建DNS服务来实现: 10.0.2.101 cluster.berkaroad.com
  2. # 这个版本的kubelet,命令行参数 `--cni-bin-dir` 已经取消,因此需要拿掉此参数
  3. sed -i 's/--cni-bin-dir=\/usr\/lib\/cni//g' /etc/kubernetes/kubelet.env
  4. # 初始化k8s集群
  5. kubeadm init  --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.26.4 --control-plane-endpoint=cluster.berkaroad.com --apiserver-advertise-address=10.0.2.101 --pod-network-cidr=10.100.0.0/16 --service-cidr=10.101.0.0/16 --service-dns-domain=cluster.berkaroad.com --upload-certs --v=5
  6. # 执行成功后,根据提示,配置
  7. mkdir -p $HOME/.kube
  8. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  9. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  10. # 注意:集群中时间必须保持一致,否则会加入集群失败,错误信息: x509: certificate has expired or is not yet valid: current time 2022-07-05T03:57:41+08:00 is before 2022-07-04T23:42:18Z
  11. # You can now join any number of the control-plane node running the following command on each as root:
  12. kubeadm join cluster.berkaroad.com:6443 --token v3e3b4.a52hqkbd1rlxgkun \
  13.     --discovery-token-ca-cert-hash sha256:877bc4de6051c6aee8401bb99e6a3114f6d5a5fa7d87131c0b6377ce2419e5a3 \
  14.     --control-plane --certificate-key 6b6050b43696814460032c521569377829e6bda6d39ac69e1d650d5bfdad1a44
  15. # 如果 --certificate-key 过期了,执行如下:
  16. kubeadm init phase upload-certs --upload-certs
  17. # Then you can join any number of worker nodes by running the following on each as root:
  18. kubeadm join cluster.berkaroad.com:6443 --token v3e3b4.a52hqkbd1rlxgkun \
  19.     --discovery-token-ca-cert-hash sha256:877bc4de6051c6aee8401bb99e6a3114f6d5a5fa7d87131c0b6377ce2419e5a3
  20. # 如果token过期了,可以执行如下:
  21. kubeadm token create --print-join-command
  22. # 如果失败,检查 cgroup 是否一致(docker或者containerd 和 kubelet)
  23. # 查看 kubeadm 使用的 CRI 为 containerd 还是 docker
  24. cat /var/lib/kubelet/kubeadm-flags.env
  25. KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9"
  26. # 查看 kubelet 的 cgroup driver
  27. cat /var/lib/kubelet/config.yaml | grep cgroupDriver | awk -F ': ' '{ print $2 }'
  28. systemd
复制代码
4.4 加入control-plane节点
  1. # 应搭建负载均衡后,使用负载均衡IP
  2. echo '10.0.2.101 cluster.berkaroad.com' >> /etc/hosts
  3. # 这个版本的kubelet,命令行参数 `--cni-bin-dir` 已经取消,因此需要拿掉此参数
  4. sed -i 's/--cni-bin-dir=\/usr\/lib\/cni//g' /etc/kubernetes/kubelet.env
  5. # 注意:集群中时间必须保持一致,否则会加入集群失败,错误信息: x509: certificate has expired or is not yet valid: current time 2022-07-05T03:57:41+08:00 is before 2022-07-04T23:42:18Z
  6. # You can now join any number of the control-plane node running the following command on each as root:
  7. kubeadm join cluster.berkaroad.com:6443 --token v3e3b4.a52hqkbd1rlxgkun \
  8.     --discovery-token-ca-cert-hash sha256:877bc4de6051c6aee8401bb99e6a3114f6d5a5fa7d87131c0b6377ce2419e5a3 \
  9.     --control-plane --certificate-key 6b6050b43696814460032c521569377829e6bda6d39ac69e1d650d5bfdad1a44
  10. # 如果 --certificate-key 过期了,执行如下:
  11. kubeadm init phase upload-certs --upload-certs
  12. # 如果token过期了,可以执行如下:
  13. kubeadm token create --print-join-command
  14. # 执行成功后,根据提示,配置
  15. mkdir -p $HOME/.kube
  16. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  17. sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码
4.5 加入worker节点
  1. # 应搭建负载均衡后,使用负载均衡IP
  2. echo '10.0.2.101 cluster.berkaroad.com' >> /etc/hosts
  3. # 这个版本的kubelet,命令行参数 `--cni-bin-dir` 已经取消,因此需要拿掉此参数
  4. sed -i 's/--cni-bin-dir=\/usr\/lib\/cni//g' /etc/kubernetes/kubelet.env
  5. # 执行成功后,根据提示,配置
  6. mkdir -p $HOME/.kube
  7. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  8. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  9. # 注意:集群中时间必须保持一致,否则会加入集群失败,错误信息: x509: certificate has expired or is not yet valid: current time 2022-07-05T03:57:41+08:00 is before 2022-07-04T23:42:18Z
  10. # Then you can join any number of worker nodes by running the following on each as root:
  11. kubeadm join cluster.berkaroad.com:6443 --token v3e3b4.a52hqkbd1rlxgkun \
  12.     --discovery-token-ca-cert-hash sha256:877bc4de6051c6aee8401bb99e6a3114f6d5a5fa7d87131c0b6377ce2419e5a3
  13. # 如果token过期了,可以执行如下:
  14. kubeadm token create --print-join-command
复制代码
4.6 安装CNI:Calico
  1. kubectl apply -f https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml
复制代码
4.7 查看k8s集群

节点信息:
  1. kubectl get no -o wide
  2. NAME          STATUS   ROLES           AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE     KERNEL-VERSION   CONTAINER-RUNTIME
  3. k8s-master1   Ready    control-plane   23m   v1.26.3   10.0.2.101    <none>        Arch Linux   6.1.25-1-lts     containerd://1.7.0
  4. k8s-master2   Ready    control-plane   22m   v1.26.3   10.0.2.102    <none>        Arch Linux   6.1.25-1-lts     containerd://1.7.0
  5. k8s-master3   Ready    control-plane   22m   v1.26.3   10.0.2.103    <none>        Arch Linux   6.1.25-1-lts     containerd://1.7.0
  6. k8s-worker1   Ready    <none>          20m   v1.26.3   10.0.2.111    <none>        Arch Linux   6.1.25-1-lts     containerd://1.7.0
  7. k8s-worker2   Ready    <none>          18m   v1.26.3   10.0.2.112    <none>        Arch Linux   6.1.25-1-lts     containerd://1.7.0
  8. k8s-worker3   Ready    <none>          17m   v1.26.3   10.0.2.113    <none>        Arch Linux   6.1.25-1-lts     containerd://1.7.0
复制代码
pod信息:
  1. kubectl get po -n kube-system
  2. NAME                                      READY   STATUS    RESTARTS      AGE
  3. calico-kube-controllers-57b57c56f-g62jv   1/1     Running   0             6m5s
  4. calico-node-2b5f9                         1/1     Running   0             6m5s
  5. calico-node-flbmt                         1/1     Running   0             6m5s
  6. calico-node-hwtvh                         1/1     Running   0             6m5s
  7. calico-node-j6dkp                         1/1     Running   0             6m5s
  8. calico-node-jqcfg                         1/1     Running   0             6m5s
  9. calico-node-lrq7q                         1/1     Running   0             6m5s
  10. coredns-5bbd96d687-fd9j7                  1/1     Running   0             24m
  11. coredns-5bbd96d687-kd48v                  1/1     Running   0             24m
  12. etcd-k8s-master1                          1/1     Running   0             25m
  13. etcd-k8s-master2                          1/1     Running   0             23m
  14. etcd-k8s-master3                          1/1     Running   0             23m
  15. kube-apiserver-k8s-master1                1/1     Running   0             25m
  16. kube-apiserver-k8s-master2                1/1     Running   0             23m
  17. kube-apiserver-k8s-master3                1/1     Running   0             23m
  18. kube-controller-manager-k8s-master1       1/1     Running   0             25m
  19. kube-controller-manager-k8s-master2       1/1     Running   0             23m
  20. kube-controller-manager-k8s-master3       1/1     Running   0             22m
  21. kube-proxy-6v7b9                          1/1     Running   0             18m
  22. kube-proxy-7dnmx                          1/1     Running   0             22m
  23. kube-proxy-c2cdd                          1/1     Running   0             23m
  24. kube-proxy-k4l4c                          1/1     Running   0             19m
  25. kube-proxy-rjw8j                          1/1     Running   0             24m
  26. kube-proxy-zrcvw                          1/1     Running   0             23m
  27. kube-scheduler-k8s-master1                1/1     Running   0             25m
  28. kube-scheduler-k8s-master2                1/1     Running   0             23m
  29. kube-scheduler-k8s-master3                1/1     Running   0             23m
复制代码
附录

包签名错误
  1. error: libcap: signature from "David Runge <dvzrv@archlinux.org>" is marginal trust
  2. :: File /var/cache/pacman/pkg/libcap-2.65-1-x86_64.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).
  3. Do you want to delete it? [Y/n] Y
  4. error: failed to commit transaction (invalid or corrupted package)
  5. Errors occurred, no packages were upgraded.
复制代码
更新pacman key证书
  1. pacman -S gnupg
  2. pacman -Sy archlinux-keyring
  3. pacman-key --populate archlinux
  4. pacman-key --refresh-keys
  5. pacman -Syux
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表