本文介绍如何使用手动方式安装 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 机器上执行以下操作:
1
| k0s install controller --enable-metrics-scraper -c /etc/k0s/k0s.yaml
|
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
|
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:
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 无法正常访问外网的原因
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-agent
,kube-proxy
以及 kube-router
的日志,如果无法连接外网,这三个 pod 中应该会出现错误日志,直接删除出错的 pod 即可,等待一段时间之后再次查看这三个 pod 的日志,如果没有出错,则说明网络已恢复正常。