RKE快速搭建离线k8s集群并用rancher管理界面

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


本文记录使用RKE快速搭建一套k8s集群过程,使用的rancher老版本2.5.7(当前最新版为2.7)。适用于初学测试、测试环境及定制化要求不高的生产环境。

关联文章:

1. k8s集群搭建前的服务器初始化,见文章《附1:k8s服务器初始化》

1. 前提

1.1 服务器规划

IP hostname 角色 部署内容
10.99.68.62 k8s-master01 master-1 rke/kubectl/helm,执行k8s安装命令节点
10.99.68.63 k8s-master02 master-2
10.99.68.64 k8s-master03 master-3
10.99.68.65 k8s-node01 worker-1
10.99.68.66 k8s-node02 worker-2
10.99.68.67 k8s-node03 worker-3 测试rke部署的k8s集群添加新节点
10.99.68.68 rancherUI rancherUI rancher2.5.7

1.2 服务器初始化

可参考今日文章组附件《附1:k8s服务器初始化》

1.3 镜像导入

1.3.1安装自己的私有docker仓库,如harbor等

1.3.2 导入镜像

在https://github.com/rancher/rancher/releases页面找到需要的版本(不要下载标记为rc或Pre-release的版本,可能有坑,尤其在生产环境下是不稳定的),在一台能通公网的服务器执行下面三个文件下载镜像并导入私有仓库:

Release 文件 描述
rancher-images.txt
此文件包含安装 Rancher、创建集群和运行 Rancher 工具所需的镜像列表。
rancher-save-images.sh 这个脚本会从 DockerHub 中拉取在文件rancher-images.txt中描述的所有镜像,并将它们保存为文件rancher-images.tar.gz。
rancher-load-images.sh 这个脚本会载入文件rancher-images.tar.gz中的镜像,并将它们推送到您自己的私有镜像库。

2. K8S集群安装

2.1 基础环境

2.1.1配置hosts解析

在三台master服务器的/etc/hosts文件添加以下三行,配置三台服务器的hosts解析:

10.99.68.62 k8s-master01
10.99.68.63 k8s-master02
10.99.68.64 k8s-master03

2.1.2 三台服务器之间做ssh信任

在3个节点上,通过sre用户做免秘钥认证:

# su sre
$ ssh-keygen -t rsa -b 4096 
$ ssh-copy-id [email protected] 
$ ssh-copy-id 10.99.68.63
$ ssh-copy-id 10.99.68.64

2.1.3 检查三台服务器之间时间是否同步

如不同步,先同步三台服务器的时间。

2.2 k8s集群基础命令安装(sre用户下执行)

2.2.1 安装rke、kubectl、helm

1)安装rke

将1.2.8_rke_linux-amd64文件上传到服务器,并执行以下命令:

$ mv 1.2.8_rke_linux-amd64 rke #给rke文件修改名字
$ chmod +x rke && sudo mv rke /usr/bin/ #添加执行权限并放入/usr/bin/目录下
$ rke --version #在sre用户测试运行rke命令

2)安装kubectl

将1.21.2-kubectl文件上传到服务器,并执行以下命令:

$ mv 1.21.2-kubectl kubectl      #给kubectl修改名字
$ chmod +x kubectl && sudo mv kubectl /usr/bin/     #给kubectl添加执行权限并移动到/usr/bin目录下
$ sudo yum install bash-completion -y      #CentOS Linux上,可能需要安装默认情况下未安装的bash-completion软件包
$ echo "source <(kubectl completion bash)" >> ~/.bashrc      #运行source <(kubectl completion bash)可将kubectl自动补全添加到当前shell,要使kubectl自动补全命令自动加载
$ source ~/.bashrc      #source让上一步骤修改生效
$ kubectl version    #测试sre用户能正常使用kubectl命令

3)安装helm

将安装包helm-v3.6.1-linux-amd64.tar.gz上传到服务器,并执行以下命令:

$ tar xf helm-v3.6.1-linux-amd64.tar.gz
$ sudo mv linux-amd64/helm /usr/bin/
$ helm version #测试sre用户能正常使用helm

2.2.2 rke安装k8s集群

编辑rke创建集群的文件k8s-cluster.yml

