Rancher 2.4.3 - HA 部署高可用k8s集群
一、概述
对于生产环境,需以高可用的配置安装 Rancher,确保用户始终可以访问 Rancher Server。当安装在Kubernetes集群中时,Rancher将与集群的 etcd 集成,并利用Kubernetes 调度实现高可用。
为确保高可用,本文所部署的 Kubernetes 集群将专用于运行 Rancher ,Rancher 运行起来后,可再创建或导入集群以运行具体的工作负载。
推荐架构
- Rancher的DNS 应解析到 4层(TCP) 负载均衡上。
- 负载均衡应将端口 TCP/80 和 TCP/443 转发到 Kubernetes 集群中的所有3个节点。
- Ingress-controller 将 HTTP 重定向到HTTPS并终止端口 TCP/443 上的 SSL/TLS(SSL数字证书在这里部署)。
- Ingress-controller 将流量转发到 pod 的 TCP/80 端口。
下面是一张从官网拉过来的图片,更直观一些。
二、准备工作
服务器准备
- 1台 Linux服务器,配置不用很高,用于四层负载均衡
- 3台 Linux服务器,Rancker-server-node 节点
- n台 Linux服务器,Rancker-agent-node 节点(n<=50)
节点服务器的硬件配置,可根据实际情况依据该表自行选择。
规模 | 集群 | 节点 | CPU | 内存 |
---|---|---|---|---|
小 | 最多5个 | 高达50 | 2 | 8 GB |
中 | 最多15个 | 最多200 | 4 | 16 GB |
大 | 高达50 | 最多500个 | 8 | 32 GB |
超大 | 最多100个 | 高达1000 | 32 | 128 GB |
更大规模 | 100+ | 1000+ | 联系 Rancher | 联系 Rancher |
环境说明
服务器使用本地的EXSI,虚拟机具体配置如下:
主机名称 | 系统版本 | 内网ip | 配置 |
rancher-01 | CentOS 7.6 | 10.212.22.32 | 2核3g |
rancher-02 | CentOS 7.6 | 10.212.22.23 | 2核3g |
rancher-03 | CentOS 7.6 | 10.212.20.97 | 2核3g |
rancher-slb | CentOS 7.6 | 10.212.20.213 | 1核1g |
注意:如果云服务器,比如阿里云,腾讯云,AWS等等。不需要rancher-slb服务器,直接TCP转发到rancher后端即可。
centos7 永久修改主机名,使用命令:
hostnamectl set-hostname xxx
其中xxx表示你要设置的主机名,执行完成之后,退出,重新登录一次,就可以了。
docker安装
关于docker安装,请参考链接:
https://www.cnblogs.com/xiao987334176/p/11771657.html
安装RKE
Rancher Kubernetes Engine(RKE)是一款轻量级Kubernetes安装程序,支持在裸机和虚拟化服务器上安装Kubernetes。 RKE解决了Kubernettes社区中的一个常见问题,比如:安装复杂性。RKE支持多种平台运行,比如MacOS,linux,windows。
这里在rancher-01上安装rke:
1、下载二进制文件
https://github.com/rancher/rke/releases/latest
目前稳定版本为v1.0.8
下载文件
下载安装
wget https://github.com/rancher/rke/releases/download/v1.0.8/rke_linux-amd64 chmod +x rke_linux-amd64 mv rke_linux-amd64 /usr/bin/ rke_linux-amd64 --version
注意:此文件安装的k8s版本为v1.17.5
安装kubectl
kubectl是一个CLI命令行工具,用于运行Kubernetes集群的命令。Rancher 2.x中的许多维护和管理都需要它。
这里在rancher-01上安装kubectl:
https://storage.googleapis.com/kubernetes-release/release/v1.17.0/kubernetes-client-linux-amd64.tar.gz
注意:此链接必须在访问谷歌的电脑上面才行下载。
我已经上传到百度网盘了,下载链接如下:
链接:https://pan.baidu.com/s/1WbuaTIJGBSNP5CgRIq75Bw
提取码:f77i
解压,并放到path路径下
tar zxvf kubernetes-client-linux-amd64.tar.gz -C /usr/src/ cp /usr/src/kubernetes/client/bin/kubectl /usr/bin/kubectl chmod +x /usr/bin/kubectl
配置kubectl的shell补全
CentOS Linux上,您可能需要安装默认情况下未安装的bash-completion软件包。
yum install bash-completion -y
运行source <(kubectl completion bash)可将kubectl自动补全添加到当前shell,要使kubectl自动补全命令自动加载:
echo "source <(kubectl completion bash)" >> ~/.bashrc
退出,重新登录一下即可。
三、使用 RKE 安装 kubernetes
下面使用 RKE(Kubernetes Engine) 安装高可用的 Kubernetes。
NODE-SERVER 之间建立 ssh 信任
我们目前有三台服务器用作 local 集群,首先要确保我们主机能够通过 ssh 访问到另外两台主机并执行相关操作。
创建用户rancher
注意:使用rke安装kubernetes时,不能以root用户执行。必须是一个普通用户才行!!!
在rancher-01,rancher-02,rancher-02执行以下命令:
useradd rancher passwd rancher
授权docker权限
在rancher-01,rancher-02,rancher-02执行以下命令:
使用root账号登录
#将登陆用户develop加入到docker用户组中 gpasswd -a rancher docker #更新用户组 newgrp docker
切换到rancher用户进行测试
su rancher docker ps
输出正常,则表示成功了。
ssh信任
在rancher-01,rancher-02,rancher-02执行以下命令:
# su rancher $ ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys
复制公钥
在rancher-01上执行
注意:以rancher用户执行。
$ ssh-copy-id 10.212.22.32 $ ssh-copy-id 10.212.22.23 $ ssh-copy-id 10.212.20.97
测试ssh免密
在rancher-01上执行
注意:以rancher用户执行。
$ ssh 10.212.22.32
$ ssh 10.212.22.23
$ ssh 10.212.20.97
编写 rancher-cluster.yml 文件
这里需要注意,这个文件没有明确配置rsa文件名,默认会使用 $HOME/.ssh/id_rsa
建立连接。内容如下
在rancher-01上执行
注意:以rancher用户执行。
$ vi rancher-cluster.yml
内容如下:
nodes: - address: 10.212.22.32 internal_address: 10.212.22.32 user: rancher role: [controlplane,worker,etcd] hostname_override: rancher-01 - address: 10.212.22.23 internal_address: 10.212.22.23 user: rancher role: [controlplane,worker,etcd] hostname_override: rancher-02 - address: 10.212.20.97 internal_address: 10.212.20.97 user: rancher role: [controlplane,worker,etcd] hostname_override: rancher-03 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 集群
在rancher-01上执行
注意:以rancher用户执行。
$ rke_linux-amd64 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 [10.212.20.97] INFO[0000] [dialer] Setup tunnel for host [10.212.22.32] INFO[0000] [dialer] Setup tunnel for host [10.212.22.23] INFO[0000] Checking if container [cluster-state-deployer] is running on host [10.212.22.32], try #1 INFO[0000] Image [rancher/rke-tools:v0.1.56] exists on host [10.212.22.32] ... 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
文件说明
rancher-cluster.yml:RKE集群配置文件。 kube_config_rancher-cluster.yml:群集的Kubeconfig文件,此文件包含完全访问群集的凭据。 rancher-cluster.rkestate:Kubernetes群集状态文件,此文件包含完全访问群集的凭据。
错误集锦
WARN[0000] Failed to set up SSH tunneling for host [10.212.20.97]: 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_linux-amd64。不能是root用户
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即可。
设置环境变量
在rancher-01上执行
注意:以rancher用户执行。
mkdir ~/.kube cp kube_config_rancher-cluster.yml ~/.kube/config export KUBECONFIG=$(pwd)/kube_config_rancher-cluster.yml
查看node
$ kubectl get nodes NAME STATUS ROLES AGE VERSION rancher-01 Ready controlplane,etcd,worker 43m v1.17.5 rancher-02 Ready controlplane,etcd,worker 43m v1.17.5 rancher-03 Ready controlplane,etcd,worker 43m v1.17.5
如果需要root用户执行kubectl,切换到root用户,执行以下命令
mkdir ~/.kube cp /home/rancher/kube_config_rancher-cluster.yml ~/.kube/config export KUBECONFIG=~/.kube/config
测试kubectl命令
# kubectl get pods No resources found in default namespace. [root@rancher-master-01 ~]# kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE ingress-nginx default-http-backend-67cf578fc4-r4cgs 1/1 Running 0 41m ingress-nginx nginx-ingress-controller-8ck28 1/1 Running 0 41m ingress-nginx nginx-ingress-controller-crw7r 1/1 Running 0 41m ingress-nginx nginx-ingress-controller-s5zkp 1/1 Running 0 41m kube-system canal-5fhpj 2/2 Running 0 42m kube-system canal-m5ww5 2/2 Running 0 42m kube-system canal-mzqkg 2/2 Running 0 42m kube-system coredns-7c5566588d-89ztq 1/1 Running 0 42m kube-system coredns-7c5566588d-xdwg6 1/1 Running 0 40m kube-system coredns-autoscaler-65bfc8d47d-pbc5t 1/1 Running 0 42m kube-system metrics-server-6b55c64f86-bfrcb 1/1 Running 0 41m kube-system rke-coredns-addon-deploy-job-npdcf 0/1 Completed 0 42m kube-system rke-ingress-controller-deploy-job-pqkpl 0/1 Completed 0 41m kube-system rke-metrics-addon-deploy-job-5nd4r 0/1 Completed 0 42m kube-system rke-network-plugin-deploy-job-cvxnv 0/1 Completed 0 42m
四、安装和配置Helm
Helm是Kubernetes首选的包管理工具。Helmcharts为Kubernetes YAML清单文档提供模板语法。使用Helm,可以创建可配置的部署,而不仅仅是使用静态文件。Helm有两个部分:Helm客户端(helm)和Helm服务端(Tiller)。
配置Helm客户端访问权限
在rancher-01上执行,下面提到的所有命令,都可以在root用户执行了。
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客户端
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/
安装Helm服务端(Tiller)
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更新索引。
Helm安装Rancher
添加Chart仓库地址
helm repo add rancher-stable \ https://releases.rancher.com/server-charts/stable
配置SSL
注意:rancher默认使用https访问,因此,需要有一个公网的SSL才行。我在阿里云上面买了一个通配符的SSL证书。
将证书上传到rancher-01
在rancher-01上执行
创建secret
kubectl create ns cattle-system kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./214563317320547.pem --key=./214563317320547.key
通过helm安装rancher
helm install rancher-stable/rancher --name rancher --namespace cattle-system --set hostname=rancher.baidu.com --set ingress.tls.source=secret
注意:这里指定了hostname=rancher.baidu.com,必须使用域名访问才行。
查看pod,确保运行正常
# kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE cattle-system rancher-66b5cfc7f5-6wbhq 0/1 Running 1 100s cattle-system rancher-66b5cfc7f5-9p98v 1/1 Running 0 100s cattle-system rancher-66b5cfc7f5-zs7qc 0/1 Running 1 100s ingress-nginx default-http-backend-67cf578fc4-r4cgs 1/1 Running 0 71m ingress-nginx nginx-ingress-controller-8ck28 1/1 Running 0 71m ingress-nginx nginx-ingress-controller-crw7r 1/1 Running 0 71m ingress-nginx nginx-ingress-controller-s5zkp 1/1 Running 0 71m kube-system canal-5fhpj 2/2 Running 0 71m kube-system canal-m5ww5 2/2 Running 0 71m kube-system canal-mzqkg 2/2 Running 0 71m kube-system coredns-7c5566588d-89ztq 1/1 Running 0 71m kube-system coredns-7c5566588d-xdwg6 1/1 Running 0 70m kube-system coredns-autoscaler-65bfc8d47d-pbc5t 1/1 Running 0 71m kube-system metrics-server-6b55c64f86-bfrcb 1/1 Running 0 71m kube-system rke-coredns-addon-deploy-job-npdcf 0/1 Completed 0 71m kube-system rke-ingress-controller-deploy-job-pqkpl 0/1 Completed 0 71m kube-system rke-metrics-addon-deploy-job-5nd4r 0/1 Completed 0 71m kube-system rke-network-plugin-deploy-job-cvxnv 0/1 Completed 0 71m kube-system tiller-deploy-9d74c75cf-7blmd 1/1 Running 0 18m
访问页面
由于没有DNS服务器,这里直接在windows10添加一条记录。
10.212.22.32 rancher.baidu.com
注意:这里ip地址rancher-01地址,其实,设置为rancher-02或者rancher-03都是能访问的。
访问页面
https://rancher.baidu.com
效果如下:
设置一个强密码
确定访问地址
设置中文
查看local集群
查看主机
五、负载均衡配置
登录rancher-slb节点,安装nginx
yum install -y nginx
修改nginx.conf
vi /etc/nginx/nginx.conf
完整内容如下:
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 10.212.22.32:443 max_fails=3 fail_timeout=5s; server 10.212.22.23:443 max_fails=3 fail_timeout=5s; server 10.212.20.97:443 max_fails=3 fail_timeout=5s; } server { listen 443; proxy_pass rancher_servers; } }
上面红色部分,就是核心配置。
重新加载
nginx
nginx -s reload
修改windows10的hosts记录,指向为rancher-slb节点ip
10.212.20.213 rancher.baidu.com
刷新页面,能正常访问,说明成功了。
本文参考链接:
https://blog.51cto.com/bilibili/2440304
https://blog.51cto.com/liuzhengwei521/2398244
https://www.cnblogs.com/xzkzzz/p/9995956.html
https://www.cnblogs.com/kelsen/p/10836332.html