手搓跨云k3s集群

根据我个人跨云的经验来手搓的,有些改动。

准备操作

Debian环境准备

安装基础环境

apt install --no-install-recommends --no-install-suggests -y -qq nfs-common iptables conntrack jq socat bash-completion open-iscsi rsync ipset ipvsadm htop net-tools wget psmisc git curl nload ebtables ethtool
systemctl enable --now iscsid
mkdir -pv /etc/systemd/system.conf.d
cat > /etc/systemd/system.conf.d/30-k8s-ulimits.conf < /etc/modules-load.d/10-k8s-modules.conf <<EOF
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF

systemctl daemon-reload
systemctl restart systemd-modules-load
systemctl restart systemd-journald

k3s准备

# 国外
wget https://github.com/k3s-io/k3s/releases/download/v1.27.4+k3s1/k3s
# 国内
wget https://ghproxy.com/https://github.com/k3s-io/k3s/releases/download/v1.27.4+k3s1/k3s
chmod  x k3s
mv k3s /usr/local/bin/k3s

mysql部署

version: '2.1'

services:
  mysql:
    image: docker.io/bitnami/mysql:8.0
    container_name: mysql
    ports:
      - '3306:3306'
    volumes:
      - '/k8sdata/mysql/data:/bitnami/mysql/data'
    environment:
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - MYSQL_ROOT_PASSWORD=cholei7quohyeaduk9OhTee1faisodaikouv8eep1iuraibuegeijiew7gue5euf
      - MYSQL_DATABASE=teil4Ir5
      - MYSQL_USER=AoQui4gion
      - MYSQL_PASSWORD=shooC9iecoh8aevaingoh2aiNeim3poorahY7too6ahru8saewaih0LizieNevie
      - MYSQL_CHARACTER_SET=utf8mb4
      - MYSQL_COLLATE=utf8mb4_general_ci
    healthcheck:
      test: ['CMD', '/opt/bitnami/scripts/mysql/healthcheck.sh']
      interval: 15s
      timeout: 5s
      retries: 6

volumes:
  mysql_data:
    driver: local

启动mysql

docker-compose up -d

k3s 部署

  • 虽然新版本k3s内置tailscale支持,但是我发现基于跨云tailscale组网,不支持headscale组网,且导致哪吒监控数据流量比较大,暂时就不考虑了。
  • 容器的runtime最好都一致,要不都用docker,要不都是默认内置的containerd
  • 数据存储可以选择熟悉的数据库,我这里选择mysql,master高可用

master节点配置

给个示例的 /etc/systemd/system/k3s.service

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=notify
EnvironmentFile=-/etc/systemd/system/k3s.service.env
KillMode=process
Delegate=yes
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s server \
                --tls-san t1.slb.ns.local \
                --tls-san t2.slb.ns.local \
                --tls-san t1.clb.ns.local \
                --tls-san t2.clb.ns.local \
                --datastore-endpoint mysql://root:cholei7quohyeaduk9OhTee1faisodaikouv8eep1iuraibuegeijiew7gue5euf@tcp(db.slb.ns.local:3306)/ \
                --node-external-ip  \
                --https-listen-port 26443 \
                --cluster-cidr 10.142.0.0/16 \
                --service-cidr 10.143.0.0/16 \
                --flannel-external-ip \
                --flannel-backend wireguard-native \
                --server https://t1.slb.ns.local:26443 \
                --token we3ohCh1ahjeng6goo9hahke0Agoox5a \
                --docker \
                --multi-cluster-cidr \
                --disable-network-policy \
                --disable-helm-controller \
                --disable servicelb,traefik \
                --kube-proxy-arg "proxy-mode=ipvs" "masquerade-all=true" \
                --kube-proxy-arg "metrics-bind-address=0.0.0.0"

worker 节点配置

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=exec
EnvironmentFile=-/etc/systemd/system/k3s.service.env
KillMode=process
Delegate=yes
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s agent \
		--node-external-ip  \
		--server https://t1.clb.ns.local:26443 \
		--token we3ohCh1ahjeng6goo9hahke0Agoox5a \
		--docker \
		--kube-proxy-arg "proxy-mode=ipvs" "masquerade-all=true" \
		--kube-proxy-arg "metrics-bind-address=0.0.0.0"

开机并启动

systemctl enable k3s --now

其他组件安装

  • 跨云分布式存储
  • 内网负载均衡

如果对这些有想法可以再写过文档

最后

不想手搓的可以用rancher或者 https://github.com/cnrancher/autok3s 这两个都是有UI的,我推荐用后者

点赞
  1. sduoduo说道:

    能不能讲一下k3s能干啥?

  2. songshi说道:

    @sduoduo #1

    当我们需要在较小的环境中使用 Kubernetes 时,K3s 可以是一个很好的选择。K3s 是 Rancher Labs 开发的一个轻量级 Kubernetes 版本,可以在较小的硬件配置和低资源环境中运行。以下是 K3s 的一些功能和用途:

    轻量级:K3s 的二进制文件大小不到 50MB,而完整的 Kubernetes 版本大小通常超过 500MB。这使得在资源受限的设备上运行 K3s 变得更加容易。

    快速部署:K3s 可以在几分钟内快速部署,而完整的 Kubernetes 部署通常需要更长的时间。

    简单管理:K3s 可以通过一个单独的二进制文件来启动、停止和升级整个 Kubernetes 环境,这使得管理 K3s 集群变得更加简单。

    低资源消耗:K3s 可以在较小的硬件配置和低资源环境中运行,这使得它成为在 IoT 设备、边缘计算和较小的云服务器上运行 Kubernetes 的理想选择。

    安全性:K3s 与标准 Kubernetes 版本一样安全,但它还包括了对 TLS 加密、RBAC 访问控制和默认启用的网络策略等安全功能。

    生态系统:K3s 兼容标准 Kubernetes API,可以使用多种 Kubernetes 工具和插件,例如 kubectl、Helm 和 Istio 等。

    总的来说,K3s 是一个轻量级的 Kubernetes 版本,非常适合在资源受限的设备中运行 Kubernetes,并且提供了与标准 Kubernetes 版本类似的功能。

  3. ananas说道:

    bd

回复 ananas 取消回复

电子邮件地址不会被公开。必填项已用 * 标注

×
订阅图标按钮