nodes:
 - address: 10.99.68.62 
 internal_address: 10.99.68.62 
 user: sre
 role: [controlplane, etcd]
 hostname_override: k8s-master01
 ssh_key_path: /home/sre/.ssh/id_rsa
 - address: 10.99.68.63
 internal_address: 10.99.68.63
 user: sre
 role: [controlplane, etcd]
 hostname_override: k8s-master02
 ssh_key_path: /home/sre/.ssh/id_rsa
 - address: 10.99.68.64
 internal_address: 10.99.68.64
 user: sre
 role: [controlplane, etcd]
 hostname_override: k8s-master03
 ssh_key_path: /home/sre/.ssh/id_rsa
 - address: 10.99.68.65
 internal_address: 10.99.68.65
 user: sre
 role: [worker]
 hostname_override: k8s-node01
 ssh_key_path: /home/sre/.ssh/id_rsa
 - address: 10.99.68.66
 internal_address: 10.99.68.66
 user: sre
 role: [worker]
 hostname_override: k8s-node02
 ssh_key_path: /home/sre/.ssh/id_rsa
private_registries:
 - url: harbor.test.com:8000   #私人harbor仓库地址
 is_default: true
services:
 etcd:
 backup_config:
 enabled: true
 interval_hours: 6
 retention: 60

配置文件说明:

参数-含义

address公共域名或IP地址

user可以运行docker命令的普通用户(不能用root用户) 

role分配给节点的Kubernetes角色列表

internal_addres:内部集群通信的私有域名或IP地址 

hostname_overrid:k8s节点hostname 

ssh_key_pat:指定ssh免秘钥的路径 

private_registrie:指定私有harbor仓库的地址,如果可以通外网的服务器就可以不配置 

etcd:开启了etcd的备份机制,每隔6小时备份一次,保存60天数据

文件编辑好后,在k8s-master01执行以下命令启动k8s集群:

rke up --config k8s-cluster.yml

 成功安装完成后,日志结尾如下图:

在执行完成后,当前目录下会创建kube_config_k8s-cluster.ymlk8s-cluster.rkestate两个文件:

当排除故障、升级群集时需要用到以下文件,请将其副本保存在一个安全的位置!

k8s-cluster.yml:RKE部署k8s集群配置文件
kube_config_k8s-cluster.yml:群集的Kubeconfig文件,此文件包含完全访问群集的凭据。
k8s-cluster.rkestate:Kubernetes群集状态文件,此文件包含完全访问群集的凭据。

现在不能直接执行kubectl get nodes 查看集群,会报错:

[sre@k8s-master01 rancher-cluster]$ kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?
[sre@k8s-master01 rancher-cluster]$

sre用户下配置kubectl命令执行:

$ mkdir ~/.kube
$ cp kube_config_k8s-cluster.yml ~/.kube
$ cp ~/.kube/kube_config_k8s-cluster.yml ~/.kube/config

#可以把k8s-cluster.yml和 k8s-cluster.rkestate也备份一份过来,以免丢失
$ cp k8s-cluster.yml ~/.kube/ 
$ cp k8s-cluster.rkestate ~/.kube/

配置完后,就可以用kubectl get node命令直接查看集群了:

[sre@k8s-master01 .kube]$ kubectl  get node
NAME           STATUS   ROLES               AGE   VERSION
k8s-master01   Ready    controlplane,etcd   41m   v1.20.6
k8s-master02   Ready    controlplane,etcd   31m   v1.20.6
k8s-master03   Ready    controlplane,etcd   31m   v1.20.6
k8s-node01     Ready    worker              20m   v1.20.6
k8s-node02     Ready    worker              20m   v1.20.6
[sre@k8s-master01 .kube]$

如果需要root用户执行kubectl,切换到root用户,执行以下命令:

mkdir ~/.kube
cp /home/sre/.kube/config ./

3. Rancher管理k8s集群

rancher管理k8s集群,有2种方法:

一是将ks集群导入rancher管理界面;

二是在k8s集群上起动rancher应用,直接接入管理集群。

不管是rke安装的,还是别的方式如kubeadm安装的k8s,都适用。

3.1 k8s集群导入rancher

3.1.1 部署一个rancher应用

在10.99.68.68服务器部署rancher,此处使用的老版本2.5.7版本

[root@rancherUI App]# cat rancher.sh 
#!/bin/bash
docker run -d --privileged --restart=unless-stopped -p 8088:80 -p 8443:443 -e CATTLE_SYSTEM_DEFAULT_REGISTRY=harbor.test.com:8000 -e CATTLE_SYSTEM_CATALOG=bundled -v /home/rancher/rancher:/var/lib/rancher -v /home/rancher/auditlog:/var/log/auditlog --name rancher-server harbor.test.com:8000/rancher/rancher:v2.5.7
[root@rancherUI App]#

