By accessing the website and accepting the Cookie Policy, you agree to use the cookies provided by the Site in accordance with to analyze traffic, remember your preferences, and optimize your experience.
K3s K8s    2024-04-15 17:36:06    8    0    0

在使用tailscale混合组网时,部分只有IPv6的节点无法访问docker、github等源站获取镜像,导致无法部署pod。尽管可以使用warp-cli让本机获取访问IPv4网络资源的能力,但仍然无法让这些只有IPv6的节点在k3s集群内部正确拉取IPv4 only的Image镜像。

解决方案:

为了解决这个问题,可以采取以下步骤:

  1. 安装warp-cli并启用socks5代理,指定端口;
  2. 使用环境变量来配置节点的网络设置;
  3. 重启k3s或k3s-agent,应用设置;

优化使用tailscale混合组网时只有IPv6节点无法访问docker和github的问题

在只有IPv6的节点上执行以下命令,安装并注册warp-cli:

  1. apt update && apt install lsb-release gpg curl wget
  2. curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg
  3. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/cloudflare-client.list
  4. apt update && apt install cloudflare-warp -y
  5. warp-cli register -y

执行以下命令,配置warp为proxy模式,并指定系统代理:

  1. warp-cli add-excluded-route ::0/0
  2. #warp-cli set-mode warp
  3. warp-cli set-mode proxy
  4. warp-cli set-proxy-port 9091
  5. warp-cli
2024-03-28 14:28:36    17    0    0

起因

由于 LXC 容器无法使用 overlay2​ 存储层,为了保持与 Docker 的兼容性,默认存储层一直采用 vfs​。vfs 存储层的劣势很明显,目前的 lxc 虽然只部署 7 个 Docker 项目,但 /var/lib/docker​ 目录空间占用高达 70GB,因此迫切需要为 vfs 存储层寻找替代品,查阅众多资料后发现 fuse-overlayfs​ 可以解决这个问题,但lxc有些系统无法通过apt直接安装 fuse-overlayfs,因此就有了这篇文章,详细记录了 lxc 切换 vfs 存储层驱动为 fuse-overlayfs​ 的详细过程。

Docker 存储层

Docker容器分层

Docker 容器采用分层结构,其层级如同洋葱般逐一累加(layers、RUN、COPY、ADD)。这意味着 Dockerfile 中的每个命令将在容器内创建一个新层。每一层仅存储相较于上一层新增的修改内容,从而实现容器间的层级共享,降低存储空间占用和下载时间。然而,需要注意的是,这些层是可以访问的,因此不可通过增加额外层级来保护敏感信息。

在典型的系统环境中,Docker 使用联合文件系统(基于 MergerFS)透明地合并了所需的层级。Docker 将此称为 overlay2(默认存储驱动程序)。这样就创建了一个由所有层级共同组成的单个文件系统,而无需复制文件。容器看到的是一个完整的文件系统,但它实质是由多个文件系统组合而成。

LXC中的容器分层

