RKE 安装 rancher server HA

RKE 安装 rancher HA server 一般要有4台机器, 一台是lvs、nginx代理机器,3台为K8S机器,做etc、rancher server。

版本:

  • docker: 19.03.5
  • rancher server: 2.4.5
  • kubrctl: 1.18.5
  • rke: 1.0.10
  • helm:2.16.6

机器列表

IP 主机名 备注
192.168.5.100 bigdata00.shining.com k8s、etcd、rancher server
192.168.5.101 bigdata01.shining.com k8s、etcd、rancher server
192.168.5.103 bigdata03.shining.com k8s、etcd、rancher server
192.168.5.237 rancher.shining.com nginx

centos7 永久修改主机名,使用命令:

1
hostnamectl set-hostname xxx

安装 RKE

Rancher Kubernetes Engine(RKE)是一款轻量级Kubernetes安装程序,支持在裸机和虚拟化服务器上安装Kubernetes。 RKE解决了Kubernettes社区中的一个常见问题,比如:安装复杂性。RKE支持多种平台运行,比如MacOS,linux,windows。

50.100 机器上安装

1、下载二进制文件

1
https://github.com/rancher/rke/releases/latest

现在稳定版本是 1.0.10
下载

1
2
3
4
wget https://github.com/rancher/rke/releases/download/v1.0.10/rke_linux-amd64
chmod +x rke_linux-amd64
mv rke_linux-amd64 /usr/bin/rke
rke --version

安装kubectl

kubectl是一个CLI命令行工具,用于运行Kubernetes集群的命令。Rancher 2.x中的许多维护和管理都需要它。

这里在5.100上安装kubectl:

kubectl 安装方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wget https://storage.googleapis.com/kubernetes-release/release/v1.18.5/kubernetes-client-linux-amd64.tar.gz
(需要翻墙,正常下载不了)

官方下载说明:
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
若需要下载特定版本的 kubectl,请将上述命令中的 $(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt) 部分替换成为需要下载的 kubectl 的具体版本即可。
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.5/bin/linux/amd64/kubectl


curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
有时候可以连接

chmpd +x kubectl
mv kubectl /usr/bin/
kubectl version

配置kubectl的shell补全
CentOS Linux上,您可能需要安装默认情况下未安装的bash-completion软件包。

1
yum install bash-completion -y

运行source <(kubectl completion bash)可将kubectl自动补全添加到当前shell,要使kubectl自动补全命令自动加载:

1
echo "source <(kubectl completion bash)" >> ~/.bashrc

退出,重新登录一下即可。

使用 RKE 安装 kubernetes

下面使用 RKE(Kubernetes Engine) 安装高可用的 Kubernetes。
rancher server 之间建立 ssh 信任
我们目前有三台服务器用作 local 集群,首先要确保我们主机能够通过 ssh 访问到另外两台主机并执行相关操作。

创建用户rancher

注意:使用rke安装kubernetes时,不能以root用户执行。必须是一个普通用户才行!!!
在5.100、5.101、5.103执行以下命令:

1
2
useradd rancher
passwd rancher

授权docker权限

在5.100、5.101、5.103执行以下命令:
使用root账号登录

1
2
3
4
5
6
7
#将登陆用户rancher加入到docker用户组中
gpasswd -a rancher docker
#更新用户组
newgrp docker
切换到rancher用户进行测试
su - rancher
docker ps

ssh信任

在5.100、5.101、5.103执行以下命令:

1
2
3
4
5
6
7
8
9
每台机器上的rancher用户都执行  
# su rancher
$ ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
#$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$$ chmod 600 ~/.ssh/authorized_keys

$ ssh-copy-id 192.168.5.100
$ ssh-copy-id 192.168.5.101
$ ssh-copy-id 192.168.5.103

编写 rancher-cluster.yml 文件

在5.100上执行
注意:以rancher用户执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ vi rancher-cluster.yml
nodes:
- address: 192.168.5.100
internal_address: 192.168.5.100
user: rancher
role: [controlplane,worker,etcd]
hostname_override: bigdata00.shining.com
- address: 192.168.5.101
internal_address: 192.168.5.101
user: rancher
role: [controlplane,worker,etcd]
hostname_override: bigdata01.shining.com
- address: 192.168.5.103
internal_address: 192.168.5.103
user: rancher
role: [controlplane,worker,etcd]
hostname_override: bigdata03.shining.com

services:
etcd:
backup_config:
enabled: true
interval_hours: 6
retention: 60

备注:

  • address 公共域名或IP地址
  • user 可以运行docker命令的用户
  • role 分配给节点的Kubernetes角色列表
  • internal_address 内部集群通信的私有域名或IP地址
  • 开启了etcd的备份机制,每隔6小时备份一次,保存60天数据

