0%

rancher+k3s的高可用部署以及k3s集群的导入


概述

rancher是一个k8s集群管理工具,但是rancher自己有一个k8s发行版,叫做k3s,和k8s一样,但是去掉了很多不必要的功能,更加轻量。

这里记录一下rancher高可用的安装的方法,以及如果导入k3s集群。

  • linux:centos7
  • rancher版本:2.5.8
  • k3s:1.20.8+k3s1

k3s的安装与卸载


k3s的安装


部署外部数据库

首先需要一个外部数据库,参考官方文档集群数据存储选项

我这里使用的mysql数据库来作为外部数据库。


部署k3s-server节点

server的部署很简单,k3s提供了脚本来进行安装,非常方便:

1
2
3
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
sh -s - server \
--datastore-endpoint='mysql://k3s:xxxxx@tcp(192.168.1.60:3306)/k3s'

上面命令默认安装最新版本的k3s,如果要指定版本,可以使用下面的方式:

1
2
3
4
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_VERSION=v1.20.8+k3s1 \
sh -s - server \
--datastore-endpoint='mysql://k3s:xxxxx@tcp(192.168.1.60:3306)/k3s'

如果想要部署多个server节点,只要在多个机器上运行上述命令就可以了,它们只要连接到同一个数据库,就能相互发现。

PS:如果安装出现错误,解决问题后,建议先卸载干净再重试,卸载方法本文下面有。

运行完毕后,使用下面命令来查看部署情况:

1
2
3
4
5
# k3s kubectl get nodes

NAME STATUS ROLES AGE VERSION
local60 Ready master 77m v1.17.15+k3s1
local57 Ready master 67m v1.17.15+k3s1
1
2
3
4
5
6
7
8
9
10
11
12
# k3s kubectl get pods --all-namespaces

NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-854c77959c-nvjnc 1/1 Running 0 54m
kube-system local-path-provisioner-5ff76fc89d-g45m4 1/1 Running 0 54m
kube-system metrics-server-86cbb8457f-wwjwm 1/1 Running 0 54m
kube-system helm-install-traefik-97tlt 0/1 Completed 0 54m
kube-system svclb-traefik-9c8kz 2/2 Running 0 53m
kube-system svclb-traefik-8npf9 2/2 Running 0 53m
cattle-system cattle-cluster-agent-84696f7c8b-856bj 1/1 Running 0 53m
kube-system traefik-6f9cbd9bd4-fmbn7 1/1 Running 0 53m
fleet-system fleet-agent-d59db746-d499l 1/1 Running 0 52m

可以看到我这里部署了两个server节点,并且完全部署成功了。


部署k3s-agent节点

首先在server节点上找到token:

1
2
3
# cat /var/lib/rancher/k3s/server/node-token

K1082501c0eaxxxxxxxx77059a4fff524a8a589b9::server:1f2d8a347xxxxxxxa75efd06

在要部署agent的节点上运行如下命令即可

1
2
3
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
K3S_TOKEN='K1082501c0eaxxxxxxxx77059a4fff524a8a589b9::server:1f2d8a347xxxxxxxa75efd06' \
K3S_URL=https://192.168.1.60:6443 sh -

agent节点不是必需的,实际上我这里就部署了上面两个server节点,如果嫌麻烦可以只部署server。


k3s的卸载

在使用脚本安装k3s的时候,已经提供了卸载脚本放在了主机上。

k3s-server的卸载:

1
/usr/local/bin/k3s-uninstall.sh

k3s-agent的卸载:

1
/usr/local/bin/k3s-agent-uninstall.sh

rancher的安装

rancher2.5需要安装在Kubernetes集群之上,上面我们安装好了k3s集群,可以在上面进行rancher的安装。


安装helm

参考官方文档Installing Helm

安装方式很简单,首先选择以一个helm版本并下载releases,我这里选择了3.6.0版本,

1
wget https://get.helm.sh/helm-v3.6.0-linux-amd64.tar.gz

里面是一个直接可以用的二进制文件,解压后放到环境变量目录下就可以了,

1
2
3
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz

mv linux-amd64/helm /usr/local/bin/helm

查看helm是否可以使用了,

1
2
3
# helm version

version.BuildInfo{Version:"v3.6.0", GitCommit:"7f2df6467771a75f5646b7f12afb408590ed1755", GitTreeState:"clean", GoVersion:"go1.16.3"}

然后添加一下rancher的地址:

1
helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable

为Rancher创建Namespace

1
kubectl create namespace cattle-system

选择SSL方式

有三种SSL方式可以选择:

  • Rancher生成的自签名证书。
  • Let’s Encrypt。
  • 使用您自己的证书。

这里我只试了第一种和第三种方式,还是第三种方式比较靠谱,也就是使用自己的域名生成证书。

使用自己域名生成证书的方法就不写在这里了,总之得到三个证书文件:

1
xxx.plus.csr  xxx.plus.key  xxx.plus.pem

通过Helm安装Rancher

首先配置一下环境变量,否则会出现Error: Kubernetes cluster unreachable: Get "http://localhost:8080/version?timeout=32s": dial tcp [::1]:8080: connect: connection refused的错误:

1
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

我这里使用的是自己生成的证书,安装命令如下:

1
2
3
4
5
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=xxx.plus \
--set replicas=3 \
--set ingress.tls.source=secret

如果想要指定安装版本,则可以加上version,

1
2
3
4
5
6
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=xxx.plus \
--set replicas=3 \
--set ingress.tls.source=secret \
--version 2.5.8

查看是否安装成功:

1
2
3
4
5
6
7
8
9
# kubectl -n cattle-system rollout status deploy/rancher

Waiting for deployment "rancher" rollout to finish: 0 of 3 updated replicas are available...
deployment "rancher" successfully rolled out

# kubectl -n cattle-system get deploy rancher

NAME READY UP-TO-DATE AVAILABLE AGE
rancher 3/3 3 3 166m

到这里就成功安装了rancher,但是我们还没有加入ssl证书,此时访问web会出现不安全的提示,所以先加入证书:

1
2
3
kubectl -n cattle-system create secret tls tls-rancher-ingress \
--cert=xxx.plus.pem \
--key=xxx.plus.key

证书添加成功之后,web页面就不再提示不安全。(使用https://xxx.plus来访问rancher)


添加k3s集群到rancher

首先部署一个k3s集群,方法和上面一样。

进入rancher的web页面,选择添加集群:

image

选择导入:

image

输入集群名字,选择创建即可:

image

复制第二条命令:

image

到要导入的k3s集群的master节点上输入命令:

1
2
3
4
5
6
7
8
9
10
# kubectl apply -f https://xxx.plus/v3/import/tfgfnzllcntln8pvwkk642mtw745jq8mkmdbv9m5d9lkgjs5wq5g6l_c-r6xhq.yaml

clusterrole.rbac.authorization.k8s.io/proxy-clusterrole-kubeapiserver created
clusterrolebinding.rbac.authorization.k8s.io/proxy-role-binding-kubernetes-master created
namespace/cattle-system created
serviceaccount/cattle created
clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding created
secret/cattle-credentials-ee9e815 created
clusterrole.rbac.authorization.k8s.io/cattle-admin created
deployment.apps/cattle-cluster-agent created

等待一会儿,rancher界面上可以看到集群状态变为waiting。

正常情况,再过一会就导入成功了。如果卡了半天还是waiting,那很有可能是导入失败了。

可以查看一下导入的k3s集群的日志:

1
kubectl -n cattle-system logs -l app=cattle-cluster-agent -f

也可以直接进入日志文件夹里面去看日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
# cd /var/log/pods/

# ls

cattle-system_cattle-cluster-agent-84696f7c8b-856bj_6c13fad6-7391-4692-b165-611ce8ca1b2f
fleet-system_fleet-agent-d59db746-d499l_021c64a2-c64a-4d72-8fa4-bd3ef0d7a1f6
kube-system_helm-install-traefik-97tlt_0c92498d-99e7-4371-8bc9-aed81304370a
kube-system_metrics-server-86cbb8457f-wwjwm_a3e8dcdb-5e68-4b69-ae7d-e744e2ae8586
kube-system_svclb-traefik-8npf9_56a8cbd3-a4ae-4b2a-9b3e-3d4768e9da96

# cd cattle-system_cattle-cluster-agent-84696f7c8b-856bj_6c13fad6-7391-4692-b165-611ce8ca1b2f/cluster-register/

# tailf 0.log

到这里导入集群就成功了。


遇到的问题

1

在使用rancher2.5.x导入k3s1.21.x时,会导入失败,在k3s日志中出现如下错误:

msg="failed to call leader func: settings.management.cattle.io \"install-uuid\" not found"

github上有相关问题:

31534

但是我尝试了里面的方法也没解决成功,估计是1.21.x版本的问题,所以后面换成了1.20.8+k3s1。


2

在使用rancher2.4.4导入k3s1.21.x时,导入失败,出现错误:

Failed to connect to proxy. Response status: 200 - 200 OK. Response body: node.management.cattle.io \"c-czdbl/m-3b038d0f69e3\" not found" error="websocket: bad handshake"

相关问题:

25111

反正我也没解决成功,也是后面换成了k3s1.20的原因之一。


2021-07-02问题

在部署rancher时,提示空间不足:no space left on device: unknown

df -h看了一下,确实是/var下面的空间不足了。

研究了一下,发现主要有三个目录需要使用空间:

1
2
3
4
5
/var/lib/rancher

/var/lib/containerd

/run/containerd

这里使用了一个简单的解决方法:在空间足够的/home下面新建了几个文件夹,然后先将/var/lib/rancher/var/lib/containerd/run/containerd三个目录删除,使用新建的几个文件夹软连接生成这三个目录:

1
2
3
4
5
ln -s /home/k3s/var-lib-rancher /var/lib/rancher

ln -s /home/k3s/var-lib-containerd /var/lib/containerd

ln -s /home/k3s/run-containerd /run/containerd

然后重启containerd服务:

1
systemctl restart containerd

重新部署时,就不会再提示空间不足了。


2021-07-05问题

在内网部署rancher,并添加同一个内网的另一个k3s集群,添加失败,出现time out的错误。

大致情况如下:

  1. rancher部署在10.xxx.xxx.100上,另一个k3s集群在10.xxx.xxx.101和10.xxx.xxx.102上,现在要把k3s集群导入到rancher。
  2. rancher是要给外网访问的,所以域名rancher.xxx.plus对应的是外网地址47.xxx.xxx.xxx,同时外网访问要经过nginx转发。
  3. 内网机器不能通过外网地址访问到内网机器的,所以为了添加集群,我在10.xxx.xxx.101的/etc/hosts文件中配置了10.xxx.xxx.100 rancher.xxx.plus

但是在执行添加集群命令一会之后,会出现time out的错误。

研究之后发现,可能是容器内部并不会使用/etc/hosts文件来进行域名解析,导致解析到外网地址47.xxx.xxx.xxx,以至于连接超时。

原来k3s集群内部是通过coreDNS来进行域名解析的,所以不仅需要在/etc/hosts文件中进行修改,也要在coreDNS中修改域名解析。

执行如下命令打开coreDNS文件并添加一条记录:

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
# kubectl edit configmap coredns -n kube-system

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
Corefile: |
.:53 {
errors
health
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
hosts /etc/coredns/NodeHosts {
ttl 60
reload 15s
fallthrough
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
NodeHosts: |
10.xxx.xxx.101 xxx.cn
10.xxx.xxx.102 xxxx.cn
10.xxx.xxx.100 rancher.xxx.plus # 添加这一条解析记录
kind: ConfigMap
metadata:
annotations:
objectset.rio.cattle.io/applied: '{"apiVersion":"v1","data":{"Corefile":".:53 {\n errors\n health\n ready\n objectset.rio.cattle.io/id: ""
objectset.rio.cattle.io/owner-gvk: k3s.cattle.io/v1, Kind=Addon
objectset.rio.cattle.io/owner-name: coredns
objectset.rio.cattle.io/owner-namespace: kube-system
creationTimestamp: "2021-07-05T06:37:34Z"
labels:
objectset.rio.cattle.io/hash: bce283298811743a0386ab510f2f67ef74240c57
name: coredns
namespace: kube-system
resourceVersion: "2179"
uid: b2c3d71a-dcd5-4f80-ba3e-b8cdbcd2c400

使用下面命令可以查看配置:

1
kubectl -n kube-system get configmap coredns -o yaml

然后在执行集群导入命令,就成功添加到了rancher。


2021-11-17问题

今天在自己两台云主机上部署k3s时,有一台部署not ready,报错如下:

1
k3s Waiting for control-plane node txy0 startup: nodes \"txy0\" not found"

这里txy0就是本机的hostname,后面卸载重装,尝试使用如下命令,就成功启动了。

1
2
3
4
5
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_VERSION=v1.20.8+k3s1 sh -s - server \
--node-ip 10.xxx.xxx.1 \
--node-external-ip 1.xxx.xxx.38 \
--datastore-endpoint='mysql://user:password@tcp(1.1.1.1:3306)/k3s'

这里的--node-ip是内网地址,--node-external-ip是公网地址。


参考

rancher高可用安装指南

k3s使用外部数据库实现高可用安装