在 LXC 中运行 Docker 时,默认的 overlay2 存储驱动程序不可用,因为 LXC 无法挂载这些高级的 overlay 文件系统(它们是内核构建的)。相反,LXC 使用 vfs,虽然较简单,但也存在一些重大问题。vfs 不会像 overlay2 那样仅更改写入磁盘,而是对现有的整个文件系统进行深度复制,以便在上一层基础上创建下一层。这意味着容器会消耗更多的空间,因为许多基础操作系统文件将在每个层中重复出现,从而显著增加磁盘使用率。因此,多个容器也无法共享相同的底层。强制使用 overlay2 也不会改善这种情况:

  1. ERRO[2021-09-30T09:24:56.9
k3s k8s rancher etcd    2023-12-08 15:05:22    51    0    0

定位问题

rancher部署的k3s集群无法加入新的etcd节点,查询日志发现报错,etcd群组中出现本应该已被删除的节点prepaid-de,此节点已经被删除,但却错误的留在了etcd member list中,导致etcd服务无法正常验证。

解决思路

移除已经无效的节点prepaid-de,恢复etcd集群的可用性。

解决方案

在k3s集群主控节点安装etcdctl工具。 

一、安装etcdctl

方法一:可以使用apt install命令直接进行安装

apt install etcd-client

方法二:下载对应etcd版本的etcdctl工具手动安装

首先查询获取etcd的版本

curl -L --cacert /var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --cert /var/lib/rancher/k3s/server/tls/etcd/server-client.crt --key /var/lib/rancher/k3s/server/tls/etcd/server-client.key <https://127.0.0.1:2379/version>

修改ETCD-VER=v 之后的版本号为之前获取到的数字,运行以下命令安装对应版本etcdctl

ETCD_VER=v3.5.0
# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gzrm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gztar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.
pve    2023-12-08 15:04:59    105    0    0

1、合并存储 删除local-lvm存储空间

lvremove
lvremove pve/data lvextend -l +100%FREE -r pve/root


2、web界面删除local-lvm

数据中心-存储-删除local-lvm 编辑local,内容里添加 磁盘映像和容器​


2023-12-08 15:04:59    142    0    0

K3s、ZFS

不幸的是,在从 ext4 迁移到 ZFS 之后,我发现k3s由于缺少对overlayfsZFS 的支持而导致崩溃。

在解决这个问题之前,我升级到 Debian bullseye。

k3s, ZFS 和 overlayfs

k3s​目前不支持 ZFS 快照程序。可以通过三种方法解决此问题:

  • 使用外部 containerd 和 ZFS 快照程序(containerd​支持 ZFS)。然而,我就没那么幸运了,几个小时后我就放弃了。
  • 使用native​ snapshotter,它速度较慢并且消耗更多磁盘(将产生很多重复文件),但它可以工作。

    • 只需编辑/etc/systemd/system/k3s.service​并添加--snapshotter native​到k3s server​项目之后。
  • 为k3s ”agent” 创建专用的ext4分区格式的ZVOL卷 。这是我最终选择的解决方案,因为它速度更快且占用空间更少。

为k3s创建ZVOL

我们将利用 ZFS 的 ZVOL 功能来创建一个 ext4 卷以用作 overlayfs 的后端。ZVOL 是 ZFS 可以向系统公开的块设备(与作为 ZFS 文件系统的数据集相反)。这些 ZVOL 可以像普通块设备一样使用:我们将创建其中一个,用 ext4 格式化它并用它来托管 k3s agent目录。

  1. # use zfs list see the zfs root path name and the space of disk, in my server which on PVE7 it's "rpool"
  2. zfs list
  3. # Create a sparse (-s) zvol (-V).
  4. # "Sparse" means that the volume will be allocated as data is written into the
  5. # volume. So this ZVOLs will grow over time, when needed, until 90G
  6. zfs create -s -V 90GB rpool/k3s-agent
  7. # Format the ZVOL as ext4
  8. mkfs.ext4 /dev/zvol/rpool/k3s-agent
  9. # Now you nee
pve    2023-12-08 15:04:59    87    0    0

之前用卷组的方法也可以,而且其实性能是一样的。

此方法只适用于Linux,而windows上应该是没办法的,至少我没想到什么办法通过DD的方式来整个软raid 0出来。

过程如下:

 

cat /proc/mdstat

mdadm /dev/md2 --fail /dev/sdb2

mdadm /dev/md2 --remove /dev/sdb2

wipefs -a /dev/sdb2

mdadm --grow /dev/md2 --level=0
mdadm --grow /dev/md2 --level=0 --raid-devices=2 --add /dev/sdb2

watch cat /proc/mdstat
# 等待重建完毕

mdadm --misc --detail /dev/md2

resize2fs /dev/md2


df -h

其中等待的那个过程非常非常漫长,比拜登那漫长而响亮的屁要漫长的多,建议睡觉前运行,睡醒了可能会做好。

最终结果如下:



pve    2023-12-08 15:04:59    207    0    0

目前这个需求已经有人开发了工具,可以直接结合Proxmox VE 内部的备份工具,可以在Backup Log 中看到Rclone 的相关Log,搭配Proxmoe VE 内建CRON 自动备份到各种网路空间,非常方便:

安装Rclone

在Proxmox VE 中以root 身份登入,直接使用指令安装rclone

apt update
apt install rclone -y

或到Rclone 的官网下载安装:

初始化 Rclone

请务必仔细跟着设定,或是你自己去研究rclone 的config

# rclone config
2021/10/08 02:03:49 NOTICE: Config file "/root/.config/rclone/rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> gd-backup_crypt # 务必使用这个名字,或是之后改脚本
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
~~
15 / Google Drive
\ "drive"
~~
Storage> 15
Google Application Client Id
Setting your own is recommended.
See https://rclone.org/drive/#making-your-own-client-id for how to create your own.
If you leave this blank, it will use an internal key which is low performance.
Enter a string value. Press Enter for the default ("").
client_id> 123456789-xxx