运行 RKE 构建 kubernetes 集群

在5.100上执行
注意:以rancher用户执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ rke up --config ./rancher-cluster.yml
INFO[0000] Running RKE version: v1.0.8
INFO[0000] Initiating Kubernetes cluster
INFO[0000] [dialer] Setup tunnel for host [192.168.5.100]
INFO[0000] [dialer] Setup tunnel for host [192.168.5.101]
INFO[0000] [dialer] Setup tunnel for host [192.168.5.103]
INFO[0000] Checking if container [cluster-state-deployer] is running on host [192.168.5.100], try #1
INFO[0000] Image [rancher/rke-tools:v0.1.56] exists on host [192.168.5.100]
...
INFO[0128] [ingress] ingress controller nginx deployed successfully
INFO[0128] [addons] Setting up user addons
INFO[0128] [addons] no user addons defined
INFO[0128] Finished building Kubernetes cluster successfully

以上输出,表示安装成功了。
执行成功会在当前目录生成2个文件,分别是rancher-cluster.rkestate和kube_config_rancher-cluster.yml

文件说明

1
2
3
rancher-cluster.yml:RKE集群配置文件。
kube_config_rancher-cluster.yml:群集的Kubeconfig文件,此文件包含完全访问群集的凭据。
rancher-cluster.rkestate:Kubernetes群集状态文件,此文件包含完全访问群集的凭据。

错误集锦

1
WARN[0000] Failed to set up SSH tunneling for host [192.168.5.103]: Can't retrieve Docker Info: error during connect: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/info: Unable to access node with address [10.212.20.97:22] using SSH. Please check if you are able to SSH to the node using the specified SSH Private Key and if you have configured the correct SSH username. Error: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

ssh信任没有做好,请确保是普通用户执行rke。不能是root用户

1
Failed to get job complete status for job rke-network-plugin-deploy-job in namespace kube-system

