k3s

3rd November 2021 at 1:39pm

k3s 是一个可以单机运行、最低内存要求仅有 512M 的轻量级 k8s 发行版。

下面的使用经验基于 v1.18.2+k3s1

安装

设置 Docker Hub 的镜像,可以让你避开官方 Docker Hub 的频率限制和缓慢的速度。使用什么镜像,参考这篇 文章。在安装 k3s 之前,先在 /etc/rancher/k3s/registries.yaml 写入:

mirrors:
  docker.io:
    endpoint:
      - "https://<look-enpass>.mirror.aliyuncs.com"

同时在 /etc/rancher/k3s/config.yaml 写入这些配置,使得非 root 用户也可以使用 kubectl

write-kubeconfig-mode: "0644"

由于使用 Traefik 时需要修改默认的配置,因此不要让 K3s 自动安装 Traefik,不然每次重启 k3s 时会覆盖掉你在 /var/lib/rancher/k3s/server/manifests/traefik.yaml 中的修改:

curl -sfL https://get.k3s.io | sh -s - server --no-deploy traefik

稍等片刻后,检查结点是否 ready:

kubectl get nodes

k8s yaml 位置

将各种 YAML 文件放进这个目录,效果等同于 kubectl apply -f

/var/lib/rancher/k3s/server/manifests

Traefik

将 GitHub 上的 traefik.yaml 文件放入 /var/lib/rancher/k3s/server/manifests/ 中,稍等片刻,容器起来后就可正常运行。

同时参考 Traefik

问题

我在 Shopee 的一台 VM 安装 k3s 时,kubectl get pods -n kube-system 发现所有系统 pod 都起不来(都在 creating 状态);查 event 或者 journalctl 时会发现有这样的错:

RunPodSandbox from runtime service failed: rpc error: code = Unknown desc = failed to get sandbox image "docker.io/rancher/pause:3.1": failed to pull image "docker.io/rancher/pause:3.1": failed to pull and unpack image "docker.io/rancher/pause:3.1": failed to resolve reference "docker.io/rancher/pause:3.1": failed to do request: Head "https://registry-1.docker.io/v2/rancher/pause/manifests/3.1": dial tcp: lookup registry-1.docker.io: no such host

抓包看了一下,containerd 会发两个 DNS 请求,分别查 IPv4 和 IPv6 地址。IPv4 的能查到,IPv6 的查不到。然后就会报错。这可能跟 go 的这个 issue 有关。我没有深究原因,尝试往 /etc/systemd/system/k3s.service.env 写入了这行,再重启 k3s,解决了:

GODEBUG=netdns=go