企业级rancher搭建Kubernetes(采用rancher管理平台搭建k8s)
一、简介
Rancher简介
来源官方:https://www.cnrancher.com/
Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。
Rancher由以下四个部分组成:
1.1、基础设施编排
Rancher可以使用任何公有云或者私有云的Linux主机资源。Linux主机可以是虚拟机,也可以是物理机。Rancher仅需要主机有CPU,内存,本地磁盘和网络资源。从Rancher的角度来说,一台云厂商提供的云主机和一台自己的物理机是一样的。
Rancher为运行容器化的应用实现了一层灵活的基础设施服务。Rancher的基础设施服务包括网络, 存储, 负载均衡, DNS和安全模块。Rancher的基础设施服务也是通过容器部署的,所以同样Rancher的基础设施服务可以运行在任何Linux主机上。
1.2、容器编排与调度
很多用户都会选择使用容器编排调度框架来运行容器化应用。Rancher包含了当前全部主流的编排调度引擎,例如Docker Swarm, Kubernetes, 和Mesos。同一个用户可以创建Swarm或者Kubernetes集群。并且可以使用原生的Swarm或者Kubernetes工具管理应用。
除了Swarm,Kubernetes和Mesos之外,Rancher还支持自己的Cattle容器编排调度引擎。Cattle被广泛用于编排Rancher自己的基础设施服务以及用于Swarm集群,Kubernetes集群和Mesos集群的配置,管理与升级。
1.3、应用商店
Rancher的用户可以在应用商店里一键部署由多个容器组成的应用。用户可以管理这个部署的应用,并且可以在这个应用有新的可用版本时进行自动化的升级。Rancher提供了一个由Rancher社区维护的应用商店,其中包括了一系列的流行应用。Rancher的用户也可以创建自己的私有应用商店。
1.4、企业级权限管理
Rancher支持灵活的插件式的用户认证。支持Active Directory,LDAP, Github等 认证方式。 Rancher支持在环境级别的基于角色的访问控制 (RBAC),可以通过角色来配置某个用户或者用户组对开发环境或者生产环境的访问权限。
下图展示了Rancher的主要组件和功能:
Kubernetes简介
1.1 基础概念
Kubernetes(通常写成“k8s”)Kubernetes是Google开源的容器集群管理系统。其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应用容器可运营的平台。Kubernetes通常结合docker容器工具工作,并且整合多个运行着docker容器的主机集群,Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
功能特性:
-
自动化容器部署与复制
-
随时扩展或收缩容器规模
-
组织容器成组,提供容器间的负载均衡
-
快速更新及回滚容器版本
-
提供弹性伸缩,如果某个容器失效就进行替换
1.2 架构图
1.3 组件
1.3.1 Master
Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd
-
APIServer:APIServer负责对外提供RESTful的Kubernetes API服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给APIServer处理后再提交给etcd。如架构图中所示,kubectl(Kubernetes提供的客户端工具,该工具内部就是对Kubernetes API的调用)是直接和APIServer交互的。
-
schedule:scheduler的职责很明确,就是负责调度pod到合适的Node上。如果把scheduler看成一个黑匣子,那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定,即将这个pod部署到这个Node上。Kubernetes目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。
-
controller manager:如果说APIServer做的是“前台”的工作的话,那controller manager就是负责“后台”的。每个资源一般都对应有一个控制器,而controller manager就是负责管理这些控制器的。比如我们通过APIServer创建一个pod,当这个pod创建成功后,APIServer的任务就算完成了。而后面保证Pod的状态始终和我们预期的一样的重任就由controller manager去保证了。
-
etcd:etcd是一个高可用的键值存储系统,Kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。
1.3.2 Node
每个Node节点主要由三个模块组成:kubelet、kube-proxy、runtime。
runtime指的是容器运行环境,目前Kubernetes支持docker和rkt两种容器。
-
kube-proxy:该模块实现了Kubernetes中的服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响。另外kube-proxy还支持session affinity。
-
kubelet:Kubelet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上面的所有容器,但是如果容器不是通过Kubernetes创建的,它并不会管理。本质上,它负责使Pod得运行状态与期望的状态一致。
1.3.3 Pod
Pod是k8s进行资源调度的最小单位,每个Pod中运行着一个或多个密切相关的业务容器,这些业务容器共享这个Pause容器的IP和Volume,我们以这个不易死亡的Pause容器作为Pod的根容器,以它的状态表示整个容器组的状态。一个Pod一旦被创建就会放到Etcd中存储,然后由Master调度到一个Node绑定,由这个Node上的Kubelet进行实例化。
每个Pod会被分配一个单独的Pod IP,Pod IP + ContainerPort 组成了一个Endpoint。
1.3.4 Service
Service其功能使应用暴露,Pods 是有生命周期的,也有独立的 IP 地址,随着 Pods 的创建与销毁,一个必不可少的工作就是保证各个应用能够感知这种变化。这就要提到 Service 了,Service 是 YAML 或 JSON 定义的由 Pods 通过某种策略的逻辑组合。更重要的是,Pods 的独立 IP 需要通过 Service 暴露到网络中。
二、准备工作
2.1、系统环境
下面两个节点都要配置
2.2、检查hosts--配置后检查是否能解析外网
192.168.56.129 master
192.168.56.130 slave1
2.3、暂时关闭防火墙和seLinux
2.4、开启IPV4转发
在/etc/sysctl.conf新添加如下参数
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
生效命令:
[root@master ~]# sysctl -p
查看
[root@master ~]# sysctl -a|grep "ip_forward"
2.5、关闭Swap交换分区
2.6、安装Docker1.12.6版本
什么版本的Docker才能适配Rancher和Kubernetes
请参考:http://rancher.com/docs/rancher/v1.6/zh/hosts/#docker
1)执行命令:
[root@master ~]# mkdir -p ~/_src
[root@master ~]# cd ~/_src/
[root@master _src]# wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.12.6-1.el7.centos.noarch.rpm
[root@master _src]# wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.12.6-1.el7.centos.x86_64.rpm
[root@master _src]# wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-debuginfo-1.12.6-1.el7.centos.x86_64.rpm
安装
[root@master _src]# yum localinstall -y docker-engine-selinux-1.12.6-1.el7.centos.noarch.rpm docker-engine-1.12.6-1.el7.centos.x86_64.rpm docker-engine-debuginfo-1.12.6-1.el7.centos.x86_64.rpm
2)启动
[root@master ~]# systemctl enable docker
[root@master ~]# systemctl start docker
3)查看版本
[root@master ~]# docker version
2.7、设置Docker镜像加速
此时如果用docker pull命令下载镜像,本地会连接hub.docker.com网站去下载,耗时较长,因此我们可以设置docker镜像加速,使得本地连接去国内镜像仓库下载,镜像加速的设置有很多种,本章以阿里云的设置为例,步骤如下:
1)创建目录:
[root@master ~]# mkdir /etc/docker
2)设置镜像仓库地址:
tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://xwx6wxd1.mirror.aliyuncs.com"] }EOF
3)重新加载配置:
[root@master ~]# systemctl daemon-reload
4)重启服务
[root@master ~]# systemctl restart docker.service
备注:slave1节点操作一致
三、安装rancher
官方安装文档:https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/
3.1、在master机器执行以下命令,即可安装rancher:
[root@master ~]# docker run -d --restart always --name rancher-server -p 8080:8080 rancher/server:v1.6.11-rc3 && docker logs -f rancher-server
报错如下:
参考地址:https://blog.csdn.net/shida_csdn/article/details/79376761
[root@master ~]# pkill docker #终止进程
[root@master ~]# iptables -t nat -F #清空nat表的所有链
[root@master ~]# ifconfig docker0 down #停止docker默认网桥
[root@master ~]# brctl delbr docker0 #删除网桥
[root@master ~]# systemctl restart docker #重启docker
查看即可
3.2、在浏览器访问http://192.168.56.129:8080,可以看到初始页面,在页面的右下角选择“简体中文”后,页面如下所示:
至此,rancher安装成功,接下来就是kubernetes的搭建工作。
3.3、配置环境模板
1)、环境配置---“Default”选择“环境管理”,如图
2)添加环境模块
输入项目名:k8s-TempLate
如下图,下拉菜单只有一个选择,请选中
上图四个红框填入的内容如下表所示:
3)将页面拖动到最底部,点击“设置”按钮,如下图:
4)再将页面拖动到最底部,点击“创建”按钮,如下图:
这样我们就完成了环境模板的配置,这里面的参数帮助rancher寻找国内的镜像仓库,从而避免了无法从google仓库下载镜像的问题,在以往这个问题是通过上网来解决的;
3.4、创建Kubernetes
1)点击“创建环境”按钮,如下图红框:
2)在创建环境的页面中,输入新的环境的名称:master-k8s,选择我们刚才创建的环境模板,在点击底部的“创建”按钮,如下图:
3)如下图红框所示,在左上角位置选择刚刚创建的环境,可以看到目前环境已经OK,正在等待node的加入:
至此,Kubernetes的master已经搭建完毕!!!!
3.5、添加节点——将机器加入到K8S环境
1)master机器的IP是192.168.56.129,所以在浏览器打开地址192.168.56.129:8080,左上角选择新增的环境,可以看到如下图的页面,点击红框中的“添加主机”:
2)如下图,在页面上确认红框中的IP地址是不是你的master机器对外暴露的地址(多网卡的机器要关注),确认无误后点击“保存” .
3)如下图,点击红框按钮,会将此按钮左侧的文本信息复制下来:
4)登录slave1节点,执行上面复制下来的命令,该命令会先下载docker镜像,然后启动容器去加入到K8S环境,此时再去刷新管理页面,见到如下图所示,已经感知到机器的加入,开始接下来的一系列操作,此时请耐心等待(等待时间比较,喝杯茶再回来):
有可能节点获取不到东西,建议检查一下安全规则(防火墙、转发、selinux),配置后重启即可
5)节点加入成功后,页面如下图所示,点击红框中的按钮就进入了K8S的dashboard:
报Service unavailable错误:等待十分钟左右即可,启动接口有点慢
下文安装kubectl装好之后,在控制台用kubectl describe命令查看dashbroad的pod和service的执行进度,查看错误日志。
至此,我们已经完成了节点机器加入K8S环境的操作,接下来我们快速体验在K8S环境创建Pod和Service的操作;
体验K8S环境
1)创建一个文件tomcat.yaml,内容如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat001
spec:
replicas: 1
template:
metadata:
labels:
name: tomcat001
spec:
containers:
- name: tomcat001
image: tomcat:7.0.82-jre7
tty: true
ports:
- containerPort: 8080
2)在dashboard页面上传这个tomcat.yaml文件,操作如下图所示:
3)等镜像下载和容器创建成功后,在dashboard的部署页面可以看到tomcat001的部署情况,如下图
4)创建一个文件tomcat-svc.yaml,内容如下:
apiVersion: v1
kind: Service
metadata:
name: tomcat001
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30018
selector:
name: tomcat001
5)如同上个步骤,上传后在dashboard的“服务”页面查看
6)通过业务节点slave1的IP地址访问
3.5、安装kubectl工具
1)下载kubectl工具
有两种下载方式,您可以选择其中任意一种:
(1)在我的GitHub下载,地址是:https://github.com/zq2599/blog_demos/blob/master/k8s_tools/kubectl/linux/kubectl.zip,在这个页面点击”download”按钮即可下载,下载后记得解压;
(2)在linux机器上执行以下命令下载:
# curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
2)设置工具
(1)kubectl文件上传到linux机器后,授权
# chmod +x kubectl
(2)将kubectl移动到可以全局访问的目录下
# mv ./kubectl /usr/local/bin/
(3)测试,任意目录执行一下语句
工具已经准备好,接下来我们把配置做好,使得kubectl可以连接到K8S上执行命令;
3)配置参数
(1)在rancher的管理页面上,点击下图红框1中的”CLI”,在出现的页面中点击红框2中的”生成配置“:
(2)如下图,点击红框中的”复制到剪切板“,将按钮上方的配置信息复制下来:
(3)创建文件,复制上面的参数
# mkdir ~/.kub
(4)查看进程服务
# kubectl get service -a -o wide --all-namespaces
到此,部署完毕!!!!
问题来了,每次访问rancher直接进入了管理平台,一点安全性可言都没有,下来我们来设置“系统管理”
四、账号安全设置
4.1、日志审计
只有管理员用户有权限访问审计日志。审计日志在系统管理->审计日志。
Rancher的审计日志是不同事件类型的集合:
(1)任何带有前缀api的事件是API的一次调用。事件类型将记录API操作,谁执行的操作以及API调用的方式(即通过UI,通过API密钥)。
(2)何没有带api前缀的事件都是Rancher Server做的事情。例如,在协调服务的容器期间,在实例创建时会产生一个instance.create事件。
4.2、账号设置
编辑“环境管理”---master-k8s
4.3、访问控制
用户在访问你的Rancher服务之前,需要进行身份认证。同时,只有拥有合法的API密钥才能使用Rancher API。
(1)活动目录
选择活动目录图标。 如果你想要通过TLS来使用活动目录,请确保你已经使用了相应的证书来启动Rancher Server。填写相关信息后,通过点击身份认证进行认证校验。 当活动目录认证成功后,你将自动以已认证的用户名身份登录。并且把你的账号设置为了管理员权限。
(2)Azure AD 验证
选择Azure AD图标。 填写相应信息并单击Azure认证进行认证校验。 当认证成功后,你将自动以已认证的用户名身份登录。并且把你的账号设置为了管理员权限。
(3)GitHub
选择GitHub图标,并按照用户界面中的说明将Rancher注册为GitHub应用程序。 点击使用GitHub进行身份认证后,当认证成功后,你将自动以已认证的Github账号登录。并且把你的账号设置为了管理员权限。
(4)local
选择本地图标。 通过提供登录用户名,全名和密码来创建管理员用户。 点击启用本地认证来启用本地身份认证。 通过单击此按钮,管理员用户将被创建并保存在数据库中。这时你将自动用刚刚创建的管理员帐户登录到Rancher服务。
(5)OpenLDAP
填写对应信息后,通过点击身份认证进行认证校验。当OpenLDAP认证成功后,你将自动以已认证的用户名身份登录。并且把你的账号设置为了管理员权限。
(6)Shibboleth
选择Shibboleth图标。 填写Shibboleth帐户的配置信息,点击保存保存信息,然后点击测试来测试访问控制是否正常工作。
在使用Shibboleth时,你应该注意一些已知的问题:
(1)不支持搜索或查找功能。 在添加用户时,请确保输入的用户ID是准确的,这样才能保证用户被添加成功。
(2)当添加用户到一个环境时, 不支持组ID,除非管理员是该组的成员之一。
功能模块比较复杂,后续补充。。。。。