重新执行一遍 rke_linux-amd64 up –config ./rancher-cluster.yml即可。
docker 和系统代理 (如果需要代理上网的话, docker需要拉取镜像,本机也需要出去下载yaml文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vim /etc/systemd/system/docker.service.d//http-proxy.conf
[Service]
Environment="HTTP_PROXY=//user:password@192.168.1.1:78/"
Environment="HTTPS_PROXY=http://user:password@192.168.1.1:79/"
Environment="NO_PROXY=localhost,127.0.0.1,0.0.0.0,10.0.0.0/8,192.168.0.0/16,shining.com,shining.com"

systemctl daemon-reload && systemctl restart docker

vim /etc/profile
use_proxy=yes
export https_proxy=http://user:password@192.168.1.1:78
export http_proxy=http://user:password@192.168.1.1:78
export NO_PROXY="localhost,127.0.0.1,0.0.0.0,10.0.0.0/8,192.168.0.0/16,shining.com,shining.com"

source /etc/profile

NO_PROXY 根据自己的ip、域名、主机配置

设置环境变量

在5.100上执行
注意:以rancher用户执行。

1
2
3
mkdir ~/.kube
cp kube_config_rancher-cluster.yml ~/.kube/config
export KUBECONFIG=$(pwd)/kube_config_rancher-cluster.yml

查看node

1
2
3
4
5
$ kubectl get node
NAME STATUS ROLES AGE VERSION
bigdata00.shining.com Ready controlplane,etcd,worker 42h v1.17.6
bigdata01.shining.com Ready controlplane,etcd,worker 42h v1.17.6
bigdata03.shining.com Ready controlplane,etcd,worker 42h v1.17.6

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

1
2
3
mkdir ~/.kube
cp /home/rancher/kube_config_rancher-cluster.yml ~/.kube/config
export KUBECONFIG=~/.kube/config

查看 k8s pod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ kubectl get pods -A
ingress-nginx default-http-backend-67cf578fc4-kqwlc 1/1 Running 1 42h
ingress-nginx nginx-ingress-controller-hwgxq 1/1 Running 2 42h
ingress-nginx nginx-ingress-controller-jqc6g 1/1 Running 3 42h
ingress-nginx nginx-ingress-controller-wttkx 1/1 Running 2 42h
kube-system canal-j28c2 2/2 Running 4 42h
kube-system canal-k244c 2/2 Running 6 42h
kube-system canal-pt74w 2/2 Running 5 42h
kube-system coredns-7c5566588d-d6742 1/1 Running 2 42h
kube-system coredns-7c5566588d-wclvc 1/1 Running 2 42h
kube-system coredns-autoscaler-65bfc8d47d-8phv4 1/1 Running 2 42h
kube-system metrics-server-6b55c64f86-pc8qk 1/1 Running 2 42h
kube-system rke-coredns-addon-deploy-job-zg68c 0/1 Completed 0 42h
kube-system rke-ingress-controller-deploy-job-fw5fn 0/1 Completed 0 42h
kube-system rke-metrics-addon-deploy-job-j9tgw 0/1 Completed 0 42h
kube-system rke-network-plugin-deploy-job-85z6d 0/1 Completed 0 42h

安装和配置Helm

Helm是Kubernetes首选的包管理工具。Helmcharts为Kubernetes YAML清单文档提供模板语法。使用Helm,可以创建可配置的部署,而不仅仅是使用静态文件。Helm有两个部分:Helm客户端(helm)和Helm服务端(Tiller)。

配置Helm客户端访问权限

在5.100上执行,下面提到的所有命令,都可以在root用户执行了。

1
2
3
kubectl -n kube-system create serviceaccount tiller
kubectl create clusterrolebinding tiller \
--clusterrole cluster-admin --serviceaccount=kube-system:tiller

备注:在kube-system命名空间中创建ServiceAccount;创建ClusterRoleBinding以授予tiller帐户对集群的访问权限;helm初始化tiller服务

安装Helm客户端

1
2
3
4
wget https://get.helm.sh/helm-v2.16.6-linux-amd64.tar.gz
tar zxvf helm-v2.16.6-linux-amd64.tar.gz -C /usr/src/
cp /usr/src/linux-amd64/helm /usr/local/bin/
cp /usr/src/linux-amd64/tiller /usr/local/bin/

安装Helm服务端(Tiller)

1
2
3
4
helm_version=`helm version |grep Client | awk -F""\" '{print $2}'`
helm init \
--service-account tiller --skip-refresh \
--tiller-image registry.cn-shanghai.aliyuncs.com/rancher/tiller:$helm_version

备注:

1、RKE默认启用RBAC,所以在安装tiller时需要指定ServiceAccount。
2、helm init在缺省配置下,会去谷歌镜像仓库拉取gcr.io/kubernetes-helm/tiller镜像,在Kubernetes集群上安装配置Tiller;由于在国内可能无法访问gcr.io、storage.googleapis.com等域名,可以通过–tiller-image指定私有镜像仓库镜像。
3、helm init在缺省配置下,会利用https://kubernetes-charts.storage.googleapis.com作为缺省的stable repository地址,并去更新相关索引文件。在国内可能无法访问storage.googleapis.com地址, 可以通过–stable-repo-url指定chart国内加速镜像地址。
4、如果您是离线安装Tiller, 假如没有内部的chart仓库, 可通过添加–skip-refresh参数禁止Tiller更新索引。

遇到问题:

1
2
3
4
5
6
7
helm status
Error: could not find a ready tiller pod

查看一下 tiller 有没有运行起来
kubectl -n kube-system get po
.....
tiller-deploy-86dfb4886-4544p 0/1 ERRORIMAGE 0 25h

image 没有下来的话, 可以改为其他镜像地址

1
2
helm init --service-account tiller --skip-refresh --tiller-image jessestuart/tiller:$helm_version --upgrade
helm init --service-account tiller

如果没起来。可以

1
helm init --upgrade

如果报错信息:

1
This command needs 1 argument: chart name

那么需要添加 –name 参数 : 如

1
helm init --service-account --name tiller

Helm安装Rancher

添加Chart仓库地址

1
2
3
4
helm repo add rancher-stable \
https://releases.rancher.com/server-charts/stable

helm repo update
如果自己有证书:可以用下面方法:
1
2
3
4
5
6
7
8
9
10
配置SSL
注意:rancher默认使用https访问,因此,需要有一个公网的SSL才行。我在阿里云上面买了一个通配符的SSL证书。
将证书上传到5.100
在5.100上执行
创建secret
kubectl create ns cattle-system
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./123pem --key=./123key
通过helm安装rancher
helm install rancher-stable/rancher --name rancher --namespace cattle-system --set hostname=rancher.shining.com --set ingress.tls.source=secret
注意:这里指定了hostname=rancher.shining.com,必须使用域名访问才行。
没有证书, 需要rancher自己创建证书,需要配置:

仅在使用 Rancher 生成的证书 ingress.tls.source=rancher 或 Let’s Encrypt 颁发的证书 ingress.tls.source=letsEncrypt时才需要 cert-manager。
这些说明来自官方的 cert-manager 文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 安装 CustomResourceDefinition 资源
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.0/cert-manager.crds.yaml

# **重要:**
# 如果您正在运行 Kubernetes v1.15 或更低版本,
# 则需要在上方的 kubectl apply 命令中添加`--validate=false`标志,
# 否则您将在 cert-manager 的 CustomResourceDefinition 资源中收到与
# x-kubernetes-preserve-unknown-fields 字段有关的验证错误。
# 这是一个良性错误,是由于 kubectl 执行资源验证的方式造成的。

# 为 cert-manager 创建命名空间
kubectl create namespace cert-manager
# 添加 Jetstack Helm 仓库
helm repo add jetstack https://charts.jetstack.io
# 更新本地 Helm chart 仓库缓存
helm repo update
# 安装 cert-manager Helm chart
helm install \
--name cert-manager jetstack/cert-manager \
--namespace cert-manager \
--version v0.15.0

安装完 cert-manager 后,您可以通过检查 cert-manager 命名空间中正在运行的 Pod 来验证它是否已正确部署:

1
2
3
4
5
$ kubectl get pods --namespace cert-manager
NAME READY STATUS RESTARTS AGE
cert-manager-6557d7bd98-dqjxh 1/1 Running 0 25h
cert-manager-cainjector-6749f5b67-p46rd 1/1 Running 0 25h
cert-manager-webhook-d886869c4-x6r7f 1/1 Running 0 25h

通过helm安装rancher

1
helm install rancher-stable/rancher   --name rancher   --namespace cattle-system  --set hostname=rancher.shining.com  --set ingress.tls.source=rancher

注意:这里指定了hostname=rancher.shining.com,必须使用域名访问才行。
查看rancher 运行状况:

1
2
3
4
5
6
7
8
9
 kubectl get pods --namespace cattle-system
NAME READY STATUS RESTARTS AGE
cattle-cluster-agent-85695669b4-fh27p 0/1 CrashLoopBackOff 297 25h
cattle-node-agent-7js5j 1/1 Running 0 25h
cattle-node-agent-p9ft2 1/1 Running 0 25h
cattle-node-agent-zdrb7 1/1 Running 0 25h
rancher-7d578c767b-5f2fv 1/1 Running 0 25h
rancher-7d578c767b-9b72j 1/1 Running 0 25h
rancher-7d578c767b-khrv6 1/1 Running 0 25h

可以临时配置域名解析,或hosts方式访问,后期可以配置到DNS中 , agent添加到server中都需要这个域名。

编辑主机 hosts

1
192.168.5.100  rancher.shining.com

注释,5.100、5.101、5.103 指向任何一台机器都可以访问。

访问页面:

1
https://rancher.shining.com

页面提示设置密码,rangcher就配置好了。

nginx 代理配置:

nginx是作为前端访问的代理地址, 祈祷负载作用。agent 也会通过这么域名访问到server的

5.237 机器上配置 nginx。
添加repo 源

1
2
3
4
5
6
vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

安装

1
yum install -y nginx

修改配置文件: vim /etc/nginx/nginx.conf

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
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 8192;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
return 301 https://$host$request_uri;
}
}
stream {
upstream rancher_servers {
least_conn;
server 192.168.5.100:443 max_fails=3 fail_timeout=5s;
server 192.168.5.101:443 max_fails=3 fail_timeout=5s;
server 192.168.5.103:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers;
}
}

