k0s 安装指南

本文介绍如何使用手动方式安装 k0s 集群。

1. 准备环境

首先准备三台机器:

机器角色 机器 IP 操作系统
controller 192.168.0.211 Ubuntu 22.04.4 LTS
worker 192.168.0.212 Ubuntu 22.04.4 LTS
worker 192.168.0.213 Ubuntu 22.04.4 LTS

请注意,接下来的所有命令都需要 root 权限!!,建议先通过 sudo su 切换到 root 用户。

在所有机器上执行以下命令,下载安装 k0s:

1
curl -sSLf https://get.k0s.sh | sudo sh

成功后 /usr/local/bin/k0s 就是安装好的可执行文件。

2. 修改配置

在 controller 机器上通过以下命令生成配置:

1
2
mkdir -p /etc/k0s
k0s config create --include-images > /etc/k0s/k0s.yaml

由于国内的网络无法直连 k8s 的一些镜像仓库,所以需要修改镜像地址为国内的地址,否则会下载很慢或者失败,可参考 https://www.nenufm.com/dorthl/291/ 进行修改。

修改后的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
apiVersion: k0s.k0sproject.io/v1beta1
kind: ClusterConfig
metadata:
creationTimestamp: null
name: k0s
spec:
api:
address: 192.168.0.211
k0sApiPort: 9443
port: 6443
sans:
- 192.168.0.211
- fe80::216:3eff:fe06:24a
controllerManager: {}
extensions:
helm:
charts: null
concurrencyLevel: 5
repositories: null
storage:
create_default_storage_class: false
type: external_storage
images:
calico:
cni:
image: quay.io/k0sproject/calico-cni
version: v3.26.1-1
kubecontrollers:
image: quay.io/k0sproject/calico-kube-controllers
version: v3.26.1-1
node:
image: quay.io/k0sproject/calico-node
version: v3.26.1-1
coredns:
image: quay.io/k0sproject/coredns
version: 1.11.1
default_pull_policy: IfNotPresent
konnectivity:
image: quay.io/k0sproject/apiserver-network-proxy-agent
version: v0.1.4
kubeproxy:
image: quay.io/k0sproject/kube-proxy
version: v1.29.2
kuberouter:
cni:
image: quay.io/k0sproject/kube-router
version: v1.6.0-iptables1.8.9-1
cniInstaller:
image: quay.io/k0sproject/cni-node
version: 1.3.0-k0s.0
metricsserver:
image: k8s.mirror.nju.edu.cn/metrics-server/metrics-server
version: v0.6.4
pause:
image: k8s.mirror.nju.edu.cn/pause
version: "3.9"
pushgateway:
image: quay.io/k0sproject/pushgateway-ttl
version: 1.4.0-k0s.0
installConfig:
users:
etcdUser: etcd
kineUser: kube-apiserver
konnectivityUser: konnectivity-server
kubeAPIserverUser: kube-apiserver
kubeSchedulerUser: kube-scheduler
konnectivity:
adminPort: 8133
agentPort: 8132
network:
calico: null
clusterDomain: cluster.local
dualStack: {}
kubeProxy:
iptables:
minSyncPeriod: 0s
syncPeriod: 0s
ipvs:
minSyncPeriod: 0s
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
metricsBindAddress: 0.0.0.0:10249
mode: iptables
kuberouter:
autoMTU: true
hairpin: Enabled
ipMasq: false
metricsPort: 8080
mtu: 0
peerRouterASNs: ""
peerRouterIPs: ""
nodeLocalLoadBalancing:
envoyProxy:
apiServerBindPort: 7443
image:
image: quay.io/k0sproject/envoy-distroless
version: v1.29.0
konnectivityServerBindPort: 7132
type: EnvoyProxy
podCIDR: 10.244.0.0/16
provider: kuberouter
serviceCIDR: 10.96.0.0/12
scheduler: {}
storage:
etcd:
externalCluster: null
peerAddress: 192.168.0.211
type: etcd
telemetry:
enabled: false

3. 正式安装

controller

在 controller 机器上执行以下操作:

  • 安装 k0s:
1
k0s install controller --enable-metrics-scraper -c /etc/k0s/k0s.yaml
  • 启动 k0s:
1
k0s start
  • 生成用于 worker 的 token 文件:
1
k0s token create --role=worker --expiry=10000h > token-file

worker

在 worker 机器上执行以下操作:

  • 新建 token-file 文件,并将 controller 中的 token 粘贴到 token-file 文件中,然后安装 k0s:
1
k0s install worker --token-file token-file
  • 启动 k0s:
1
k0s start

4. 检查是否成功

在 controller 上执行 k0s kubectl get nodes,如果输出以下内容,说明集群部署成功:

1
2
3
NAME    STATUS  ROLES   AGE VERSION
worker1 Ready <none> 34m v1.29.2+k0s
worker2 Ready <none> 23m v1.29.2+k0s

5. 卸载

controller 和 worker 节点都可以按照以下步骤卸载 k0s:

  • 停止服务
1
k0s stop
  • 执行 reset 命令
1
k0s reset
  • 重启服务器
1
systemctl reboot

6. 故障排查

Q. 如何查看 k0s 的服务名称和状态?

在 controller 上可以通过 systemctl status k0scontroller.service 查看 k0s controller 的状态,还可以通过 journalctl -xeu k0scontroller.service 查看输出的日志。
在 worker 上可以通过 systemctl status k0sworker.service 查看 k0s worker 的状态,还可以通过 journalctl -xeu k0sworker.service 查看输出的日志。

Q. 为什么 kubectl get nodes 不会列出 k0s controller?

根据官方文档,默认情况下,控制平面不会运行 kubelet,也不接受任何工作负载,因此控制器不会出现在 kubectl 的节点列表中。如果希望控制器接受工作负载并运行 pods,可以使用:k0s controller - enable-worker(仅推荐作为测试/开发/POC 环境)。

Q. k0s kubectl exec -it pod -- bash 报错

由于端口未开放的问题,在执行 k0s kubectl exec -it pod -- bash 命令的时候会出现 Error from server: error dialing backend: dial tcp [ip]:10250: i/o timeout 的错误,可以编辑 nftables 并开放以下端口:

与此同时还需要允许 podCIDR 和 serviceCIDR 的流量通过。

Q. 节点上的 pod 无法正常访问外网的原因

  • 检查 DNS 是否正常,推荐使用以下清单进行网络排查,该清单使用 nicolaka/netshoot 镜像,包含一整套完整的网络故障排查工具。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: netshoot-deploy
namespace: default
spec:
selector:
matchLabels:
app: netshoot-deploy
template:
metadata:
labels:
app: netshoot-deploy
spec:
containers:
- name: netshoot
image: nicolaka/netshoot
command: ["sleep", "999999"]
resources:
limits:
cpu: 100m
memory: 64Mi
requests:
cpu: 100m
memory: 64Mi
  • 请依次查看该节点上 konnectivity-agentkube-proxy 以及 kube-router 的日志,如果无法连接外网,这三个 pod 中应该会出现错误日志,直接删除出错的 pod 即可,等待一段时间之后再次查看这三个 pod 的日志,如果没有出错,则说明网络已恢复正常。