K3s 常见问题
K3s 是否适合替代 k8s?
K3s 几乎可以胜任 k8s 的所有工作, 它只是一个更轻量级的版本。有关更多详细信息,请参见主要文档页面。
如何用自己的 Ingress 代替 Traefik?
只需用--disable traefik
启动 K3s server,然后部署你需要的 ingress。
K3s 是否支持 Windows?
目前,K3s 本身不支持 Windows,但是我们对将来的想法持开放态度。
如何通过源码构建?
请参考 K3s BUILDING.md的说明。
K3s 的日志在哪里?
安装脚本会自动检测你的操作系统是 systemd 或 openrc 并启动服务。
当使用 openrc 运行时,日志将在/var/log/k3s.log
中创建。
当使用 systemd 运行时,日志将在/var/log/syslog
中创建,并使用journalctl -u k3s
查看。
常见安装问题
执行官网提供的安装命令没反应?
执行官网提供的安装脚本安装 K3s,无返回:
解决方案:
- 使用国内安装脚本安装 k3s,详情参考快速入门指南
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
- 或采用离线安装方式安装 k3s
INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
注册 k3s 节点失败
报错:
level=error msg="Node password rejected, duplicate hostname or contents of '/etc/rancher/node/password' may not match server node-passwd entry, try enabling a unique node name with the --with-node-id flag"
原因分析:
根据日志提示大概的原因是两个 k3s 节点主机名重复,或者/etc/rancher/node/password
与 k3s server 的 node-passwd 不匹配造成。
节点注册到 k3s 集群,会在节点的/etc/rancher/node/password
生成一串随机的 password。如果 agent 首次注册,master 节点会把 agent 发送的 node-name 和 node-passwd 解析出来存储到/var/lib/rancher/k3s/server/cred/node-passwd 中。如果 agent 是非首次注册,k3s master 会结合 node-name 和 node-passwd 进行比对,如果信息不一致会拒绝添加节点请求。
解决方案:
为什么会出现 passwd 不一致呢?正常来说如果用 k3s-agent-uninstall.sh 来清理安装过的 agent node,并不会删除 password 文件(/etc/rancher/node/password),那么问题很可能是 VM 重建或者手动操作删除的这个文件。因为 agent 上删除了 password,agent 再次注册时会重新生成 password,就导致了新的 password 和 k3s master 上原先存储的不一致。
- 手动在 agent 上创建 password,内容和 server 中存储保持一致
- 修改 server 中的原始内容,让 password 和 agent 上新生成的保持一致
- 可以试试 agent 注册时使用--with-node-id,这样 server 中认为这完全是新 node,不会用原始信息比对
- 如果是因为主机名冲突导致的报错,可以修改主机名之后从新注册集群
如何创建只带有 master 角色的节点?
默认情况下,k3s 启动 master 节点也同时具有 worker 角色,是可调度的,因此可以在它们上启动工作
解决方案
- 通过 --node-taint
- 通过 --disable-agent
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="--node-taint k3s-controlplane=true:NoExecute" sh -
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="--disable-agent" sh -
跨主机 pod 无法通信?
请参考k3s 网络要求检查主机网络或防火墙,查看 vxlan 对应的 UDP/8472 端口是否开放。
如何指定某个网卡添加 K3S 集群?
可以通过--advertise-address设置 apiserver 向集群成员发布的 IP 地址,详细说明参考K3s Server 配置参考
Demo:
主机 | eth0 | eth1 |
---|---|---|
k3s1 | 10.0.2.15/24 (NAT) | 192.168.99.211/24 (Host-Only) |
k3s2 | 10.0.2.15/24 (NAT) | 192.168.99.212/24 (Host-Only) |
K3s1(master):
# curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC="--advertise-address 192.168.99.211" sh –
K3s2(worker):
# curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC="--node-ip 192.168.99.212" K3S_URL=https://192.168.99.211:6443 K3S_TOKEN=mynodetoken sh -
使用 netstat 无法查到 80 和 443 端口?
K3s 使用 traefik 作为默认的 ingress controller。启动之后是通过 iptables 转发 80/443 端口,所以用netstat
无法查到对应端口,可以通过iptables
,nmap
等命令去确认端口是否开启。更多说明请参考k3s 功能扩展之 Helm、Traefik LB、ServiceLB 存储及 RootFS
为什么当 k3s 节点故障后,Pod 需要大于 5 分钟时间才能被重新调度?
这是因为下列默认 Kubernetes 设置共同产生的效果:
- kubelet
-
node-status-update-frequency
:设置 kubelet 上报节点信息给 master 的频率。(默认 10s)
- kube-controller-manager
-
node-monitor-period
:NodeController 中 NodeStatus 的同步周期(默认 5s) -
node-monitor-grace-period
:节点被认定为不健康前,节点不作响应的总的时间。(默认 40s) -
pod-eviction-timeout
:优雅删除故障节点上容器的周期。(默认 5m0s)
在 Kubernetes v1.13 版本中,TaintBasedEvictions
特性是默认开启的。
- kube-apiserver (Kubernetes v1.13 版本及以后)
-
default-not-ready-toleration-seconds
: 表示 notReady:NoExecute 容忍的容忍时间。notReady:NoExecute 被默认添加到没有该容忍的所有 Pod。 -
default-unreachable-toleration-seconds
: 表示 unreachable:NoExecute 容忍的容忍时间。unreachable:NoExecute 被默认添加到没有该容忍的所有 Pod。
可以参考下面这个示例调整tolerationSeconds
时间:
kubectl create -f https://raw.githubusercontent.com/kingsd041/rancher-k3s/master/demo-busybox.yaml
如何使用 crictl 清理未使用的镜像
k3s crictl rmi --prune
K3s worker 节点的角色默认为none
,如何修改?
可以通过kubectl label node ${node} node-role.kubernetes.io/worker=worker
为节点增加 worker 角色。
Helm: Error: Kubernetes cluster unreachable
解决方案参考集群访问章节。
更多建议: