k8s 作为容器管理系统,以其可移植性,可扩展性还有自动化的优点,在云计算领域受到越来越多的关注。 而rancher是为使用容器的公司打造的容器管理平台。Rancher 简化了使用 Kubernetes 的流程,开发者可以随处运行 Kubernetes。
Rancher 1.x 最初是为了支持多种容器编排引擎而构建的,其中包括自己的容器编排引擎 Cattle。但随着 Kubernetes 在市场上的兴起,Rancher 2.x 已经完全转向Kubernetes。Rancher 2.x 可以部署和管理在任何地方运行的 Kubernetes 集群。
本文主要介绍的是离线环境下高可用版本rancher 的安装,这里将带你一步一步完成安装。为了安装能够更顺利地进行,安装之前,需要了解以下概念。
DNS(Domain Name System)是"域名系统"的英文缩写,它的作用是将域名转换为IP地址。比如我们在浏览器中输入www.baidu.com, 但是定位服务器需要知晓服务器的IP地址。DNS通过查询本地或者远端数据库,找到域名对应的服务器IP, 返回给请求端,请求端通过IP访问到真正服务。
这里在终端中输入 nslookup www.baidu.com, 就是使用DNS查询www.baidu.com的服务器IP, 这里返回了 180.101.49.11, 180.101.49.12。
本机也有DNS 记录(windows存放在C:\Windows\System32\drivers\etc\hosts)。 client 端发起请求时,首先在本机的hosts文件中进行查询。Rancher的安装和访问必须使用域名,这个域名是安装者自定义的,为了能够顺利解析,安装者必须在hosts 文件中添加这条记录,确保服务能够访问。
官网推荐的rancher 高可用架构是,URL请求先发往负责负载均衡机器(安装有Nginx),Nginx将流量转发给集群中各个机器,实现负载均衡和高可用。
在ISO/OSI 七层模型,将网络传输过程分成七层, 每一层负责不同的功能。 http属于应用层(即第七层), 而TCP 属于第四层。所谓四层代理就是基于IP+端口的负载均衡;七层就是基于应用层信息的负载均衡。4层代理要比7层代理性能高很多,因为四层是TCP层,使用IP+端口的方式,只修改下IP地址,然后转发给后端服务器,TCP三次握手是直接和后端连接的, 而七层代理需要代理机进行与发起请求的机器TCP 连接之后,读取应用层信息再转发,性能必然有所下降,所以官网推荐的是四层转发。
正向代理: client需要server的服务,但是client不能直接找到server,于是委托中间人agent代理, 这个agent是client 委托的,而且中间过程server只知道是为agent服务,而不知道client的存在。这个代理是指为client代理。
反向代理: server想把自己的服务发布出去,让client 能够访问。但他无法直接联系client,于是委托agent 为自己代理。经过agent代理之后,client可以访问server提供的服务。client不知道是server为他提供的服务,它只知道访问agent就能使用服务。这里反向代理是指为server代理。
因为我们是为rancher 服务器代理,实现负载均衡,所以是反向代理。
http协议是互联网应用中的主要协议,但 http协议是明文传输的,一些重要敏感的信息,如密码,个人信息,使用明文传输十分不安全。因此https协议应运而生。它基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护。
https协议使用的是443端口,https工作的主要工作流程是,当用户以https协议访问某个站点的时候,服务器先用自己的私钥加密网页,然后连同本身的数字证书,一起发送给客户端。(证书是一个文本,里面记载着这个证书的签发机构,该证书所有者的相关信息,该站点服务器的公钥,以及使用证书颁发机构的私钥加密的证书信息)当客户端使用自己信任的证书颁发机构的公钥对加密的证书信息解密的时候,可以判断出该证书是否被篡改,因此可以判断出远程服务器是否是自己想要访问的服务器,实现身份验证。客户端只有验证服务器身份如果没有问题,才会进行下一步通信。
安装rancher的时候,我们也需要证书文件,因为是公司内部机器,暂时使用自签名,证书没有经过CA(证书颁发机构)认证,所以访问rancher界面时浏览器仍然会显示不安全。在生成自签名证书的时候,需要输入域名,这时候证书和域名就完成绑定。
除了以上概念,还需要了解helm,linux,docker的基本操作,这里就不一一赘述。
安排一台虚拟机,作为私有镜像仓库,我使用的是10.100.56.159这台机器。在这台机器上安装harbor。
下载harbor 拷贝至159机器,解压。
修改配置文件harbor.cfg,修改hostname 为10.100.56.159
修改配置文件,
vi /usr/lib/systemd/system/docker.service
添加两行内容,
然后重启,使得配置生效
systemctl daemon-reload
systemctl restart docker
运行harbor
./prepare
./install.sh
准备虚拟机6台,虚拟机节点无法访问互联网,但是可以互相ping通。
官网给出的架构如下:
我的安排:
rancher集群
• 10.100.56.13
• 10.100.56.17
• 10.100.56.37
• 10.100.56.43
我们首先在这几台机器上安装k8s,然后在k8s基础上安装rancher, rancher是以pod形式跑在k8s上。这也体现了高可用的特性,即使某个节点宕机,pod在k8s上是有备份的,pod可以迅速迁移到其他节点上,保证服务可用。
私有镜像节点:10.100.56.159,这台机器上安装harbor私有仓库
Nginx负载均衡节点:10.100.56.167, 因为离线环境,为方便起见,使用docker运行Nginx, 使用TCP 四层代理。
下载rke,kubectl,helm到13节点
安装k8s需要使用rke,安装完成访问k8s需要使用kubetl, 安装rancher需要使用helm,可以去github下载rke,kubectl, helm二进制文件,赋给运行权限
chmod +x rke
chmod +x kubectl
chmod +x helm
#将二进制文件添加成系统命令
sudo mv ./kubectl /usr/local/bin/kubectl
sudo mv ./rke /usr/local/bin/rke
sudo mv ./helm /usr/local/bin/helm
运行helm, kubectl , rke, 如果不提示命令不存在,则安装成功
具体命令可以按照官网。总的流程就是在一台可以访问互联网的机器上,使用官网提供脚本下载镜像,并打成压缩包,然后拷贝至离线机器。使用docker load ,docker push命令,或者使用官网提供的脚本,上传到私有仓库。最终安装所需的docker 镜像全部上传至私有仓库的rancher项目下(如下图)。
具体的命令可以参照官网,这里对可能出现的一些问题解释。
1) docker 使用
版本问题:
安装k8s时需要使用到docker,在安装k8s之前需要在各个节点安装docker, docker的版本只支持1.13以后,下图是我在安装时候遇到的版本问题
docker登录私有仓库问题:
在离线环境下,docker必须从本地仓库(10.100.56.159)拉取镜像,登录本地仓库需要设置配置文件。否则在安装k8s过程中会报错,无法连接本地仓库。
在/etc/docker文件下建立 daemon.json文件,然后里面添加内容(ip为你私有仓库的地址)输入命令,重启docker
systemctl daemon-reload
systemctl restart docker
登录docker
docker login 10.100.56.159
显示Login Succeeded表明登录成功,这样就可以从159机器上拉取docker镜像了。
#添加新用户账号
useradd rancher
#为新用户账号设置密码
passwd rancher
#为新用户账号赋予root和docker权限
usermod -a -G root rancher
usermod -a -G docker rancher
#更改 /etc/sudoers
root ALL=(ALL) ALL
### 新添加的
rancher ALL=(ALL) ALL
因为rke安装命令是在 10.100.56.13节点上操作,所以这里使用设置13节点对17,37,43节点ssh 免密登录。
#在服务器13,rancher用户要免密登录服务器17的rancher 用户
ssh-keygen -t rsa
ssh-copy-id [email protected]
完成之后可以尝试:
ssh [email protected]
如果不用输入密码就可以登录,说明设置成功
安装k8s时需要记得修改rancher-cluster.yml中~/.ssh/id_rsa 秘钥文件路径
3) 启动k8s
创建rancher-cluster.yml 文件,这个是我的配置文件
nodes:
- address: 10.100.56.13 # node air gap network IP
# internal_address: 172.31.7.22 # node intra-cluster IP
user: rancher
role: ["controlplane","worker", "etcd"]
ssh_key_path: /home/rancher/.ssh/id_rsa
- address: 10.100.56.17 # node air gap network IP
# internal_address: 172.31.7.22 # node intra-cluster IP
user: rancher
role: ["controlplane","worker", "etcd"]
ssh_key_path: /home/rancher/.ssh/id_rsa
- address: 10.100.56.37 # node air gap network IP
# internal_address: 172.31.7.22 # node intra-cluster IP
user: rancher
role: ["controlplane","worker", "etcd"]
ssh_key_path: /home/rancher/.ssh/id_rsa
- address: 10.100.56.43 # node air gap network IP
# internal_address: 172.31.7.22 # node intra-cluster IP
user: rancher
role: ["controlplane","worker", "etcd"]
ssh_key_path: /home/rancher/.ssh/id_rsa
private_registries:
- url: 10.100.56.159 # private registry url
user: viskaz
password: "*********"
is_default: true
services:
etcd:
extra_args:
auto-compaction-retention: 240 #(单位⼩时)
# 修改空间配额为$((6*1024*1024*1024)),默认2G,最⼤8G
quota-backend-bytes: '6442450944'
# ⾃动备份
## rke版本⼩于0.2.x或rancher版本⼩于v2.2.0时使⽤
snapshot: true
creation: 6h
retention: 24h
## rke版本⼤于等于0.2.x或rancher版本⼤于等于v2.2.0时使⽤(两段配置⼆选⼀)
backup_config:
enabled: true # 设置true启⽤ETCD⾃动备份,设置false禁⽤;
interval_hours: 12 # 快照创建间隔时间,不加此参数,默认5分钟;
retention: 6 # etcd备份保留份数;
### S3配置选项
s3backupconfig:
access_key: "myaccesskey"
secret_key: "myaccesssecret"
bucket_name: "my-backup-bucket"
folder: "folder-name" # 此参数v2.3.0之后可⽤
endpoint: "s3.eu-west-1.amazonaws.com"
region: "eu-west-1"
启动:
rke up --config rancher-cluster.yml
安装成功会出现以下提示:
PS: 之后如果不想在这几台机器中使用k8s, 可以用这个命令删除k8s集群(当然我们现在不要用这个命令):
rke remove --config rancher-cluster.yml
安装完成之后,会产生一个kube_config_rancher-cluster.yml文件,这个文件是访问和操作k8s集群的凭证。
验证k8s集群是否正常运行,可以看到四个节点已经全部就绪:
kubectl --kubeconfig=kube_config_rancher-cluster.yml get nodes
每次使用kubectl 命令都要带上凭证,非常麻烦, 这里配置kube-config 文件: 将文件kube_config_rancher-cluster.yml复制成: ~/.kube/config,这样就可以直接使用kubectl命令,而不要带上参数 --kubeconfig=kube_config_rancher-cluster.yml
具体的命令可以参考官网,主要是对几个可能出现的问题进行解释
1) 证书设置
安装时需要配置ssl证书文件,自己用openssl命令生成的证书,容易出错,导致安装失败,这里给出解答,官网给了脚本一键生成,但是写在一个不容易发现的位置。 脚本生成证书的时候,输入的域名是www.ranchertest.cn, 这个可以由用户自定义。
然后初始化helm,打包Rancher Charts模板,离线安装rancher。安装rancher的时候,使用我们刚刚得到的证书, tls.crt和tls.key。
安装最后一步命令,设置rancher 域名是:www.helmtest.cn , 和证书绑定的域名是一样的
安装完可以检查一下rancher 是否正常运行
kubectl -n cattle-systemget pods
2) 本地DNS设置
在客户端设置dns 记录,我是用公司电脑访问内网,设置windows dns记录(修改C:\Windows\System32\drivers\etc\hosts)
添加记录:10.100.56.167 www.ranchertest.cn
这里的dns记录是指向167主机的,就是四层代理主机,167机器运行了nginx,会自动将流量转达rancher 集群
3) nginx 反向代理
Nginx 需要使用1.14, 或者1.15 版本(这两个版本经过测试)最新的版本可能无法和k8s上的ingress适配导致流量转发失败。我之前使用的latest版本一直无法转发,
URL 请求发送到167节点, 167 节点上运行着Nginx,转发流量到后端节点的ingress,实现负载均衡。
创建nginx.conf 文件:
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
stream {
upstream rancher_servers_http {
least_conn;
server 10.100.56.13:80 max_fails=3 fail_timeout=5s;
server 10.100.56.17:80 max_fails=3 fail_timeout=5s;
server 10.100.56.37:80 max_fails=3 fail_timeout=5s;
server 10.100.56.43:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass rancher_servers_http;
}
upstream rancher_servers_https {
least_conn;
server 10.100.56.13:80 max_fails=3 fail_timeout=5s;
server 10.100.56.17:80 max_fails=3 fail_timeout=5s;
server 10.100.56.37:80 max_fails=3 fail_timeout=5s;
server 10.100.56.43:80 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers_https;
}
}
将文件复制到/etc/nginx/nignx.conf,
这里可以看见配置中转发了80和443端口的流量,对应http和https,使用docker 运行nginx容器:
docker run -d --restart=unless-stopped -p 80:80 -p 443:443 \
-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf \
nginx:1.15
我这里我使用的是1.15版本nginx。
最后在浏览器中输入域名:www.rancheretest.cn,成功访问
5. 后续工作安排
后面一步的工作是使用rancher搭建和管理k8s集群,利用rancher的UI界面,简化k8s部署流程,并可以时刻监控k8s状态。
参考
下面是一些链接是我在安装过程中遇到了问题,在网上找到了一些资料参考,希望对你们安装有所帮助。
• 自定义ca,并使用该ca签署证书
• docker在harbor 仓库上推拉镜像
• docker二进制安装
• 什么是ingress
• 七层代理和tcp四层代理区别
• ssh密登录设置
• 正向代理和反向代理的基本原理