3.1.2 将k8s导入rancher

1)在“全局”界面,添加集群:

2)选择导入集群:

3)填写导入的集群名:

4)点击“创建”,就会生成如下命令:

命令:

curl --insecure -sfL https://10.99.68.68:8443/v3/import/tzzhn4t4dkmnhlvzz8jm7gmx5xh5ddr8gvsgpljq78rsb8xhlc4znt_c-8cwtr.yaml | kubectl apply -f -

将以命令在k8s-master01节点sre用户下执行:

[sre@k8s-master01 .kube]$ curl --insecure -sfL https://10.247.149.18:8443/v3/import/tzzhn4t4dkmnhlvzz8jm7gmx5xh5ddr8gvsgpljq78rsb8xhlc4znt_c-8cwtr.yaml | kubectl apply -f -

命令执行完毕后,rancher界面能看到导入成功:

查看主机,5台节点均导入成功:

3.2 在k8s上安装rancher

3.2.1 安装cert-manager

1)将离线包cert-managerv1.7.1(下载链接:https://artifacthub.io/packages/helm/cert-manager/cert-manager/1.7.1)上传到服务器k8s-master01解压;

2)下载离线CRD资源yaml文件:https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.crds.yaml:

3)找一台通公网的服务器下载以下镜像并修改tag,上传到自己私有仓库:

#下载镜像
docker pull quay.io/jetstack/cert-manager-controller:v1.7.1
docker pull quay.io/jetstack/cert-manager-webhook:v1.7.1
docker pull quay.io/jetstack/cert-manager-cainjector:v1.7.1
docker pull quay.io/jetstack/cert-manager-ctl:v1.7.1
#修改tag
docker tag quay.io/jetstack/cert-manager-controller:v1.7.1 harbor.test.com:8000/rancher/cert-manager-controller:v1.7.1
docker tag quay.io/jetstack/cert-manager-webhook:v1.7.1 harbor.test.com:8000/rancher/cert-manager-webhook:v1.7.1 
docker tag quay.io/jetstack/cert-manager-cainjector:v1.7.1 harbor.test.com:8000/rancher/cert-manager-cainjector:v1.7.1
docker tag quay.io/jetstack/cert-manager-ctl:v1.7.1 harbor.test.com:8000/rancher/cert-manager-ctl:v1.7.1 
#上传镜像
docker push harbor.test.com:8000/rancher/cert-manager-controller:v1.7.1
docker push harbor.test.com:8000/rancher/cert-manager-webhook:v1.7.1 
docker push harbor.test.com:8000/rancher/cert-manager-cainjector:v1.7.1
docker push harbor.test.com:8000/rancher/cert-manager-ctl:v1.7.1

4)批量修改cert-manager里面的image地址,将“quay.io/jetstack/”全部改为自己私有仓库地址“ harbor.test.com:8000/rancher/”。

5)执行命令安装cert-manager

cd cert-managerv1.7.1
kubectl apply -f cert-manager.crds.yaml    #离线升级CRD资源
#正式安装cert-manager
helm install cert-manager ./cert-manager-v1.7.1 
 --namespace cert-manager 
 --create-namespace 
 --version v1.7.1

6)查看pod

[root@k8s-master01 ~]# kubectl get pod -n cert-manager
NAME                                    READY  STATUS  RESTARTS AGE
cert-manager-5698c7c8d7-8w68r            1/1   Running   0      16m
cert-manager-cainjector-57bf5766bd-9ml2x 1/1   Running   0      16m
cert-manager-webhook-7bd6cfc99c-hbz8c    1/1   Running   0      16m
[root@k8s-master01 ~]#

3.2.2 安装rancher

1)下载rancher2.5.7离线helm安装包

安装命令:

helm install rancher ./rancher-v2.5.7 
 --namespace cattle-system 
 --create-namespace 
 --set hostname=rancher.test.com   #rancher不要以local域名命名
 --set replicas=1    #指定启动几个rancher pod,可以启动多个
 --version 2.5.7

2)查看ingress:

3)windows电脑本地绑定hosts:

10.9.68.65 rancher.test.com  #在ingress的SDDRESS中任意绑定一个IP

4)浏览器访问:https://rancher.test.com,设置admin用户的密码后,跳转到URL,这里默认就是使用的上一步骤设置的域名,默认即可。

5)进入rancher,就能看到集群了,这里的集群名就是local:

(完)