容器里装 K3S
目前卡在问题一,方案未成功。记录一下折腾的方案。
compose.yaml 配置
version: '3'
services:
server:
image: "rancher/k3s:v1.22.5-k3s1"
command: server
ulimits:
nproc: 65535
nofile:
soft: 65535
hard: 65535
privileged: true
network_mode: host
# ipc: host
restart: always
environment:
- K3S_TOKEN=${K3S_TOKEN:?err}
- K3S_KUBECONFIG_OUTPUT=/output/kubeconfig.yaml
- K3S_KUBECONFIG_MODE=666
volumes:
# 把 /var/run 都挂载到容器里
- /run:/run
- /var/run:/var/run
# rancher/k3s image 设置了这几个 volume。必须重新映射到本机目录,否则 docker 会映射到随机目录。
# 导致宿主机和容器的 /var/lib/kubelet 不一致而出问题
- /var/lib/cni:/var/lib/cni
- /var/lib/kubelet:/var/lib/kubelet
- /var/log:/var/log
# k3s 配置
- ./k3s-server-conf.yaml:/etc/rancher/k3s/config.yaml
# k3s 数据
- ./var_lib_rancher_k3s:/var/lib/rancher/k3s
# 为了得到 kubeconfig 文件
- ./data:/output
k3s 配置
k3s-server-conf.yaml 文件内容:
node-name: m1
# docker: true
container-runtime-endpoint: unix:///run/containerd/containerd.sock
pause-image: rancher/pause:3.6
data-dir: /var/lib/rancher/k3s
kube-apiserver-arg:
feature-gates=EphemeralContainers=true
kubelet-arg:
cgroup-driver=systemd
# kube-scheduler-arg:
# kube-controller-manager-arg:
# kube-cloud-controller-manager-arg:
# kube-proxy-arg:
# etcd-arg:
容器内的 k3s 连接宿主机运行的 containerd 或者 dockerd。即 Docker-out-of-Docker 方案。
这样能启动 K3S,只是仍有问题。
问题一
K8S 的 projected volume 是以 tmpfs 保存的。比如 POD 无法获得 ServiceAccountToken。
比如 /var/lib/kubelet/pods/a2c46529-1a61-4834-858b-b154a9fed484/volumes/kubernetes.io~projected/kube-api-access-s42f6
这里面的文件,在宿主机上是空的。但在 k3s 容器里是有文件的。 因为宿主机没法访问容器内的 tmpfs 文件。导致 POD 无法正常启动。