启动nginx

1
2
3
systemctl start nginx

systemctl reload nginx

以后域名地址解析到 5.237 机器上就可以访问了。当然nginx也可以安装到集群中,或其他负载方式。

Q&A

1、执行以下命令为Rancher Server容器配置hosts:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[rancher@5.100 ~]$ kubectl -n cattle-system patch deployments rancher --patch '{
"spec": {
"template": {
"spec": {
"hostAliases": [
{
"hostnames":
[
"rancher.shining.com"
],
"ip": "192.168.100.237"
}
]
}
}
}
}'

2、在Rancher Web UI中依次进入local集群/system项目,在cattle-system命名空间中查看是否有cattle-cluster-agent Pod和cattle-node-agent pod被创建。如果有创建则进行下面的步骤,没有创建则等待;
cattle-cluster-agent pod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[rancher@5.100 ~]$ kubectl -n cattle-system \
patch deployments cattle-cluster-agent --patch '{
"spec": {
"template": {
"spec": {
"dnsPolicy": "ClusterFirstWithHostNet",
"hostNetwork": true,
"hostAliases": [
{
"hostnames":
[
"rancher.shining.com"
],
"ip": "192.168.5.237"
}
]
}
}
}
}'

cattle-node-agent pod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[rancher@node1 ~]$ kubectl -n cattle-system \
patch daemonsets cattle-node-agent --patch '{
"spec": {
"template": {
"spec": {
"hostAliases": [
{
"hostnames":
[
"rancher.shining.com"
],
"ip": "192.168.5.237"
}
]
}
}
}
}'

相关文章:

rancher 官网: https://rancher2.docs.rancher.cn/docs/installation/k8s-install/helm-rancher/_index
腾讯云文档 : https://cloud.tencent.com/developer/article/1638170

感谢您的支持!